基于matlab的floyd算法matlab计算最短路径
matlab的floyd算法

matlab的floyd算法Floyd算法,是一种图论算法,用于在加权图中求解最短路径。
它是以发明者之一、罗伯特·弗洛伊德的名字命名的。
这个算法同样被用于对于任意两点之间的最长路径(所谓的最短路径问题)进行求解。
算法描述给定一个带权的有向图G=(V,E),其权值函数为w,下面我们定义从顶点i到顶点j的路径经过的最大权值为dist(i,j)。
特别地,当i=j时,dist(i,j)=0。
为了方便描述算法,我们用D(k,i,j)表示从顶点i到顶点j且路径中的所有顶点都在集合{1,2,⋯,k}中的所有路径中,最大边权值的最小值。
则从顶点i到顶点j的最短路径的边权值就是 D(n,i,j),其中n是图中顶点的数量。
算法思想:建立中间顶点集合算法是通过不断地扩充中间顶点集合S,来求解任意两点之间的最短路径。
具体来说,设S={1, 2, ⋯, k},其中k是整数。
Floyd算法的基本思想是,依次考察所有可能的中间顶点x(即所有S中的顶点),对于每个中间顶点x,若从i到x再到j的路径比已知的路径更短,则更新dist(i,j)为更小的值D(k,i,j)。
最终,在S={1, 2, ⋯, n}的情况下,所得到的D(n,i,j)就是顶点i到顶点j之间的最短路径的长度。
Floyd算法的核心是一个三重循环,在每一轮循环中,枚举S中所有的中间顶点x,通过动态规划计算出从i到j的最短路径长度D(k,i,j)。
这一过程可表述为:for k = 1 to nfor i = 1 to nfor j = 1 to nif D(k,i)+D(j,k) < D(k,i,j)D(k,i,j) = D(k,i)+D(j,k)其中D(0,i,j)即为dist(i,j),若i和j不连通,则D(0,i,j)=+Inf。
算法实现function D = Floyd(adjmat)% adjmat为邻接矩阵邻接矩阵adjmat的定义为:- 若两个顶点之间有边相连,则对应位置为该边的边权值;- 若两个顶点之间没有边相连,则对应位置为0。
最小费用最大流问题matlab程序

