数学建模 --- 图类问题:计算最短路径 与 在某个距离范围内的点

计算最短路径问题视频

图论最短距离(Shortest Path)算法动画演示-Dijkstra(迪杰斯特拉)和Floyd(弗洛伊德)

画图

在线画图

画图网址(有向图与无向图)
在这里插入图片描述

matlab画图
  1. 无向图
G = graph(s,t,w);

% 如果没有权重时
plot(G);

% 如果有权重时
plot(G,'EdgeLabel',G.Edges.Weight)

% 画图后不显示坐标
set(gca,'XTick',[],'YTick','[]');
  • s,t 图边的两端点的构成的向量
  • w为对应边的权重
s = [5 2 3 4 1];
t = [1 3 4 5 2];
w = [5 2 3 4 1];
names = {
    
    'A' 'B' 'C' 'D' 'E'};
G = graph(s,t,w,names);
plot(G,'EdgeLabel',G.Edges.Weight);

在这里插入图片描述

  1. 有向图
G = digraph(s,t,w);

% 如果没有权重时
plot(G);

% 如果有权重时
plot(G,'EdgeLabel',G.Edges.Weight)


set(gca,'XTick',[],'YTick','[]');
  • s,t 图边的两端点的构成的向量
  • w为对应边的权重

在这里插入图片描述

Matlab图节点的编号最好从1开始

Dijkstra算法缺点

不可以用于处理负权重的图

  • 贝尔曼-福特(Bellman-Ford)算法可以

Matlab计算最短路径

[P,d] = shortestpath(G,start,end,[,'Method',algorithm]);
  • 功能: 返回从start到end的最短路径
  • 输入参数:
    1) G: 为graph对象 | digraph对象
    2) start起始的结点
    3) end目标结点
    4) [,‘Method’,algorithm]: 可选的参数,表示使用的算法
    在这里插入图片描述
  • 输出参数:
    P: 最短路径经过的结点
    d: 最短距离

最短路径高亮

% 编号最好是从1开始连续编号,不要自己随便定义编号
s = [9 9 1 1 2 2 2 7 7 6 6  5  5 4];
t = [1 7 7 2 8 3 5 8 6 8 5  3  4 3];
w = [4 8 3 8 2 7 4 1 6 6 2 14 10 9];
G = graph(s,t,w);
plot(G, 'EdgeLabel', G.Edges.Weight, 'linewidth', 2); 
% 画图后不显示坐标
set( gca, 'XTick', [], 'YTick', [] );  

[P,d] = shortestpath(G, 9, 4)  %注意:该函数matlab2015b之后才有哦

% 在图中高亮我们的最短路径
myplot = plot(G, 'EdgeLabel', G.Edges.Weight, 'linewidth', 2);  %首先将图赋给一个变量
highlight(myplot, P, 'EdgeColor', 'r')   %对这个变量即我们刚刚绘制的图形进行高亮处理(给边加上r红色)

返回任意两点最短距离

D = distances(G,[,'Method',algorithm]);

找出给定范围内的所有的点

[nodeIDs,dist] = nearest(G,s,d,[,'Method',algorithm])

在这里插入图片描述


参考资料:数学建模清风视频

猜你喜欢

转载自blog.csdn.net/qq_43779658/article/details/107871436