数学建模社区-数学中国

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

作者: 浅夏110    时间: 2020-5-20 17:36
标题: 最小费用流及其求法
1 最小费用流
* _/ ]% A; j, W& P0 f上面我们介绍了一个网络上最短路以及最大流的算法,但是还没有考虑到网络上流 的费用问题,在许多实际问题中,费用的因素很重要。例如,在运输问题中,人们总是 希望在完成运输任务的同时,寻求一个使总的运输费用最小的运输方案。这就是下面要 介绍的最小费用流问题。% l0 \+ \( {& x

4 X& T: Y' N4 H' t4 n5 w最小费用流问题的线性规划表示* K/ N# ~0 E1 i: M  J
在运输网络 N = (s,t,V, A,U) 中,设  是定义在 A 上的非负函数,它表示通过弧 (i, j) 单位流的费用。所谓最小费用流问题就是从发点到收点怎样以最小费用输送一已 知量为v( f ) 的总流量。 最小费用流问题可以用如下的线性规划问题描述:
! B3 X1 g3 }2 C. P; r0 f
9 s# d# J  e3 K" T7 U3 z3 X* V
# D: T; S, y+ [/ F
* }, v+ b) ~! G( U& I
0 f( F( E3 v( ?" R  ^: L% H) V& y      例 19(最小费用最大流问题)
5 k% v1 q7 l; G( j* B* h( M(续例 18)由于输油管道的长短不一或地质等原因, 使每条管道上运输费用也不相同,因此,除考虑输油管道的最大流外,还需要考虑输油 管道输送最大流的最小费用。图 8 所示是带有运费的网络,其中第 1 个数字是网络的容 量,第 2 个数字是网络的单位运费。
( p6 C8 ]" _0 t: e/ A& U4 |' N, i7 H, `- g+ m5 W

! h* ^+ |) J9 B+ C& M5 f* r) H! ]" N0 k

) V! I* A$ T- P" V+ J* ^, R) ~解 按照最小费用流的数学规划写出相应的 LINGO 程序如下:$ `5 r0 S+ O6 T- B# S7 y
model:4 B. t) A' y% q
sets:0 o* E" n- K8 r8 D( p, D+ ?
nodes/s,1,2,3,4,t/:d;
/ n3 I; y8 M8 z8 M  iarcs(nodes,nodes)/s 1,s 3,1 2,1 3,2 3,2 t,3 4,4 2,4 t/:c,u,f;: E" Y; H/ O3 R" t
endsets
8 t; c1 e8 }6 U3 y! Y3 _& ~data:! R0 m5 X9 G. {2 e4 s( P
d=14 0 0 0 0 -14; !最大流为14;
6 B" g0 R  c; r3 nc=2 8 2 5 1 6 3 4 7;
+ q5 @3 G) h' r( X1 }: bu=8 7 9 5 2 5 9 6 10;
( ^( F/ H# {8 P  f& w, i' L( Menddata
( O% r( o3 [; O/ U; m3 d% @! nmin=@sum(arcs:c*f);
& F+ ]1 d3 A9 C( T@for(nodes(i)sum(arcs(i,j):f(i,j))-@sum(arcs(j,i):f(j,i))=d(i));4 v4 V( W( \( I5 l
@for(arcsbnd(0,f,u));
: U9 O/ D8 S, i+ B7 y& bend8 p3 G& s' R) U% E, k) U* p

- i) j# z% @' E3 ~5 z' V) x求得最大流的最小费用是 205,而原最大流的费用为 210 单位,原方案并不是最优 的。 类似地,可以利用赋权邻接矩阵编程求得最小费用最大流。LINGO 程序如下:
' O7 J0 B* ~  }9 X( a# l8 u  X5 Q  j
model:
7 ~/ o! q7 X2 u9 `% A. i' ~% L/ Xsets:4 s* P4 _% E% |% C: k1 J
nodes/s,1,2,3,4,t/:d;
; v; y" Y9 G% |8 w1 Qarcs(nodes,nodes):c,u,f;$ g4 N8 D" F- {. z. I' P
endsets3 S4 o# w% Y9 Q% j
data:
0 {- `$ a3 h% R( z' z8 fd=14 0 0 0 0 -14;' p7 X& s& W9 ~8 j. ^  Z3 D; v
c=0; u=0;
- @& r4 F$ ~: S* A1 Xenddata) f% Q9 C% ]8 P! ~0 Z/ g. d
calc:
+ @8 M, B  O2 u9 @4 K# ?. mc(1,2)=2;c(1,4)=8;2 S! z# h5 \$ C2 {
c(2,3)=2;c(2,4)=5;
) v" j/ ^  t1 P( Dc(3,4)=1;c(3,6)=6;3 L5 r3 d$ u" ?* q1 u4 W' O! l+ [
c(4,5)=3;c(5,3)=4;c(5,6)=7;
9 M8 e" l8 t/ K* D9 \: l/ Qu(1,2)=8;u(1,4)=7;/ n+ k/ {# D6 C' @5 W
u(2,3)=9;u(2,4)=5;
+ E& W0 R' y0 A! Nu(3,4)=2;u(3,6)=5;
, J  p8 f& O" ~+ Cu(4,5)=9;u(5,3)=6;u(5,6)=10;
1 O& y: g, D3 U# o4 ~! \4 z- Dendcalc
0 ^# }, ]7 c' rmin=@sum(arcs:c*f);
0 f+ S# Q( J) o8 v' B, R( M@for(nodes(i)sum(nodes(j):f(i,j))-@sum(nodes(j):f(j,i))=d(i));
  m% m4 t$ {/ }4 q% y3 V@for(arcsbnd(0,f,u));% a- i# g4 \- c4 x0 K. Y0 X
end
2 E2 e" I' l( R4 R" g" _# M9 k2 U4 m( F
2 求最小费用流的一种方法—迭代法
+ D9 x$ N- Q; w2 `; u/ g0 t2 z# X这里所介绍的求最小费用流的方法叫做迭代法。这个方法是由 Busacker 和 Gowan 在 1961 年提出的。其主要步骤如下:
  e$ d" q, w+ E, b3 |. [1 e% c9 I  D/ y  \9 U7 S" L

1 k4 x) I+ M2 d& l6 x4 x' b5 K5 V0 G0 _- f7 ~7 u8 ?, W2 q
下面我们编写了最小费用最大流函数 mincostmaxflow,其中调用了利用 Floyd 算法 求最短路的函数 floydpath。
* ?; y9 X1 T- W; H, l* x$ O
) d+ K. O2 O+ x2 F2 m% E" d0 m求解例 19 具体程序如下(下面的全部程序放在一个文件中):+ d  J; {* C2 N

4 L6 w, w+ f" S( u* @function mainexample19
4 L+ j, Q" ?& l! [$ ^6 |0 `clear;clc; ! E6 m) k6 P1 {+ q9 T' n( k7 }7 `- J( u
global M num
% z+ p( x* l2 U4 N- nc=zeros(6);u=zeros(6);8 C! X6 K6 q& f. A
c(1,2)=2;c(1,4)=8;c(2,3)=2;c(2,4)=5;
3 J0 O6 h, n! I9 H' b) E4 {* Tc(3,4)=1;c(3,6)=6;c(4,5)=3;c(5,3)=4;c(5,6)=7;# f4 G  B( c7 u+ x# `: n
u(1,2)=8;u(1,4)=7;u(2,3)=9;u(2,4)=5;! m5 j5 N. g2 g" o
u(3,4)=2;u(3,6)=5;u(4,5)=9;u(5,3)=6;u(5,6)=10;
# k# S) g- B. R& k  ]' Cnum=size(u,1);M=sum(sum(u))*num^2;7 m4 A" Z& z4 {% C  {$ x- a7 h
[f,val]=mincostmaxflow(u,c)
( H1 G1 n: o% `/ j9 y%求最短路径函数
1 p& z% p0 P$ h# f5 d5 \function path=floydpath(w);
& J; g6 D" L* K: L8 U# R) o& k( gglobal M num
  L  E( u* A$ s, ew=w+((w==0)-eye(num))*M;
4 B( \9 `1 [; r. X- b: H' xp=zeros(num);
% W) k  `+ n3 V, hfor k=1:num
/ A( A2 C! H  l& R# t    for i=1:num$ {: }3 D; J5 Z
        for j=1:num/ K+ M6 g) O" L7 ^" s& }& L
            if w(i,j)>w(i,k)+w(k,j)8 ]6 Q! ?4 e7 ~& p4 }! [
                w(i,j)=w(i,k)+w(k,j);9 K0 o# w: q0 ]
                p(i,j)=k;9 D$ \& e* m4 c4 ]' i" s
            end
3 ]" E' R4 t; k% z# E- E" }        end
# y4 T0 E9 f/ U7 [" E! u- e# J& g    end
1 G& V- t# q& A5 O, }& ]end, y, q  B; W: N/ U8 Y' N
if w(1,num) ==M
& {# h3 D) X  `    path=[];* A. a4 `& ?" f  L
    else# G, m; e! Z: _3 P! P# i
    path=zeros(num);
. P% U/ H/ W$ y1 K6 }    s=1;t=num;m=p(s,t);- i$ |# E1 `$ Z/ ]
    while ~isempty(m)4 |, o9 D0 g! [
        if m(1)
2 t( j: x$ S: Y4 p+ p7 b            s=[s,m(1)];t=[t,t(1)];t(1)=m(1);
* b8 s7 K" H5 A% N% c8 R$ K            m(1)=[];m=[p(s(1),t(1)),m,p(s(end),t(end))];  J, P- \- j, V9 t' B
        else
7 o8 I4 ?# s5 p            path(s(1),t(1))=1;s(1)=[];m(1)=[];t(1)=[];$ `! M0 v+ e5 N) V( E% z4 j! ~
        end4 Y. T9 g" ~- r* f0 H' R
    end
" ~4 c; @8 V) r7 Pend
$ c1 j' `2 S+ u" M% o! r% q%最小费用最大流函数
0 y- Y% r. \# m4 R) qfunction [flow,val]=mincostmaxflow(rongliang,cost,flowvalue);
5 B& k. }7 @* H0 F8 b( V%第一个参数:容量矩阵;第二个参数:费用矩阵;# V0 q, B8 @' K: J1 X
%前两个参数必须在不通路处置零; g, G% ^# V, g; {2 \% s. U$ A
%第三个参数:指定容量值(可以不写,表示求最小费用最大流)7 S3 H& s( V9 H2 e8 n0 Y: h9 d
%返回值 flow 为可行流矩阵,val 为最小费用值: {! |. u2 Q/ w: Z$ d  t0 n
global M
5 y* k# I/ k0 _flow=zeros(size(rongliang));allflow=sum(flow(1,);
& J: t3 |, k3 F& x- bif nargin<3
3 Y- R# X4 u$ @! b* T- r0 b) ~% x    flowvalue=M;
( E( @1 y1 n' p: B2 F+ b! [end
% [$ I  i% ]  w( lwhile allflow<flowvalue
* s7 E; ]* ^" w, R; h5 ]! J" J5 g! b    w=(flow<rongliang).*cost-((flow>0).*cost)';
! p* S8 q1 }/ ^0 T) {' Y    path=floydpath(w);%调用 floydpath 函数
1 m0 a9 P9 g+ ]) p) }6 O/ }- N' }( R1 {    if isempty(path)
3 d% l6 W! O8 O3 \        val=sum(sum(flow.*cost));
# |: x9 J( ?+ ?        return;
6 J8 D8 `6 w5 \    end9 ^2 B$ q( K0 \/ P% n8 K. d& o
    theta=min(min(path.*(rongliang-flow)+(path.*(rongliang-flow)==0).*M));
' A5 J* f8 k- V3 `' w    theta=min([min(path'.*flow+(path'.*flow==0).*M),theta]);
% P8 R9 r' k$ w7 g: {+ R/ F0 i    flow=flow+(rongliang>0).*(path-path').*theta;  B3 q( G4 d' I1 J% ]
    allflow=sum(flow(1,);2 [0 I' v- ]5 f# w8 e. d. a: u
end
# l' _4 p" s& k0 M9 f( h/ Kval=sum(sum(flow.*cost)); 1 Q) w( t+ t# p

% p4 h3 {- C8 |1 G3 ?9 ~" x: s$ W8 ^$ J- H+ L3 X

) [9 c0 ?. m9 K6 R; K3 O* [* W4 k9 r8 N
————————————————
0 Q  T- |; w  |7 s: K" T' g$ Z: @版权声明:本文为CSDN博主「wamg潇潇」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
+ w" u3 q% P3 J, h( y' o& _1 ]原文链接:https://blog.csdn.net/qq_29831163/article/details/89787628
/ {0 p  W$ z; e0 f9 z* h3 ^& O9 A2 |& |  {4 E4 h  m- k
4 p/ v$ R3 c! O# g5 @/ E





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