数模 03图论Dijkstra and Floyd matlab 及 软件使用
Dijkstra算法
迪杰斯特拉算法是由荷兰计算机科学家狄克斯特拉于1959 年提出的,因此又叫狄克斯特拉算法。是从一个顶点到其余各顶点的最短路径算法,解决的是有向图中最短路径问题。迪杰斯特拉算法主要特点是以起始点为中心向外层层扩展,直到扩展到终点为止。
此算法求的是两点间的最短路径,注意,得先画出带权邻接矩阵:
[0 2 8 1 Inf Inf Inf Inf Inf Inf Inf;
2 0 6 Inf 1 Inf Inf Inf Inf Inf Inf;
8 6 0 7 5 1 2 Inf Inf Inf Inf;
1 Inf 7 0 Inf Inf 9 Inf Inf Inf Inf;
Inf 1 5 Inf 0 3 Inf 2 9 Inf Inf;
Inf Inf 1 Inf 3 0 4 Inf 6 Inf Inf;
Inf Inf 2 9 Inf 4 0 Inf 3 1 Inf;
Inf Inf Inf Inf 2 Inf Inf 0 7 Inf 9;
Inf Inf Inf Inf 9 6 3 7 0 1 2;
Inf Inf Inf Inf Inf Inf 1 Inf 1 0 4;
Inf Inf Inf Inf Inf Inf Inf 9 2 4 0;]
[0 8 Inf Inf Inf Inf 7 8 Inf Inf Inf;
Inf 0 3 Inf Inf Inf Inf Inf Inf Inf Inf;
Inf Inf 0 5 6 Inf 5 Inf Inf Inf Inf;
Inf Inf Inf 0 1 Inf Inf Inf Inf Inf 12;
Inf Inf 6 Inf 0 2 Inf Inf Inf Inf 10;
Inf Inf Inf Inf 2 0 9 Inf 3 Inf Inf;
Inf Inf Inf Inf Inf 9 0 Inf Inf Inf Inf;
8 Inf Inf Inf Inf Inf Inf 0 9 Inf Inf;
Inf Inf Inf Inf 7 Inf Inf 9 0 2 Inf;
Inf Inf Inf Inf Inf Inf Inf Inf 2 0 2;
Inf Inf Inf Inf 10 Inf Inf Inf Inf Inf 0;];
至于具体算法在数据结构课程中已经了解到了,下面直接给出matlab实操过程。
主程序
weight= [0 2 8 1 Inf Inf Inf Inf Inf Inf Inf;
2 0 6 Inf 1 Inf Inf Inf Inf Inf Inf;
8 6 0 7 5 1 2 Inf Inf Inf Inf;
1 Inf 7 0 Inf Inf 9 Inf Inf Inf Inf;
Inf 1 5 Inf 0 3 Inf 2 9 Inf Inf;
Inf Inf 1 Inf 3 0 4 Inf 6 Inf Inf;
Inf Inf 2 9 Inf 4 0 Inf 3 1 Inf;
Inf Inf Inf Inf 2 Inf Inf 0 7 Inf 9;
Inf Inf Inf Inf 9 6 3 7 0 1 2;
Inf Inf Inf Inf Inf Inf 1 Inf 1 0 4;
Inf Inf Inf Inf Inf Inf Inf 9 2 4 0;];
[dis, path]=dijkstra(weight,1, 11)
在主程序中的weight即为需要自行填写的带权邻接矩阵,dijkstra(weight,1, 11)表示求的是1到11的最短路径
迪杰斯特拉算法程序
function [min,path]=dijkstra(w,start,terminal)
n=size(w,1); label(start)=0; f(start)=start;
for i=1:n
if i~=start
label(i)=inf;
end, end
s(1)=start; u=start;
while length(s)<n
for i=1:n
ins=0;
for j=1:length(s)
if i==s(j)
ins=1;
end,
end
if ins==0
v=i;
if label(v)>(label(u)+w(u,v))
label(v)=(label(u)+w(u,v));
f(v)=u;
end,
end,
end
v1=0;
k=inf;
for i=1:n
ins=0;
for j=1:length(s)
if i==s(j)
ins=1;
end,
end
if ins==0
v=i;
if k>label(v)
k=label(v); v1=v;
end,
end,
end
s(length(s)+1)=v1;
u=v1;
end
min=label(terminal); path(1)=terminal;
i=1;
while path(i)~=start
path(i+1)=f(path(i));
i=i+1 ;
end
path(i)=start;
L=length(path);
path=path(L:-1:1);
然后在命令行输入主程序保存的文件名,这里我保存的是tulun1,输出:
dis为最短路径长度,path表示最短路径经过的点。
Floyd算法
Floyd算法又称为插点法,是一种利用动态规划的思想寻找给定的加权图中多源点之间最短路径的算法,与Dijkstra算法类似。该算法名称以创始人之一、1978年图灵奖获得者、斯坦福大学计算机科学系教授罗伯特·弗洛伊德命名。
直接程序加使用方法吧,在数据结构里面学过了,算法过程不再赘述
matlab主程序
a= [ 0,50,inf,40,25,10;
50,0,15,20,inf,25;
inf,15,0,10,20,inf;
40,20,10,0,10,25;
25,inf,20,10,0,55;
10,25,inf,25,55,0];
[D, path]=floyd(a)
floyd算法程序
function [D,path,min1,path1]=floyd(a,start,terminal)
D=a;n=size(D,1);path=zeros(n,n);
for i=1:n
for j=1:n
if D(i,j)~=inf
path(i,j)=j;
end,
end,
end
for k=1:n
for i=1:n
for j=1:n
if D(i,k)+D(k,j)<D(i,j)
D(i,j)=D(i,k)+D(k,j);
path(i,j)=path(i,k);
end,
end,
end,
end
if nargin==3
min1=D(start,terminal);
m(1)=start;
i=1;
path1=[ ];
while path(m(i),terminal)~=terminal
k=i+1;
m(k)=path(m(i),terminal);
i=i+1;
end
m(i+1)=terminal;
path1=m;
end
举例的话用另外一个举例吧:
[0 8 Inf Inf Inf Inf 7 8 Inf Inf Inf;
Inf 0 3 Inf Inf Inf Inf Inf Inf Inf Inf;
Inf Inf 0 5 6 Inf 5 Inf Inf Inf Inf;
Inf Inf Inf 0 1 Inf Inf Inf Inf Inf 12;
Inf Inf 6 Inf 0 2 Inf Inf Inf Inf 10;
Inf Inf Inf Inf 2 0 9 Inf 3 Inf Inf;
Inf Inf Inf Inf Inf 9 0 Inf Inf Inf Inf;
Inf Inf Inf Inf Inf Inf 0 9 Inf Inf;
Inf Inf Inf Inf 7 Inf Inf 9 0 2 Inf;
Inf Inf Inf Inf Inf Inf Inf Inf 2 0 2;
Inf Inf Inf Inf 10 Inf Inf Inf Inf Inf 0;];
输出:
其中如果要找1到11的,先找path的(1,11)显示为8,所以找(8,11)显示为9,找(9,11)为10.。。。最后得到最短路径为1,8,9,10,11。距离分别将d矩阵相应数值加起来即可。
下面利用上面的知识,迪杰斯特拉算法验证结果
结果相同。
图论软件操作
ps:需要软件请留言
进入软件:
随机画上几个节点:
连线结果如图:
可以填入相应的费用和容量,可以类比运筹学中的最小费用流
至于其他概念在此不做赘述,比如二部图、完全偶图、星、环、连杆、重边等概念
只填入费用就相当于带权的图,可以求最短路径以及最小生成树
可以指定起点与终点,有向与无向
如果指定容量后还可以求拓扑排序、关键排序、最大流、最大流最小费用流。
ps:有需求请留言,还可以一起交流其他问题
相关文章
- Matlab中ind2rgb函数用法
- Matlab中readtable用法
- 【NSCT+GRNN网络】基于NSCT变换和GRNN神经网络的无参考图像质量检测算法的MATLAB仿真
- 【MATLAB教程案例97】基于GA遗传优化的CNN卷积神经网络最优训练参数搜索matlab仿真
- 【MATLAB教程案例93】在MATLAB中通过mex将C语言转化为matlab可执行的mexw64文件
- 【MATLAB教程案例85】通过matlab实现有限差分法求解微分方程
- 【MATLAB教程案例67】基于Actor-Critic结构强化学习的车杆平衡控制系统matlab仿真
- 【MATLAB教程案例58】使用matlab实现yolov2网络目标检测功能与仿真分析
- 【MATLAB教程案例52】SVM支持向量机学习——使用matlab实现基于SVM的数据二分类
- 【MATLAB教程案例37】语音信号的端点检测方法matlab仿真学习——ZCR过零法,双门限法
- 【MATLAB教程案例33】基于高斯混合模型的视频背景提取算法的matlab仿真实现
- 【MATLAB教程案例30】基于MATLAB的图像阴影检测和消除算法的实现
- 【MATLAB教程案例25】常用图像变换域的matlab仿真分析——DFT频域,DCT域,小波域等
- 【MATLAB教程案例17】基于NSGAII多目标优化算法的matlab仿真及应用
- 【MATLAB教程案例14】基于ACO蚁群优化算法的函数极值计算matlab仿真及其他应用
- 【MATLAB教程案例8】基于LS算法的OFDM调制解调系统信道估计和均衡算法的matlab仿真
- 【FPGA教程案例94】机器学习1——基于FPGA的SVM支持向量机二分类系统实现之理论和MATLAB仿真
- 基于CMAC小脑模型的数据训练和预测matlab仿真
- 双边带调幅DSB-SC和解调的matlab仿真
- 基于RBF网络的信任值预测算法matlab仿真实现
- 基于BP神经网络和ORL库的人脸识别matlab仿真
- 【CUDA7.5】MATLAB中配置Win7+Matlab R2015b+CUDA7.5+vs2013配置方法
- MATLAB中用imfilter()对图像进行相关或卷积运算前一定要用tofloat()或im2double()将数据类型转换为浮点型
- 在matlab和opencv中分别实现稀疏表示
- 《数字图像处理与机器视觉——Visual C++与Matlab实现(第2版)》——2.2 MATLAB图像类型及其存储方式
- 【Matlab算法】MATLAB求解背包问题(附MATLAB代码)
- Matlab ------ 打开MATLAB,设置默认打开的文件夹
- Matlab函数之Plot函数
- 三、Matlab 之 script编写
- matlab常用函数——软件常用函数
- MATLAB绘图功能
- MATLAB画图