数学建模社区-数学中国

标题: 最小费用流及其求法 [打印本页]

作者: 浅夏110    时间: 2020-5-20 17:36
标题: 最小费用流及其求法
1 最小费用流
- ^( {4 t& ?3 E( }: G! z! n上面我们介绍了一个网络上最短路以及最大流的算法,但是还没有考虑到网络上流 的费用问题,在许多实际问题中,费用的因素很重要。例如,在运输问题中,人们总是 希望在完成运输任务的同时,寻求一个使总的运输费用最小的运输方案。这就是下面要 介绍的最小费用流问题。
) y  h* p* U. \4 m; L- S! b  X) B3 q) `+ n: s: x8 p
最小费用流问题的线性规划表示
) Q5 {0 Z2 E* _5 W* q: A8 s7 r9 U8 o; S在运输网络 N = (s,t,V, A,U) 中,设  是定义在 A 上的非负函数,它表示通过弧 (i, j) 单位流的费用。所谓最小费用流问题就是从发点到收点怎样以最小费用输送一已 知量为v( f ) 的总流量。 最小费用流问题可以用如下的线性规划问题描述:
4 N( q9 a4 Z$ C5 d
2 [$ r# Y  F- {- O. c" S1 x1 |3 _. f( s0 o8 ~8 s8 t/ A$ B8 r

$ {4 `1 W; ]. k1 |  A! c) B( {* c6 @  e& M% x4 ?4 R
      例 19(最小费用最大流问题)
0 g: \' W8 e; d9 ]( m' o(续例 18)由于输油管道的长短不一或地质等原因, 使每条管道上运输费用也不相同,因此,除考虑输油管道的最大流外,还需要考虑输油 管道输送最大流的最小费用。图 8 所示是带有运费的网络,其中第 1 个数字是网络的容 量,第 2 个数字是网络的单位运费。+ Z, @0 R% j1 F6 ]
" x& H8 I- {; U; T

8 y& Z0 G, o  r: O- P& F. F# O/ l: K

7 x0 e: }5 h/ u% o$ h解 按照最小费用流的数学规划写出相应的 LINGO 程序如下:1 y7 D5 K6 i% v# `! m6 X3 k+ n
model:0 z7 @" P8 t$ i
sets:
! P2 m" X# v$ I2 I5 f* w* n7 xnodes/s,1,2,3,4,t/:d;
% f; U% u5 P+ J; q% ?  M1 F$ l" r! P2 Carcs(nodes,nodes)/s 1,s 3,1 2,1 3,2 3,2 t,3 4,4 2,4 t/:c,u,f;) H6 V  ~: U) S' q! d9 Y8 X
endsets% i+ a- M7 _: P) a
data:5 l1 X* G1 M2 Z0 s6 H8 J0 S
d=14 0 0 0 0 -14; !最大流为14;
5 I9 i* e7 p# l6 Uc=2 8 2 5 1 6 3 4 7;1 z, A9 {, L) {7 }" K) H  [
u=8 7 9 5 2 5 9 6 10;
5 f3 f4 h7 w  F$ z. O. n5 wenddata7 u3 h7 H3 i7 v& R# R1 t& d$ f9 @
min=@sum(arcs:c*f);
1 i" K$ U( |* ~3 N3 J7 \@for(nodes(i)sum(arcs(i,j):f(i,j))-@sum(arcs(j,i):f(j,i))=d(i));7 ^- r( a, l7 {  d* l
@for(arcsbnd(0,f,u));! {- W2 Y# W7 D! Q5 q' m
end
0 X1 ?7 R! g. X2 V2 f& i- n: V
$ s% `9 x5 g; S5 I1 p求得最大流的最小费用是 205,而原最大流的费用为 210 单位,原方案并不是最优 的。 类似地,可以利用赋权邻接矩阵编程求得最小费用最大流。LINGO 程序如下:
. @4 y% O; d6 @) X5 m# h* B: ^6 D( |; ^( z# m
model:6 \6 l: H, A# B3 e3 |+ n+ l
sets:
9 S; P3 b; Z* x& F  Bnodes/s,1,2,3,4,t/:d;
7 v9 M; J1 U7 m+ {5 [7 O; ]8 Jarcs(nodes,nodes):c,u,f;
, E" Q* [8 j7 q: p+ Yendsets! Z1 f) G1 G- l6 v# c* i% H4 k% s
data:
$ `0 l9 J+ v3 |% z7 q0 v/ Nd=14 0 0 0 0 -14;
/ i1 Q. ]# x, c2 Z9 i" `, k# rc=0; u=0;
7 o2 d) E, C1 f( ~# i' v0 Aenddata+ R# ?( ~, t( Q9 q
calc:
* {8 b2 v5 t8 ~6 t) mc(1,2)=2;c(1,4)=8;2 Z) m; ]: j1 s8 W5 x
c(2,3)=2;c(2,4)=5;
& h2 s# i/ K' Y" B' pc(3,4)=1;c(3,6)=6;
, x" `0 N. I# C# cc(4,5)=3;c(5,3)=4;c(5,6)=7;
  A3 _/ U9 I" x3 m3 Mu(1,2)=8;u(1,4)=7;& Q, F' f, e  [5 D( d4 y% f5 t; t