下面的最小费用最大流算法采用的是“基于Floyd最短路算法的Ford和Fulkerson迭加算法”,其基本思路为:把各条弧上单位流量的费用看成某种长度,用Floyd求最短路的方法确定一条自V1至Vn的最短路;再将这条最短路作为可扩充路,用求解最大流问题的方法将其上的流量增至最大可能值;而这条最短路上的流量增加后,其上各条弧的单位流量的费用要重新确定,如此多次迭代,最终得到最小费用最大流。
本源码由GreenSim团队原创,转载请注明function [f,MinCost,MaxFlow]=MinimumCostFlow(a,c,V,s,t)%%MinimumCostFlow.m% 最小费用最大流算法通用Matlab函数%% 基于Floyd最短路算法的Ford和Fulkerson迭加算法% GreenSim团队原创作品,转载请注明%% 输入参数列表% a 单位流量的费用矩阵% c 链路容量矩阵% V 最大流的预设值,可为无穷大% s 源节点% t 目的节点%% 输出参数列表% f 链路流量矩阵% MinCost 最小费用% MaxFlow 最大流量%% 第一步:初始化N=size(a,1);%节点数目f=zeros(N,N);%流量矩阵,初始时为零流MaxFlow=sum(f(s,:));%最大流量,初始时也为零flag=zeros(N,N);%真实的前向边应该被记住for i=1:Nfor j=1:Nif i~=j&&c(i,j)~=0flag(i,j)=1;%前向边标记flag(j,i)=-1;%反向边标记endif a(i,j)==infa(i,j)=BV;w(i,j)=BV;%为提高程序的稳健性,以一个有限大数取代无穷大endendendif L(end)<BVRE=1;%如果路径长度小于大数,说明路径存在elseRE=0;end%% 第二步:迭代过程while RE==1&&MaxFlow<=V%停止条件为达到最大流的预设值或者没有从s到t的最短路%以下为更新网络结构MinCost1=sum(sum(f.*a));MaxFlow1=sum(f(s,:));f1=f;TS=length(R)-1;%路径经过的跳数LY=zeros(1,TS);%流量裕度for i=1:TSLY(i)=c(R(i),R(i+1));endmaxLY=min(LY);%流量裕度的最小值,也即最大能够增加的流量for i=1:TSu=R(i);v=R(i+1);if flag(u,v)==1&&maxLY<c(u,v)%当这条边为前向边且是非饱和边时f(u,v)=f(u,v)+maxLY;%记录流量值w(u,v)=a(u,v);%更新权重值c(v,u)=c(v,u)+maxLY;%反向链路的流量裕度更新elseif flag(u,v)==1&&maxLY==c(u,v)%当这条边为前向边且是饱和边时 w(u,v)=BV;%更新权重值c(u,v)=c(u,v)-maxLY;%更新流量裕度值w(v,u)=-a(u,v);%反向链路权重更新elseif flag(u,v)==-1&&maxLY<c(u,v)%当这条边为反向边且是非饱和边时 w(v,u)=a(v,u);c(v,u)=c(v,u)+maxLY;w(u,v)=-a(v,u);elseif flag(u,v)==-1&&maxLY==c(u,v)%当这条边为反向边且是饱和边时 w(v,u)=a(v,u);c(u,v)=c(u,v)-maxLY;w(u,v)=BV;elseendendMaxFlow2=sum(f(s,:));MinCost2=sum(sum(f.*a));if MaxFlow2<=VMaxFlow=MaxFlow2;MinCost=MinCost2;[L,R]=FLOYD(w,s,t);elsef=f1+prop*(f-f1);MaxFlow=V;MinCost=MinCost1+prop*(MinCost2-MinCost1);returnendif L(end)<BVRE=1;%如果路径长度小于大数,说明路径存在elseRE=0;endendfunction [L,R]=FLOYD(w,s,t)n=size(w,1);D=w;path=zeros(n,n);%以下是标准floyd算法for i=1:nfor j=1:nif D(i,j)~=infpath(i,j)=j;endendendfor k=1:nfor i=1:nfor j=1:nif D(i,k)+D(k,j)<D(i,j)D(i,j)=D(i,k)+D(k,j);path(i,j)=path(i,k);endendendendL=zeros(0,0);R=s;while 1if s==tL=fliplr(L);L=[0,L];returnendL=[L,D(s,t)];R=[R,path(s,t)];s=path(s,t);end(此文档部分内容来源于网络,如有侵权请告知删除,文档可自行编辑修改内容,供参考,感谢您的支持)。
Dijkstra、Floyd算法Matlab_Lingo实现

