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