最小费用流问题的研究

最小费用流问题的研究
最小费用流问题的研究

最小费用流问题的研究

摘要 本文主要研究的是最小费用流问题。在给出一些定义定理的基础上进一步求解最小费用流问题从而得到更好的算法。

关键字 最小费用流问题 剩余网络 容许网络 算法 复杂度

1最小费用流问题的概述

给定一个有向网络),(A N G =。其中},...,,...,3,2,1{n i N =表示顶点集合,A 表示G 中的所有弧构成的一个集合。任意的弧A j i ∈),(,用ij c 表示弧),(j i 上单位流量的费用,用ij u 表示弧),(j i 上的最大流量,任意的N i ∈用)(i b 表示在i 这一点处所提供的流量或所需要的流量。当0)(>i b 时,表示在i 这一点处所提供的流量为)(i b ,当0)(

Min ()(),ij ij i j A z x c x ∈=

∑ Subject to

(){}(){}():,:,ij ji j i j A j i j A x x b i ∈∈-

=∑∑

for all i N ∈, 0ij ij x u ≤≤ for all (),i j A ∈

2.cycle-canceling algorithm

定义2.1 给定一个有向网络),(A N G =,给定一个流x ,我们来构造一个网络:对于G 中任意的一条弧A j i ∈),(,我们用弧),(j i 和),(i j 来表示,弧),(j i 的费用用ij c 来表示,弧

),(j i 的剩余容量用ij ij ij x u r -=来表示,弧),(i j 费用用ij ji c c -=来表示,

,弧),(i j 的剩余容量用ij ji x r =来表示。去掉剩余容量为非正的弧后所构成的图形用)(x G 表示。我们把)(x G 叫做剩余网络。

定理2.1(Negative Cycle Optimality Conditions )设x *

是最小费用流问题的一个可行解,那么x *是最小费用流问题的一个最优解当且仅当满足negative cycle optimality conditions: 剩余网络)(*x G 中不存在负圈。

根据负圈的最优条件,为了得到可行流x ,我们可以利用找最大流的算法建立一个可行流x ,再根据可行流x 构造剩余网络)(x G 。在剩余网络)(x G 中找负圈W ,取

(){}:min :,ij r i j W δ=∈沿着W 上的弧增广δ个单位的流,

消去负费用的圈W 。更新)(x G ,再找负圈,重复上述过程,直到)(x G 中不存在负圈为止。这样的算法称为cycle-canceling algorithm 。

2.1算法的具体步骤如下:

algorithm cycle-canceling:

begin

establish a feasible flow x in the network;

while ()G x contains a negative cycle do

begin

use some algorithm to identify a negative cycle W ;

(){}:m i n :,ij r i j W δ=∈

augment δ units of flow in the cycle W and update ()G x ;

end;

end;

2.2算法的复杂度分析

在剩余网络)(x G 中用标签法找负圈时,其时间复杂度为)(nm O 。算法的主要工作量在于连续寻找负圈并消去负圈。我们用C 表示弧上的费用中的最大者,用U 表示所有弧上的容量中的最大者,由于任何可行流的费用不可能超过mCU ,而每次消去一个负圈至少使得费用下降一个单位,一次消去负圈最多执行)(mCU O 。由此可知,该算法的时间复杂度为)(2CU nm O

3 successive shortest path algorthmi

定义3.1 任意的顶点N i ∈,我们用)(i π表示顶点i 的势,用向量π表示图中所有顶点的势,用πij c 表示弧),(j i 上的减少费用,且规定:)()(j i c c ij ij πππ

+-=。

定理3.1(Reduced Cost Optimality Conditions )设*x 是最小费用流问题的一个可行解,那么*x 是最小费用流问题的一个最优解当且仅当表示顶点势的向量π满足reduced cost

optimality conditions :对于任意一条弧)(),(*x G j i ∈,都有0≥πij c 成立。 定义3.2 设x 是一个流,当x 满足容量的限制和非负的限制,但不满足点的平衡条件的限制时,我们把x 叫做pseudoflows 。对于任意一个psedudoflows x ,当N i ∈是一个不平

衡的点时,我们有

∑∑-+

=)},(:{)},(:{)()(j i j ij i j j ji x x i b i e

对于任意的N i ∈,当0)(>i e 时,表示顶点i 为过剩的点;当0)(

所以有

0)()(==∑∑∈∈N i N i i b i e 故有

∑∑∈∈-=E

i D i i e i e )()(

其中},0)(|{N i i b i D ∈?>= },0)(|{N i i b i E ∈?<=。

由上可知,一个有向网络),(A N G =中如果含有一个过剩点,那么在这个网络中至少含有一个不足点。

推论3.2 假设pseudoflows x 和顶点势的向量π满足减少费用的最优条件。设向量d 表示剩余网路)(x G 中从顶点s 到其它所有点的最短路的距离,用π

ij c 表示)(x G 中弧的长度,则我们得到以下两条性质:

(1) pseudoflows x 和顶点势的向量d -=ππ'满足减少费用的最优条件;

(2) 从顶点s 到其它任意一个顶点的一条最短路P 上的任意一条弧),(j i 的减少用

0'=πij c 根据定理和推论,当我们遇到的流x 为pseudoflows 时,我们要保证pseudoflows x 和表示顶点势的向量π满足减少费用的最优条件的情况下,把所有的不平衡的点转变成平衡的点,也就是说,要把pseudoflows 转x 变成可行流x 。

3.3算法的具体步骤如下:

algorithm successive shortest path

begin

:0:0

;x a n d π== ()():e i b i = for all i N ∈;

initialize the sets (){}(){}

::0::E i e i andD i e i =>=<0;

while E ≠? do

begin

select a node k E ∈ and a node l D ∈;

determine shortest path distance ()d j from node k to all

other nodes in ()G x with respect to the reduce costs c ;

let P denote a shortest path from node k to node l ;

update :d ππ=-;

()()(){}:m i n ,m i n :,ij e k e l r i j P ??δ=-∈??;

augment δ units of flow along the path P ;

update x , ()G x , E , D ,and the reduced costs;

end;

end;

3.4.算法的复杂度分析

算法的主要工作量在于连续寻找费用的最短路,假设寻找最短路算法的复杂度为

),,(C m n S ,

那么在剩余网络)(x G 中应用最短路算法的复杂度为),,(nC m n S 。在沿着最短路增广流的过程中,每次最少增广一个单位的流,所以最多增广)(nU O ,所以本算法的复杂度为)),,((nC m n nUS O 。

3.5算法的改进

在找最短路的过程中,我们不必把k 点到所有点的最短路都找出来。我们可以用Dijkstra 算法找出k 点到l 点的最短路,这就需要修改顶点的势:

当i 是被永久标记时,)()()(i d i i -=ππ;

当i 是被临时标记时,)()()(l d i i -=ππ

或者是

当i 是被永久标记时,)()()()(l d i d i i +-=ππ;

当i 是被临时标记时,)()(i i ππ=

用上述方法可以减少复杂度。

4 primal-dual algorithm

定义 4.1 在剩余网络)(x G 中,由减少费用0=πij c 的弧所构成的图形用()G x ?

表示,称()G x ?

为容许网络。 我们把给定的有向网络),(A N G =中的顶点集N 分为三类:},0)(|{N i i b i D ∈?>= },0)(|{N i i b i E ∈?<=;},0)(|{N i i b i F ∈?==。

引入两个顶点t s ,。我们做:

任意的D i ∈,我们增加一条费用为0,容量为)(i b 的弧),(i s ;

任意的E i ∈,我们增加一条费用为0,容量为)(i b -的弧),(t i 。

可得

∑∈=D

i i b s b )()(,)()(s b t b -=。

从而得到一个新的网络),,,,,('U C A N t s G =。

因为我们在构造),,,,,('U C A N t s G =的过程中,所增加的弧的 费用都为0,所以我们可以把),,,,,('U C A N t s G =看做是原始网络),(A N G =中给定的一个最小费用流问题。 当我们遇到的流x 为pseudoflows 时,我们可以用上述的思想构造新的网络),,,,,('U C A N t s G =,),,,,,('U C A N t s G =是仅有单个过剩顶点和单个不足顶点的简单网络。那么我们要保证pseudoflows x 和表示顶点势的向量π满足减少费用的最优条件的情况下,把单个的不平衡的顶点转变成平衡的顶点,也就是说,要把pseudoflows 转x 变成可行流x ,

4.2算法的具体步骤如下:

algorithm primal-dual;

begin

:0:0

x a n d π==; ()():e s b s = and ()():;e t b t =

while ()0e s > do

begin

determine shortest path distances ().d from node s to all other nodes in ()G x with

respect to the reduced costs c ∏ ;

update :d ππ=-;

define the admissible network ()G x ?;

establish a maximum flow from node s to node t in ()G x ?;

update ()e s ()e t ,and ()G x ;

end;

end

4.3.算法复杂度的分析

从算法的过程可以看出,每次循环迭代修改弧上的流量和顶点上的势各一次。由于流量不可能超过nU ,且任何顶点上的势不可能超过nC -,因此总迭代次数不会超过

},min{nC nU 。

假设最短路算法的复杂度为),.(C m n S ,最大流算法的复杂度为),.(U m n M ,

则本算法复杂度为)]),(),.(}[,(min{mU n M nC m n S nC nU O +。

5.out-of-kilter algorithm

定理5.1(Complementary Slackness Optimality Conditions )设x *

是最小费用流问题的一个可行解,那么x *是最小费用流问题的一个最优解当且仅当表示顶点势的向量π,减少费用πij c 和流值ij x 满足:Complementary Slackness Optimality Conditions: if 0>πij c ,then 0*=ij x ;

if ij ij u x <<*0,then 0=πij c ;

if 0<πij c ,then ij ij u x =*

连续最短路算法和原始对偶算法都是在流不满足点平衡条件的情况下使用的。那么当我们遇到的流满足点平衡条件的限制而不慢足容量的约束条件时,我们怎样解决此时的最小费用流问题呢?

根据定理,我们可以把有向网络),(A N G =中的弧分为两类:第一类是满足互补松弛性的最优条件的弧,我们把这类弧叫做in-kilter 弧;第二类是不满足互补松弛性的最优条件的弧,我们把这类弧叫做out-of-kilter 弧。那么我们现在所要考虑的问题就是怎样把out-of-kilter 弧转变成in-kilter 弧?

定义5.1 在减少费用πij c 不变的情况下,将out-of-kilter 弧),(j i 转变成in-kilter 弧),(j i 所需要修改的流量叫做弧),(j i 的kilter 数,记为ij k 。

定义5.2 在剩余网络)(x G 中,规定:当0≥πij c 时0=ij k ;当0<πij c 时ij ij r k =。 根据定理定义,在剩余网络)(x G 中的任意一条弧),(j i ,当0≥π

ij c 时,弧),(j i 满足减少费用的最优条件;当0<πij c 时,弧),(j i 不满足减少费用的最优条件。在弧),(j i 不满足减少费用的最优条件的情况下,我们可以沿弧),(j i 发送ij r 个单位的流,使得弧),(j i 的容量变为0,从而剩余网络中不再含有),(j i 这一条弧。

5.2算法的具体步骤如下:

algorithm out-of-kilter;

begin

:0π=;

estable a feasible flow x in the network;

define the residual network ()G x and compute the kilter numbers of arcs;

while the network contains an out-of-kilter arc do

begin

select an out-of-kilter arc (),p q in ()G x ;

define the length of each arc (),i j in ()G x as max {}0,c ∏;

let ().d denote the shortest path distances from node q to all other nodes in ()(){},G x q p -

and let P denote a shortest path from node q to note p ; update

()()()i i d i ππ'=- for all i N ∈; if 0pq c π≤ then

begin

(){}:,W P p q =?;

(){}:min :,ij r i j W δ=∈;

augment δ units of flow along W ;

update x ,()G x ,and the reduced costs;

end;

end;

end;

5.3算法复杂度的分析

从算法的过程可以看出每次循环迭代修改圈上的流值和顶点上的势各一次,并使所有弧上的kilter 数至少下降一个单位。设最短路算法的复杂度为),.(C m n S 。当取初始流0=x 时,由于kilter 数不超过U ,所以此算法的复杂度为)),.((C m n mUS O 。当初始流0≠x 时,设初始流和势对应的总kilter 数为K ,则总迭代次数不会超过K ,故算法的复杂度为)),.((C m n mKS O 。

实验三:使用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)IA 2.求解原理。 若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.m function[Mm,mc,Mmr]=mp_mc(a,c) A=a; %各路径最大承载流量矩阵 C=c; %各路径花费矩阵 Mm=0; %初始可行流设为零 mc=0; %最小花费变量 mcr=0; mrd=0;

最大和最小费用流问题模型

最大流和最小费用流的作业 1.在下图中A 、B 为发点,分别有50和40单位物资往外发送,D 和E 是为收点,分别需要物资30和60单位,C 为中转站,各弧旁数字为(Cij ,Bij ),求满足上述收发量要求的最小费用流。 解:把问题转化为网络图: (20,90) (50,40) ( 10,20 ) (30,20) (10,30) (40,30) (80,10) 决策变量:设A 运到B 为L1, A 运到C 为L2, A 运到D 为L3,B 运到C 为L4, C 到E 为L5 D 到E 为L6, E 到D 为L7。 目标函数: Min Z=L1×20+L2×40+L3×90+L4×30+L5×10+L6×30+L7×20 约束条件: L1<=10,L2<=50,L3<=20,L4<=40,L5<=80,L6<=30,L7<=20 L1+L2+L3=50 L4=40+L1 L2+L4=L5 L3+L7=30 L5+L6=60 Li 为整数(i=1,2,3,4,5,6,7); A D B E C

结果如下: 解得L1=0 L2=40 L3=10 L4=40 L5=80 L6=0 L7=20 Min Z=4900 2、下图是描述一个水渠系统,其中R1,R2,R3,代表三个水库,A,B,C,D,E,F,代表水渠的交汇点,T 表示水渠终点的一个城市,水渠各段每日允许通过的最大流量(1000m 3)分别见表6-10和6-11.城市水资源管理部门希望制定一个方案,使每天输送到城市的水流量为最大,请将此问题归结为求最大流问题。 表6-10 到 从 A B C R1 73 65 _ R2 40 50 60 R3 _ 80 70 R1 R2 R3 A D B E T C F

最小费用最大流问题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: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 if L(end)

关于最小费用最大流的解题

关于最小费用最大流的解题 这是课本235页的一道习题 题目是:求如下图中网络的最小费用最大流。弧旁数字(Cij,Rij)。 根据之前的例题14 解题过程如下: (1)构造一个对偶网络,按狄克斯屈标号法找到最短路,得到相应的增广链,调整; (2)再次构造一个对偶网络,如下图。在书中曾提到在含负权的的网络中不能运用狄克斯屈标号法,只能用距离矩阵摹乘法。 可是距离矩阵摹乘法做起来确实是比较复杂,因此我在研究已经做过的几个题中发现,我们在计算最小费用最大流的时候,可以用如下方法来解该题。 解: 从S点出发,有三条路,分别到1和2,由于标号为-1的路是反向的,排除。因此,我们选标号比较小的S—1这条路……依次类推,得到一条最短路:S—1—2

—4—3—T。再按之前的解题思路解题。 再得到S—2—4—3—T; 不存在从S到T的最短路,故最大流为f(X*)=4+1=5,c(X′)=3×1+4×2+1×2+2×5+1×4+3×3+1×1=37; (3)重复上面的动作; (4)得到最小费用最大流。 我不喜欢复杂的做题的方法,因此,在做这个题的时候,由于之前提到过的狄克斯屈标号法不能用于含负权的网络图中,所以必须用到距离矩阵摹乘法,而距离矩阵摹乘法确实是很麻烦,又得画表,又得计算。所以,我通过书上的图列推出这样来做这个题。虽然并不一定这种做法是不是对的(我目前只在几个题目

中运用,结果是对的),但我相信这样一个方向是对的,以前的运筹学方法也是前辈们研究出来的。 另外,我还在维普中文网上看到了一篇题为《含负权最短路问题的一个改进标号法》的论文,载要:在不出现负回路的情况下,给出了在赋权的网络图中求两点之间的最短路问题的一个改进标号法,该方法对于网络图中出现负权的情况也有效。最后给出了该算法的数值实验结果。 这篇文章中,提到了对狄克斯屈标号法的在负权网络不能运用的缺陷的改进。 这让我体会到了运筹学学习当中的另一个重要方面:我们不能拘泥于课本上一层不变的解题方法,应多了解运筹学发展的最新动态,掌握有关运筹学的最新知识。通过对其的研究,从而找到更好的方法来解决相关的问题。 这是我在这次作业当中,所获得的心得体会。

最小费用流问题的研究

最小费用流问题的研究 摘要 本文主要研究的是最小费用流问题。在给出一些定义定理的基础上进一步求解最小费用流问题从而得到更好的算法。 关键字 最小费用流问题 剩余网络 容许网络 算法 复杂度 1最小费用流问题的概述 给定一个有向网络),(A N G =。其中},...,,...,3,2,1{n i N =表示顶点集合,A 表示G 中的所有弧构成的一个集合。任意的弧A j i ∈),(,用ij c 表示弧),(j i 上单位流量的费用,用ij u 表示弧),(j i 上的最大流量,任意的N i ∈用)(i b 表示在i 这一点处所提供的流量或所需要的流量。当0)(>i b 时,表示在i 这一点处所提供的流量为)(i b ,当0)(

运筹学实验之最小费用最大流(综合实验)

综合性、设计性实验报告格式 桂林电子科技大学 数学与计算科学学院综合性、设计性实验报告 实验室: 实验日期:2014年12月13日 院(系) 数学与计算科学 年级、专业、班 姓名 成绩 课程 名称 运筹学实验 实验项目 名 称 最小费用最大流(综合实验) 指导 教师 南江霞 教师 评语 教师签名: 年 月 日 一 ,实验目的 1. 掌握最大流及最小费用最大流问题的数学建模; 2. 掌握最大流问题的WinQSB 软件求解和Lingo 软件求解; 3. 掌握最小费用最大流问题问题的的WinQSB 软件求解和Lingo 软件求解。 二,实验原理 1、熟悉建立最大流问题的数学模型; 2、熟悉建立最小费用最大流问题的数学模型; 3、熟悉WinQSB 软件的基本操作。 4、熟悉Lingo 软件建模。 三,使用仪器,材料 WinQSB 软件 Lingo 软件 四,实验内容与步骤 求最大流: 五,实验过程原始记录(数据,图表,计算等) 用WinQSB 软件进行求解 S A B C D T (7,2) (10,10) (5,3) (7,7) (5,1) (8,4) (10,9) (5,3)

用Lingo 软件进行求解 建立数学模型 ()()()(),max max ,,min ,..0,0,,ij ij i j A ij ji j V j V i j A j i A ij ij e f f i S s t f f f i T i S T f c i j A ∈∈∈∈∈=??-=-=??≠?≤≤∈∑∑∑ model : sets :

nodes/S,A,B,C,D,T/; arcs(nodes,nodes)/ S,A S,B A,B,A,C B,C,B,D C,D,C,T D,T/:C,f; endsets data: C=7 10 5 7 5 8 7 10 5; enddata max=flow; @for(nodes(i)|i#ne#1#and#i#ne#@size(nodes): @sum(arcs(i,j):f(i,j))-@sum(arcs(j,i):f(j,i))=0); @sum(arcs(i,j)|i#eq#1:f(i,j))=flow; @sum(arcs(i,j)|j#eq#@size(nodes):f(i,j))=flow; @for(arcs:@bnd(0,f,C)); end Global optimal solution found. Objective value: 15.00000 Infeasibilities: 0.000000 Total solver iterations: 4 Variable Value Reduced Cost FLOW 15.00000 0.000000 C( S, A) 7.000000 0.000000 C( S, B) 10.00000 0.000000 C( A, B) 5.000000 0.000000 C( A, C) 7.000000 0.000000 C( B, C) 5.000000 0.000000 C( B, D) 8.000000 0.000000 C( C, D) 7.000000 0.000000 C( C, T) 10.00000 0.000000 C( D, T) 5.000000 0.000000 F( S, A) 7.000000 0.000000 F( S, B) 8.000000 0.000000 F( A, B) 0.000000 0.000000 F( A, C) 7.000000 0.000000 F( B, C) 3.000000 0.000000 F( B, D) 5.000000 0.000000 F( C, D) 0.000000 0.000000 F( C, T) 10.00000 -1.000000 F( D, T) 5.000000 -1.000000 S到T的最大流=15 六,实验结果分析或总结

求最小费用最大流算法的MATLAB程序代码

求最小费用最大流算法的MATLAB 程序代码如下(算例): n=5; C=[0 15 16 0 0 0 0 0 13 14 0 11 0 17 0 0 0 0 0 8 0 0 0 0 0]; %弧容量 b=[0 4 1 0 0 0 0 0 6 1 0 2 0 3 0 0 0 0 0 2 0 0 0 0 0]; %弧上单位流量的费用 wf=0;wf0=Inf; %wf 表示最大流量, wf0 表示预定的流量值 for(i=1:n)for(j=1:n)f(i,j)=0;end;end %取初始可行流f 为零流 while(1) for(i=1:n)for(j=1:n)if(j~=i)a(i,j)=Inf;end;end;end%构造有向赋权图 for(i=1:n)for(j=1:n)if(C(i,j)>0&f(i,j)==0)a(i,j)=b(i,j); elseif(C(i,j)>0&f(i,j)==C(i,j))a(j,i)=-b(i,j); elseif(C(i,j)>0)a(i,j)=b(i,j);a(j,i)=-b(i,j);end;end;end for(i=2:n)p(i)=Inf;s(i)=i;end %用Ford 算法求最短路, 赋初值 for(k=1:n)pd=1; %求有向赋权图中vs 到vt 的最短路 for(i=2:n)for(j=1:n)if(p(i)>p(j)+a(j,i))p(i)=p(j)+a(j,i);s(i)=j;pd=0;end;end;end if(pd)break;end;end %求最短路的Ford 算法结束 if(p(n)==Inf)break;end %不存在vs 到vt 的最短路, 算法终止. 注意在求最小费用最大流时构造有 向赋权图中不会含负权回路, 所以不会出现k=n dvt=Inf;t=n; %进入调整过程, dvt 表示调整量 while(1) %计算调整量 if(a(s(t),t)>0)dvtt=C(s(t),t)-f(s(t),t); %前向弧调整量 elseif(a(s(t),t)<0)dvtt=f(t,s(t));end %后向弧调整量 if(dvt>dvtt)dvt=dvtt;end if(s(t)==1)break;end %当t 的标号为vs 时, 终止计算调整量 t=s(t);end %继续调整前一段弧上的流f pd=0;if(wf+dvt>=wf0)dvt=wf0-wf;pd=1;end%如果最大流量大于或等于预定的流量值 t=n;while(1) %调整过程 if(a(s(t),t)>0)f(s(t),t)=f(s(t),t)+dvt; %前向弧调整 elseif(a(s(t),t)<0)f(t,s(t))=f(t,s(t))-dvt;end %后向弧调整 if(s(t)==1)break;end %当t 的标号为vs 时, 终止调整过程 t=s(t);end if(pd)break;end %如果最大流量达到预定的流量值 wf=0; for(j=1:n)wf=wf+f(1,j);end;end %计算最大流量 zwf=0;for(i=1:n)for(j=1:n)zwf=zwf+b(i,j)*f(i,j);end;end %计算最小费用 f %显示最小费用最大流 wf %显示最小费用最大流量 zwf %显示最小费用, 程序结束

相关文档
最新文档