Dijkstra算法Matlab实现。
%求一个点到其他各点的最短路径function [min,path]=dijkstra(w,start,terminal)%W是邻接矩阵%start是起始点Array %terminal是终止点%min是最短路径长度%path是最短路径n=size(w,1);label(start)=0;f(start)=start;for i=1:nif i~=startlabel(i)=inf;endends(1)=start;u=start;while length(s)<nfor i=1:nins=0;forif i==s(j)ins=1;endendif ins==0v=i;if label(v)>(label(u)+w(u,v))label(v)=(label(u)+w(u,v));f(v)=u;endendendv1=0;k=inf;for i=1:nins=0;for j=1:length(s)if i==s(j)ins=1;endend-if ins==0v=i;if k>label(v)k=label(v);v1=v;endendends(length(s)+1)=v1;u=v1;endmin=label(terminal);path(1)=terminal;i=1;while path(i)~=startpath(i+1)=f(path(i));i=i+1 ;endpath(i)=start;L=length(path);path=path(L:-1:1);Floyd算法:matlab程序:%floyd算法,function [D,path,min1,path1]=floyd(a,start,terminal)%a是邻接矩阵%start是起始点%terminal是终止点%D是最小权值表D=a;n=size(D,1);path=zeros(n,n);for i=1:nfor j=1:nif D(i,j)~=infpath(i,j)=j;endendendfor k=1:nfor i=1:nfor j=1:nif D(i,k)+D(k,j)<D(i,j)-D(i,j)=D(i,k)+D(k,j);path(i,j)=path(i,k);endendendendif nargin==3min1=D(start,terminal);m(1)=start;i=1;path1=[ ];while path(m(i),terminal)~=terminalk=i+1;m(k)=path(m(i),terminal);i=i+1;endm(i+1)=terminal;path1=m;end1 6 5 5 5 66 2 3 4 4 65 2 3 4 5 45 2 3 4 5 61 4 3 4 5 11 2 4 4 1 6Floyd算法:Lingo程序:!用LINGO11.0编写的FLOYD算法如下;model:sets:nodes/c1..c6/;link(nodes,nodes):w,path; !path标志最短路径上走过的顶点;endsetsdata:path=0;w=0;@text(mydata1.txt)=@writefor(nodes(i):@writefor(nodes(j):-@format(w(i,j),' 10.0f')),@newline(1));@text(mydata1.txt)=@write(@newline(1));@text(mydata1.txt)=@writefor(nodes(i):@writefor(nodes(j):@format(path(i,j),' 10.0f')),@newline(1));enddatacalc:w(1,2)=50;w(1,4)=40;w(1,5)=25;w(1,6)=10;w(2,3)=15;w(2,4)=20;w(2,6)=25;w(3,4)=10;w(3,5)=20;w(4,5)=10;w(4,6)=25;w(5,6)=55;@for(link(i,j):w(i,j)=w(i,j)+w(j,i));@for(link(i,j) |i#ne#j:w(i,j)=@if(w(i,j)#eq#0,10000,w(i,j)));@for(nodes(k):@for(nodes(i):@for(nodes(j):tm=@smin(w(i,j),w(i,k)+w(k,j));path(i,j)=@if(w(i,j)#gt# tm,k,path(i,j));w(i,j)=tm)));endcalcend无向图的最短路问题Lingomodel:sets:cities/1..5/;roads(cities,cities):w,x;endsetsdata:w=0;enddatacalc:w(1,2)=41;w(1,3)=59;w(1,4)=189;w(1,5)=81;w(2,3)=27;w(2,4)=238;w(2,5)=94;w(3,4)=212;w(3,5)=89;w(4,5)=171;@for(roads(i,j):w(i,j)=w(i,j)+w(j,i));@for(roads(i,j):w(i,j)=@if(w(i,j) #eq# 0, 1000,w(i,j)));endcalcn=@size(cities); !城市的个数;min=@sum(roads:w*x);@for(cities(i)|i #ne#1 #and# i #ne#n:@sum(cities(j):x(i,j))=@sum(cities(j):x(j,i)));@sum(cities(j):x(1,j))=1;-@sum(cities(j):x(j,1))=0; !不能回到顶点1;@sum(cities(j):x(j,n))=1;@for(roads:@bin(x));endLingo编的sets:dian/a b1 b2 c1 c2 c3 d/:;link(dian,dian)/a,b1 a,b2 b1,c1 b1,c2 b1,c3 b2,c1 b2,c2 b2,c3 c1,d c2,d c3,d/:x,w;endsetsdata:w=2 4 3 3 1 2 3 1 1 3 4;enddatamin=@sum(link:w*x);@for(link:@bin(x));n=@size(dian);@sum(link(i,j)|i#eq#1:x(i,j))=1;@sum(link(j,i)|i#eq#n:x(j,i))=1;@for(dian(k)|k#ne#1#and#k#ne#n:@sum(link(i,k):x(i,k))=@sum(link(k,i):x(k,i)));- sets:dian/1..5/:level; !level(i)表示点i的水平,用来防止生产圈;link(dian,dian):d,x;endsetsdata:d=0 41 59 189 8141 0 27 238 9459 27 0 212 89189 238 212 0 17181 94 89 171 0;enddatan=@size(dian);min=@sum(link(i,j)|i#ne#j:d(i,j)*x(i,j));@sum(dian(j)|j#gt#1:x(1,j))>1;@for(dian(i)|i#gt#1:@sum(dian(j)|j#ne#i:x(j,i))=1);@for(dian(i)|i#gt#1:@for(dian(j)|j#ne#i#and#j#gt#1:level(j)>level(i)+x(i,j)-(n-2)*(1-x(i,j))+(n-3)*x(j, i)));@for(dian(i)|i#gt#1:level(i)<n-1-(n-2)*x(1,i));@for(dian(i)|i#gt#1:@bnd(1,level(i),100000));@for(link:@bin(x));。
matlab弗洛伊德算法求出最短距离

最短路径Floyd算法
Floyd算法是一种用于解决最短路径问题的动态规划算法,其时间复杂度为O(n^3 )。
Floyd算法可以求出任意两点之间的最短路径,并且可以处理负权边(但不能处理负权环)。
算法思想
Floyd算法的基本思想是:对于图中的每一对顶点i和j,看看是否存在一个顶点k,使得从i 到k 再到j 比已知的路径更短。
如果是更短的,就修改当前路径为更短的那个路径。
算法步骤
1.初始化:将图中任意两点之间的最短路径长度初始化为它们之间的权值,如果两点之间没有直接的边,则权值为∞。
2.对于每一个中间节点k,依次考察所有的节点对(i,j),如果从i到j经过节点k比原来的路径更短,则更新最短路径长度。
3.最后得到的矩阵即为任意两点之间的最短路径长度。
Matlab代码
function [D,P] = floyd(W)
% W为邻接矩阵
% D为最短距离矩阵
% P为最短路径矩阵
n = size(W,1);
for k=1:n
for i=1:n
for j=1:n
if W(i,k)+W(k,j)<W(i,j)
W(i,j)=W(i,k)+W(k,j);
P(i,j)=k;
end
end
end
end。
实验三:使用matlab求解最小费用最大流算问题

北京联合大学实验报告项目名称: 运筹学专题实验报告学院: 自动化专业:物流工程班级: 1201B 学号:2012100358081 姓名:管水城成绩:2015 年 5 月 6 日实验三:使用matlab求解最小费用最大流算问题一、实验目的:(1)使学生在程序设计方面得到进一步的训练;,学习Matlab语言进行程序设计求解最大流最小费用问题。
二、实验用仪器设备、器材或软件环境计算机,Matlab R2006a三、算法步骤、计算框图、计算程序等1.最小费用最大流问题的概念。
在网络D(V,A)中,对应每条弧(vi,vj)IA,规定其容量限制为cij(cij\0),单位流量通过弧(vi,vj)的费用为dij(dij\0),求从发点到收点的最大流f,使得流量的总费用d(f)为最小,即mind(f)=E(vi,vj)IA2。
求解原理。
若f是流值为W的所有可行流中费用最小者,而P是关于f的所有可扩充链中费用最小的可扩充链,沿P以E调整f得到可行流fc,则fc是流值为(W+E)的可行流中的最小费用流.根据这个结论,如果已知f是流值为W的最小费用流,则关键是要求出关于f 的最小费用的可扩充链。
为此,需要在原网络D的基础上构造一个新的赋权有向图E(f),使其顶点与D的顶点相同,且将D中每条弧(vi,vj)均变成两个方向相反的弧(vi,vj)和(vj,vi)1新图E(f)中各弧的权值与f中弧的权值有密切关系,图E(f)中各弧的权值定义为:新图E(f)中不考虑原网络D中各个弧的容量cij。
为了使E(f)能比较清楚,一般将长度为]的弧从图E(f)中略去.由可扩充链费用的概念及图E(f)中权的定义可知,在网络D中寻求关于可行流f的最小费用可扩充链,等价于在图E(f)中寻求从发点到收点的最短路.因图E(f)中有负权,所以求E(f)中的最短路需用Floyd算法。
1.最小费用流算法的框图描述。
图一2.计算最小费用最大流MATLAB源代码,文件名为mp_mc.mfunction[Mm,mc,Mmr]=mp_mc(a,c)A=a; %各路径最大承载流量矩阵C=c; %各路径花费矩阵Mm=0; %初始可行流设为零mc=0; %最小花费变量mcr=0;mrd=0;n=0;while mrd~=inf %一直叠代到以花费为权值找不到最短路径for i=1:(size(mcr’,1)—1)if a(mcr(i),mcr(i+1))==infta=A(mcr(i+1),mcr(i))—a(mcr(i+1),mcr(i)); elseta=a(mcr(i),mcr(i+1));endn=min(ta,n);%将最短路径上的最小允许流量提取出来endfor i=1:(size(mcr’,1)-1)if a(mcr(i),mcr(i+1))==infa(mcr(i+1),mcr(i))=a(mcr(i+1),mcr(i))+n;elsea(mcr(i),mcr(i+1))=a(mcr(i),mcr(i+1))—n;endendMm=Mm+n;%将每次叠代后增加的流量累加,叠代完成时就得到最大流量 for i=1:size(a,1)for j=1:size(a’,1)if i~=j&a(i,j)~=infif a(i,j)==A(i,j) %零流弧c(j,i)=inf;c(i,j)=C(i,j);elseif a(i,j)==0 %饱合弧c(i,j)=inf;c(j,i)=C(j,i);elseif a(i,j)~=0 %非饱合弧c(j,i)=C(j,i);c(i,j)=C(i,j);endendendend[mcr,mrd]=floyd_mr(c) %进行叠代,得到以花费为权值的最短路径矩阵(mcr)和数值(mrd)n=inf;end%下面是计算最小花费的数值for i=1:size(A,1)for j=1:siz e(A’,1)if A(i,j)==infA(i,j)=0;endif a(i,j)==infa(i,j)=0;endendendMmr=A—a; %将剩余空闲的流量减掉就得到了路径上的实际流量,行列交点处的非零数值就是两点间路径的实际流量for i=1:size(Mmr,1)for j=1:size(Mmr’,1)if Mmr(i,j)~=0mc=mc+Mmr(i,j)*C(i,j);%最小花费为累加各条路径实际流量与其单位流量花费的乘积endendend利用福得算法计算最短路径MATLAB源代码,文件名为floyd_mr。
matlab、lingo程序代码1-最短距离

