计算最短路径问题视频
图论最短距离(Shortest Path)算法动画演示-Dijkstra(迪杰斯特拉)和Floyd(弗洛伊德)
画图
在线画图
matlab画图
- 无向图
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);
- 有向图
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])