u(2,3)=9;u(2,4)=5;! Q, z. }, w0 r; P5 Z1 \+ M0 c: p
u(3,4)=2;u(3,6)=5;
: t1 m5 j4 O5 h3 `- ^- B; qu(4,5)=9;u(5,3)=6;u(5,6)=10;
# }1 n8 E4 `" P2 x0 L$ k6 Fendcalc. J% V' L* k' ^9 N
min=@sum(arcs:c*f);
  P' I: s3 l- n% u% ^3 q1 Q# |$ d@for(nodes(i)sum(nodes(j):f(i,j))-@sum(nodes(j):f(j,i))=d(i));
: G  J" G: e$ J/ T! V; D! t@for(arcsbnd(0,f,u));
# d' ^2 ?6 P8 k! V2 C: gend 5 G! M1 J+ c* U9 ~) U3 ]( U& _

  t/ `5 O/ k$ r: }" ^2 求最小费用流的一种方法—迭代法
5 s) U! `% u1 y( X" y0 L这里所介绍的求最小费用流的方法叫做迭代法。这个方法是由 Busacker 和 Gowan 在 1961 年提出的。其主要步骤如下:
4 V* J9 {# `, E8 V! h
# w$ J& C+ I/ i1 d) {1 |8 {9 W$ c
/ P! V, c2 m5 R
下面我们编写了最小费用最大流函数 mincostmaxflow,其中调用了利用 Floyd 算法 求最短路的函数 floydpath。/ c0 i0 N+ y# N0 [1 L

( k% _9 Q! ^: F" D( A- a求解例 19 具体程序如下(下面的全部程序放在一个文件中):' {+ i" T1 i3 d

) j$ N+ b1 K( gfunction mainexample19
% f5 u6 p+ P: o: \clear;clc;
$ v* W, X  q( z- A4 t3 _+ z5 b$ Gglobal M num- }. Z& Z- c' x# W2 F" _
c=zeros(6);u=zeros(6);$ E  A- [5 c- b$ V% S0 ?+ K' I
c(1,2)=2;c(1,4)=8;c(2,3)=2;c(2,4)=5;' H' j' M. f; H! k
c(3,4)=1;c(3,6)=6;c(4,5)=3;c(5,3)=4;c(5,6)=7;# M8 U' o' h7 ?
u(1,2)=8;u(1,4)=7;u(2,3)=9;u(2,4)=5;- R8 H1 U, U: s/ O
u(3,4)=2;u(3,6)=5;u(4,5)=9;u(5,3)=6;u(5,6)=10;
  w3 @# G. y( s* ^4 @+ onum=size(u,1);M=sum(sum(u))*num^2;
# E, Y3 @9 Y; A6 r[f,val]=mincostmaxflow(u,c)! V" _7 t& b2 v9 l. |( m
%求最短路径函数' F/ X5 [6 C8 u; b5 P2 s
function path=floydpath(w);. g& Z/ o2 [" T3 S
global M num* X; `/ }* v9 o3 B" s
w=w+((w==0)-eye(num))*M;
9 d+ I) u1 S3 C6 E2 }1 R6 Zp=zeros(num);
* F1 I2 L# \" y* _% ?for k=1:num
. y& u1 H/ O6 K( m    for i=1:num, W# P$ J+ U$ w/ Y( x! {
        for j=1:num) z8 v" S6 X& d9 U. L  P& j
            if w(i,j)>w(i,k)+w(k,j)
! h7 c5 P. F4 l, j                w(i,j)=w(i,k)+w(k,j);! z3 L3 C5 l. G4 X( S
                p(i,j)=k;
) L8 L3 f3 n" ^8 [0 w            end9 k& R7 |5 S) I' P) C' Q
        end' U" o+ D" s( [0 g4 k
    end
5 j, H  K- \/ V% v3 I4 R  }& ^; u! Z& \end
: ?1 |. I1 K: A9 `8 _. D; g2 s" Tif w(1,num) ==M0 ]; s5 O6 [+ L
    path=[];& s2 h; W1 n# C
    else" _) L0 g9 z6 Z7 W
    path=zeros(num);2 `$ D4 O2 R# S! {+ r- Q
    s=1;t=num;m=p(s,t);
" g0 I6 r8 h' @! H    while ~isempty(m)) v  i0 E0 \) X; G+ D
        if m(1): T/ F( ]5 E0 r7 k. h1 ?1 H% v
            s=[s,m(1)];t=[t,t(1)];t(1)=m(1);
. G& J" d- n: G: _7 p/ o1 e& L& v            m(1)=[];m=[p(s(1),t(1)),m,p(s(end),t(end))];
8 s: s% X: D$ H' I- Y        else7 g( Y7 A6 X$ O: |% H
            path(s(1),t(1))=1;s(1)=[];m(1)=[];t(1)=[];
( x9 r0 [% A; m5 ~# J4 h+ J        end
% X) L, `& F: _7 [  ]+ D    end- [, \5 X9 Z: g3 W
end$ a; _/ x7 j1 ?$ J
%最小费用最大流函数
$ T& p6 Q( K/ i3 p! s3 F: dfunction [flow,val]=mincostmaxflow(rongliang,cost,flowvalue);% f# _8 M5 L6 D% u
%第一个参数:容量矩阵;第二个参数:费用矩阵;
* ~- p8 [) p, d/ [+ z9 d%前两个参数必须在不通路处置零) S+ R. g2 l2 T7 u4 D7 A
%第三个参数:指定容量值(可以不写,表示求最小费用最大流)
0 E3 o8 K7 q( U8 c7 s%返回值 flow 为可行流矩阵,val 为最小费用值) j) m9 t3 t. {+ C
global M
4 \7 H& L" B2 _) s( H0 U' Dflow=zeros(size(rongliang));allflow=sum(flow(1,);. ?% L/ ]: p: f/ ~/ A7 }  k
if nargin<3
/ s1 R7 l8 F% I4 K3 i    flowvalue=M;6 I, f3 }2 u5 o- h1 M5 A
end
) [3 N: }% O' kwhile allflow<flowvalue
( _5 k! ^% Q3 K8 h( Q) [    w=(flow<rongliang).*cost-((flow>0).*cost)';
* e# C* C5 X% O    path=floydpath(w);%调用 floydpath 函数  H* B+ F; Z7 _+ J9 C4 L2 A$ e
    if isempty(path)& c/ [5 n" Q$ d' ^2 E
        val=sum(sum(flow.*cost));
' L+ j. J& [! `9 a7 O9 L/ X        return;
# J  q1 d, j4 r4 _    end/ a2 m. B' r, d  P6 g
    theta=min(min(path.*(rongliang-flow)+(path.*(rongliang-flow)==0).*M));" M6 g6 J/ p& f; w2 h' ?
    theta=min([min(path'.*flow+(path'.*flow==0).*M),theta]);. N# y- f  M1 y( Z! X
    flow=flow+(rongliang>0).*(path-path').*theta;' Q, H. _- L6 U; l' W% L$ b7 Y
    allflow=sum(flow(1,);
9 t! |' o+ t" O, V4 W8 O7 Lend7 X. T5 G, Z% U+ G3 E, T9 g
val=sum(sum(flow.*cost));
5 X- R9 M: Z% z( V# F! t5 b* J* @& X8 J" ]! {5 [) C

+ {! u* W. \) S: P" {+ v( [1 k. W! x- D. Q% Q8 A1 O

# t8 M2 X$ w  m6 }3 D7 {————————————————, y7 b; F/ N% @( B. o$ j
版权声明:本文为CSDN博主「wamg潇潇」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。4 L8 ?/ o% Q6 K
原文链接:https://blog.csdn.net/qq_29831163/article/details/89787628
$ [" ^8 y  G1 H& d/ Q
" X, x: a) U$ D0 g/ q& q& S
! e0 q! z  }4 A




欢迎光临 数学建模社区-数学中国 (http://www.madio.net/) Powered by Discuz! X2.5