例9 某公司在六个城市c1, c2, …c6 中有分公司,从ici到cj的直接航程票价记在下述矩阵的(I,j)位置上。
(∞表示无直接航路),请帮助该公司设计一张城市c1到其它城市间的票价最便宜的路线图。
clc,cleara=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));endd, index1, index2编写LINGO 程序如下:model:sets:cities/A,B1,B2,C1,C2,C3,D/;roads(cities,cities)/A B1,A B2,B1 C1,B1 C2,B1 C3,B2 C1, B2 C2,B2 C3,C1 D,C2 D,C3 D/:w,x;endsetsdata:w=2 4 3 3 1 2 3 1 1 3 4;enddatan=@size(cities); !城市的个数;min=@sum(roads:w*x);@for(cities(i)|i #ne#1 #and# i #ne#n:@sum(roads(i,j):x(i,j))=@sum(roads(j,i):x(j,i)));@sum(roads(i,j)|i #eq#1:x(i,j))=1;@sum(roads(i,j)|j #eq#n:x(i,j))=1;endmodel:sets:cities/1..11/;roads(cities,cities):w,x;endsetsdata:w=0;enddatacalc:w(1,2)=2;w(1,3)=8;w(1,4)=1;w(2,3)=6;w(2,5)=1;w(3,4)=7;w(3,5)=5;w(3,6)=1;w(3,7)=2;w(4,7)=9;w(5,6)=3;w(5,8)=2;w(5,9)=9;w(6,7)=4;w(6,9)=6;w(7,9)=3;w(7,10)=1;w(8,9)=7;w(8,11)=9;w(9,10)=1;w(9,11)=2;w(10,11)=4;@for(roads(i,j):w(i,j)=w(i,j)+w(j,i));@for(roads(i,j):w(i,j)=@if(w(i,j) #eq# 0, 1000,w(i,j))); endcalcn=@size(cities); !城市的个数;min=@sum(roads:w*x);@for(cities(i)|i #ne#1 #and# i #ne#n:@sum(cities(j):x(i,j))=@sum(cities(j):x(j,i)));@sum(cities(j):x(1,j))=1;@sum(cities(j):x(j,1))=0; !不能回到顶点1;@sum(cities(j):x(j,n))=1;@for(roads:@bin(x));end例12 用Floyd算法求解例9。
MATLAB实验报告,遗传算法解最短路径以及函数最小值问题讲解
硕士生考查课程考试试卷考试科目:MATLAB教程考生姓名:考生学号:学院:专业:考生成绩:任课老师(签名)考试日期:20 年月日午时至时《MATLAB 教程》试题:A 、利用MATLAB 设计遗传算法程序,寻找下图11个端点的最短路径,其中没有连接的端点表示没有路径。
要求设计遗传算法对该问题求解。
ad ehkB 、设计遗传算法求解f (x)极小值,具体表达式如下:321231(,,)5.12 5.12,1,2,3i i i f x x x x x i =⎧=⎪⎨⎪-≤≤=⎩∑ 要求必须使用m 函数方式设计程序。
C 、利用MATLAB 编程实现:三名商人各带一个随从乘船渡河,一只小船只能容纳二人,由他们自己划行,随从们密约,在河的任一岸,一旦随从的人数比商人多,就杀人越货,但是如何乘船渡河的大权掌握在商人手中,商人们怎样才能安全渡河?D 、结合自己的研究方向选择合适的问题,利用MATLAB 进行实验。
以上四题任选一题进行实验,并写出实验报告。
选择题目: A 一、问题分析(10分)141011如图如示,将节点编号,依次为 1.2.3.4.5.6.7.8.9.10.11,由图论知识,则可写出其带权邻接矩阵为:0 2 8 1 500 500 500 500 500 500 500 2 0 6 500 1 500 500 500 500 500 500 8 6 0 7 500 1 500 500 500 500 500 1 500 7 0 500 500 9 500 500 500 500 500 1 500 500 0 3 500 2 500 500 500 500 500 1 500 3 0 4 500 6 500 500 500 500 500 9 500 4 0 500 500 1 500 500 500 500 500 2 500 500 0 7 500 9 500 500 500 500 500 6 500 7 0 1 2 500 500 500 500 500 500 1 500 1 0 4 500 500 500 500 500 500 500 9 2 4 0 注:为避免计算时无穷大数吃掉小数,此处为令inf=500。
最短路径问题matlab求解详尽版
最短路径问题m a t l a b求解详尽版Document serial number【UU89WT-UU98YT-UU8CB-UUUT-UUT108】MATLAB 求最短路径利用graphshortestpath 可以求最短路径,具体用法参考MATLAB帮助Examples:S=[1 1 2 2 3 3 4 4 4 4 5 6 6 7 8]; %起始节点向量E=[2 3 5 4 4 6 5 7 8 6 7 8 9 9 9]; %终止节点向量W=[1 2 12 6 3 4 4 15 7 2 7 7 15 3 10]; %边权值向量,有向图,G(9,9)=0; 9个节点G=sparse(S,E,W); %关联矩阵的稀疏矩阵表示G(9,9)=0;P=biograph(G,[],'ShowWeights','on');%建立有向图对象PH=view(P);%显示各个路径权值[Dist,Path]=graphshortestpath(G,1,9,'Method','Dijkstra') %求节点1到节点9的最短路径set(Path),'Color',[1 ]);%以下三条语句用红色修饰最短路径edges=getedgesbynodeid(H,get(Path),'ID'));set(edges,'LineColor',[1 0 0]);set(edges,'LineWidth',;%以下是运行结果,节点1到节点9的最短路径为19Dist =19Path =1 3 4 5 7 9利用graphallshortestpaths可以求出所有最短路径Dists=graphallshortestpaths(G) %求所有最短路径Dists =0 1 2 5 9 6 16 12 19Inf 0 Inf 6 10 8 17 13 20Inf Inf 0 3 7 4 14 10 17Inf Inf Inf 0 4 2 11 7 14Inf Inf Inf Inf 0 Inf 7 Inf 10Inf Inf Inf Inf Inf 0 Inf 7 15Inf Inf Inf Inf Inf Inf 0 Inf 3Inf Inf Inf Inf Inf Inf Inf 0 10Inf Inf Inf Inf Inf Inf Inf Inf 0。
基于Floyd算法的交通调度系统最短路径仿真与设计
第 9期
杜
领 :基 于 F l o y d算 法 的 交 通 调 度 系 统 最 短 路 径 仿 真 与 设 计
9 5
对 同一 种信 息 w 比较 可供量 S( 各 信 息库 可供 量之 和 )与总调 度量 Q( 各单 位 申请量 之和 )的大 小 , 如
果 总可 供量 大 于等 于总 调度 量 ,即 S≥ Q
摘 要 :通 过 对 交 通 调 度 系 统 信 息 分 调 需 求 分 析 ,构 建 交 互 型 F l o y d算 法 模 型 .基 于 F l o y d 算 法设 计 交 通 调 度 系 统 最 短 路 径 ,并通 过仿 真设 计 和 测 试 运 行 该 程 序 , 程 序 运行 良好 . 关 键 词: F l o y d算 法 ;交 通 调 度 系 统 ;最 短 路径 ; 仿 真
①
收 稿 日期 :2 O 1 3 —0 6 —1 5 基 金 项 目 : 四J I I 省 科 技 支 撑 计 划 项 目( 2 0 1 1 Z O O 0 2 7 ) .
作 者 简 介 :杜
领( 1 9 7 0一 ) , 男 ,四川 阆中 人 , 讲 师 ,主 要 从 事 计 算 机 应 用 技 术 研 究
其中 K 表示 第 i 个 信 息 库 ;S ( i ,J )和 R( i , J )表 示 该 信 息 库 中 w 的现 有 信 息 量 和 最 低 储 备 量 ;
S(
.
)一 R( i ,
.
) 表 示 w, 的信 息 可供量 .
1 . 3 信 息分 调方 案制 定
交通调 度 系统信 息分 调方 案利 用分 调模 型来 完 成 ,该分 调模 型 通 过一 系 列公 式 来 实现 .总 的交 通调 度 系统 信息 分调 方案 就是 各种 分调 方案 的汇 总.我们 考虑 某一 个交 通 调度 系统 信息 w 的分调 情况 .
数学建模--运输问题
运输问题摘要本文主要研究的是货物运输的最短路径问题,利用图论中的Floyd算法、Kruskal算法,以及整数规划的方法建立相关问题的模型,通过matlab,lingo 编程求解出最终结果。
关于问题一,是一个两客户间最短路程的问题,因此本文利用Floyd算法对其进行分析。
考虑到计算的方便性,首先,我们将两客户之间的距离输入到网络权矩阵中;然后,逐步分析出两客户间的最短距离;最后,利用Matlab软件对其进行编程求解,运行得到结果:2-3-8-9-10总路程为85公里。
关于问题二,运输公司分别要对10个客户供货,必须访问每个客户,实际上是一个旅行商问题。
首先,不考虑送货员返回提货点的情形,本文利用最小生成树问题中的Kruskal算法,结合题中所给的邻接矩阵,很快可以得到回路的最短路线:1-5-7-6-3-4-8-9-10-2;然后利用问题一的Floyd算法编程,能求得从客户2到客户1(提货点)的最短路线是:2-1,路程为50公里。
即最短路线为:1-5-7-6-3-4-8-9-10-2-1。
但考虑到最小生成树法局限于顶点数较少的情形,不宜进一步推广,因此本文建立以路程最短为目标函数的整数规划模型;最后,利用LINGO软件对其进行编程求解,求解出的回路与Kruskal算法求出的回路一致。
关于问题三,是在每个客户所需固定货物量的情况下,使得行程之和最短。
这样只要找出两条尽可能短的回路,并保证每条线路客户总需求量在50个单位以内即可。
因此我们在问题二模型的基础上进行改进,以货车容量为限定条件,建立相应的规划模型并设计一个简单的寻路算法,对于模型求解出来的结果,本文利用Kruskal算法结合题中所给的邻接矩阵进行优化。
得到优化结果为:第一辆车:1-5-2-3-4-8-9-1,第二辆车:1-7-6-9-10-1,总路程为280公里。
关于问题四,在问题一的基础上我们首先用Matlab软件编程确定提货点到每个客户点间的最短路线,然后结合一些限定条件建立一个目标模型,设计一个较好的解决方案进行求解可得到一种很理想的运输方案。