数学建模社区-数学中国
标题:
请各位matlab程序高手帮帮我
[打印本页]
作者:
corrine
时间:
2012-8-20 20:51
标题:
请各位matlab程序高手帮帮我
是有关蚁群算法在最大流最小费用方面的应用,自己下载了个程序,改了半天了都没运行出来,后来得知是被人可以删了几句,请大家帮我看看吧,我是参加数模赛的学生,可以的话给我发邮件吧,
sdqdliuyao@163.com
非常感谢!
function [f,MinCost,MaxFlow]=MinimumCostFlow(a,c,V,s,t)
% 基于Floyd最短路算法的Ford和Fulkerson迭加算法 %
% 输入参数列表
% 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:N
for j=1:N
if i~=j&&c(i,j)~=0
flag(i,j)=1;%前向边标记
flag(j,i)=-1;%反向边标记
end
if a(i,j)==inf
a(i,j)=BV;
w(i,j)=BV;%为提高程序的稳健性,以一个有限大数取代无穷大
end
end
end
%[L,R]=FLOYD2(w,s,t);
if L(end)
RE=1;%如果路径长度小于大数,说明路径存在
else
RE=0;
end
% 第二步:迭代过程
while RE==1&&MaxFlow<=max(max(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:TS
LY(i)=c(R(i),R(i+1));
end
maxLY=min(LY);%流量裕度的最小值,也即最大能够增加的流量
for i=1:TS
u=R(i);
v=R(i+1);
if flag(u,v)==1&&maxLY
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
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;
else
end
end
MaxFlow2=sum(f(s,
);
MinCost2=sum(sum(f.*a));
if MaxFlow2<=V
MaxFlow=MaxFlow2;
MinCost=MinCost2;
[L,R]=FLOYD2(w,s,t);
else f=f1+prop*(f-f1);
MaxFlow=V;
MinCost=MinCost1+prop*(MinCost2-MinCost1);
return
end
if L(end)
RE=1;%如果路径长度小于大数,说明路径存在
else
RE=0;
end
end
作者:
corrine
时间:
2012-8-20 20:52
笑脸是冒号和括号,再次谢谢
作者:
lgmltxs
时间:
2012-8-22 10:31
这么复杂
作者:
corrine
时间:
2012-8-22 10:35
是蚁群算法求最大流最小费用的,我改了下,应该是没有什么语法错误,但是缺一些关键语句哇
作者:
corrine
时间:
2012-8-22 18:21
可以和俺交流下,俺是态度积极的爱好者哇,多多地鼓励下
作者:
梦溪517
时间:
2012-8-22 21:36
function [f,MinCost,MaxFlow]=MinimumCostFlow(a,c,V,s,t)
% 基于Floyd最短路算法的Ford和Fulkerson迭加算法 %
% 输入参数列表
% 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:N
for j=1:N
if i~=j&&c(i,j)~=0
flag(i,j)=1;%前向边标记
flag(j,i)=-1;%反向边标记
end
if a(i,j)==inf
a(i,j)=BV;
w(i,j)=BV;%为提高程序的稳健性,以一个有限大数取代无穷大
end
end
end
%[L,R]=FLOYD2(w,s,t);
if L(end)
RE=1;%如果路径长度小于大数,说明路径存在
else
RE=0;
end
% 第二步:迭代过程
while RE==1&&MaxFlow<=max(max(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:TS
LY(i)=c(R(i),R(i+1));
end
maxLY=min(LY);%流量裕度的最小值,也即最大能够增加的流量
for i=1:TS
u=R(i);
v=R(i+1);
if flag(u,v)==1&&maxLY
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
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;
else
end
end
MaxFlow2=sum(f(s,:));
MinCost2=sum(sum(f.*a));
if MaxFlow2<=V
MaxFlow=MaxFlow2;
MinCost=MinCost2;
[L,R]=FLOYD2(w,s,t);
else f=f1+prop*(f-f1);
MaxFlow=V;
MinCost=MinCost1+prop*(MinCost2-MinCost1);
return
end
if L(end)
RE=1;%如果路径长度小于大数,说明路径存在
else
RE=0;
end
end
复制代码
帮你将乱码修改一下
作者:
corrine
时间:
2012-8-23 08:47
非常感谢了,但问题是这个运行不出来哇,是缺了语句嘞
作者:
傻人招
时间:
2012-8-31 23:15
这个真的是MATLAB的编程么?
作者:
corrine
时间:
2012-9-1 18:07
什么意思?确实是一份matlab代码的
作者:
唯世
时间:
2013-4-25 13:30
好棒!!!!!!!!!!!!!
作者:
林夕1994
时间:
2013-5-20 23:04
缺了语句了,L和R分别是什么啊????
作者:
benfifi
时间:
2013-8-12 17:01
感谢楼主!!!
作者:
美丽坏坏坏女人
时间:
2013-8-13 08:42
我看不懂,怎么破
作者:
Meteor胖号
时间:
2013-8-30 17:59
欢迎光临 数学建模社区-数学中国 (http://www.madio.net/)
Powered by Discuz! X2.5