MATLAB

文章介绍了几种解决图中两点间最短路径问题的算法,包括Dijkstra算法和Floyd算法,以及在网络优化中的应用。同时,提到了构建最小生成树的Prim算法和Kruskal算法。此外,还展示了一个Fleury算法的例子,用于寻找Euler回路。
摘要由CSDN通过智能技术生成

最短路径

最短路问题是重要的优化问题之一,它不仅可以直接应用于解决生产实际的许多问题,如管道铺设、线路安排、厂区布局、设备更新等,而且经常被作为一个基本工具,用于解决其他的优化问题。
最短路径的一般提法为:设G=(V,E)为连通图,图中各边(v,4)有权1,(j = +∞表示Vi,Vj之间没有边),Vs,Vt为图中任意两点,求一条路μ,使它为从v到的所有路中总权最短即:在这里插入图片描述

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

在这里插入图片描述

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

%图与网络%
%最短距离v1到个顶点的最短距离%
% a=zeros(8);
% a(1,2)=3;a(1,3)=5;a(1,4)=6;
% a(2,5)=7;a(2,6)=4;a(2,3)=1;
% a(3,6)=2;a(3,4)=1;
% a(4,6)=3;a(4,7)=5; a(5,8)=6;
% a(6,5)=2;a(6,8)=9;a(6,7)=1;
% a(7,8)=5;
% a=a+a';
% a(find(a==0))=inf;%无直接连接的距离inf
% pb(1:length(a))=0;
% pb(1)=1;index1=1;index2=ones(1,length(a));
% d(1:length(a))=inf;d(1)=0;temp=1;
% while sum(pb)<length(a) tb=find(pb==0);
% d(tb)=min(d(tb),d(temp)+a(temp,tb));
% tmpb=find(d(tb)==min(d(tb))); temp=tb(tmpb(1));
% pb(temp)=1;
% index1=[index1,temp]; temp2=find(d(index1)==d(temp)-a(temp,index1));
% index2(temp)=index1(temp2(1));
% end
% [d' index1' index2']
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%%%%%%c1到各城市飞行的最小费用%%%%%%%%%%%%
% clear;
% clc;
% a=zeros(6);
% a(1,2)=50;a(1,4)=40;a(1,5)=25;a(1,6)=10; a(2,3)=15;a(2,4)=20;a(2,6)=25;
% a(3,4)=10;a(3,5)=20;
% a(4,5)=10;a(4,6)=25; a(5,6)=55;
% a=a+a';
% a(find(a==0))=inf; pb(1:length(a))=0;pb(1)=1;index1=1;index2=ones(1,length(a));
% d(1:length(a))=inf;d(1)=0;temp=1;
% while sum(pb)<length(a) tb=find(pb==0);
% d(tb)=min(d(tb),d(temp)+a(temp,tb));
% tmpb=find(d(tb)==min(d(tb))); temp=tb(tmpb(1));
% pb(temp)=1;
% index1=[index1,temp]; temp2=find(d(index1)==d(temp)-a(temp,index1));
% index2(temp)=index1(temp2(1));
% end
% [d' index1' index2']
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%%%%%%%%%%%%%floyd算法弗洛伊德算法%%%%%
% clear;clc;
% n=6; a=zeros(n);
% a(1,2)=50;a(1,4)=40;a(1,5)=25;a(1,6)=10;
% a(2,3)=15;a(2,4)=20;a(2,6)=25; a(3,4)=10;a(3,5)=20;
% a(4,5)=10;a(4,6)=25; a(5,6)=55;
% a=a+a'; M=max(max(a))*n^2; %M为充分大的正实数
% a=a+((a==0)-eye(n))*M;
% path=zeros(n);
% for k=1:n
%  for i=1:n
%  for j=1:n
%  if a(i,j)>a(i,k)+a(k,j)
%  a(i,j)=a(i,k)+a(k,j);
%  path(i,j)=k;
%  end
%  end
%  end
% end
% a, path
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%%%%%%最小生成树prim算法%%%%%%%
% clc;clear;
% a=zeros(7);
% a(1,2)=50; a(1,3)=60;
% a(2,4)=65; a(2,5)=40;
% a(3,4)=52;a(3,7)=45;
% a(4,5)=50; a(4,6)=30;a(4,7)=42;
% a(5,6)=70; 
% a=a+a';a(find(a==0))=inf;
% result=[];p=1;tb=2:length(a);
% while length(result)~=length(a)-1
%  temp=a(p,tb);temp=temp(:);
%  d=min(temp);
%  [jb,kb]=find(a(p,tb)==d);
%  j=p(jb(1));k=tb(kb(1));
%  result=[result,[j;k;d]];p=[p,k];tb(find(tb==k))=[];
% end
% result
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%%%%%%%科茹斯克尔(Kruskal)算法%%%%%
% clc;clear; 
% a(1,2)=50; a(1,3)=60; a(2,4)=65; a(2,5)=40; 
% a(3,4)=52;a(3,7)=45; a(4,5)=50; a(4,6)=30; 
% a(4,7)=42; a(5,6)=70; 
% [i,j,b]=find(a); 
% data=[i';j';b'];index=data(1:2,:); 
% loop=max(size(a))-1; 
% result=[]; 
% while length(result)<loop 
%  temp=min(data(3,:)); 
%  flag=find(data(3,:)==temp); 
%  flag=flag(1); 
%  v1=data(1,flag);v2=data(2,flag); 
%  if index(1,flag)~=index(2,flag) 
%  result=[result,data(:,flag)]; 
%  end 
%  index(find(index==v2))=v1; 
%  data(:,flag)=[]; 
%  index(:,flag)=[]; 
% end 
% result
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%%%%%%%Fleury 算法求Euler 回路%%%%%
function main 
clc,clear 
global a 
a=zeros(6); 
a(1,2)=56;a(1,3)=35;a(1,4)=21;a(1,5)=51;a(1,6)=60; 
a(2,3)=21;a(2,4)=57;a(2,5)=78;a(2,6)=70; 
a(3,4)=36;a(3,5)=68;a(3,6)=68; a(4,5)=51;a(4,6)=61; 
a(5,6)=13; a=a+a'; L=size(a,1); 
c1=[5 1:4 6]; 
[circle,long]=modifycircle(c1,L); 
c2=[5 6 1:4];%改变初始圈,该算法的最后一个顶点不动
[circle2,long2]=modifycircle(c2,L); 
if long2<long 
 long=long2; 
 circle=circle2; 
end 
circle,long 
%******************************************* 
%修改圈的子函数
%******************************************* 
function [circle,long]=modifycircle(c1,L);
global a 
flag=1; 
while flag>0 
 flag=0; 
 for m=1:L-3 
 for n=m+2:L-1 
 if a(c1(m),c1(n))+a(c1(m+1),c1(n+1))<... 
 a(c1(m),c1(m+1))+a(c1(n),c1(n+1)) 
 flag=1; 
 c1(m+1:n)=c1(n:-1:m+1); 
 end 
 end 
 end 
end 
long=a(c1(1),c1(L)); 
for i=1:L-1 
 long=long+a(c1(i),c1(i+1)); 
end 
circle=c1;
  • 2
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

不掉发的小刘

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值