数学建模社区-数学中国

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

作者: 浅夏110    时间: 2020-5-20 17:36
标题: 最小费用流及其求法
1 最小费用流
! T2 ?7 y% E# f  ?, z" B5 c' f上面我们介绍了一个网络上最短路以及最大流的算法,但是还没有考虑到网络上流 的费用问题,在许多实际问题中,费用的因素很重要。例如,在运输问题中,人们总是 希望在完成运输任务的同时,寻求一个使总的运输费用最小的运输方案。这就是下面要 介绍的最小费用流问题。
2 n% B" U3 a0 ]2 d) G" R% K( x
  z; H; s1 P' ^2 F! d4 A+ l* K最小费用流问题的线性规划表示' y; s' G' M0 P
在运输网络 N = (s,t,V, A,U) 中,设  是定义在 A 上的非负函数,它表示通过弧 (i, j) 单位流的费用。所谓最小费用流问题就是从发点到收点怎样以最小费用输送一已 知量为v( f ) 的总流量。 最小费用流问题可以用如下的线性规划问题描述:
" K4 y8 P9 Z7 J. w8 i( C! l! p( W+ `3 l( j" g, [+ a! `' w

4 V1 ~7 q+ q$ B' x4 n4 o% u; C) T& E9 B$ c
8 q9 P9 s# z+ s4 d
      例 19(最小费用最大流问题)
9 U6 u/ G: J: N) f(续例 18)由于输油管道的长短不一或地质等原因, 使每条管道上运输费用也不相同,因此,除考虑输油管道的最大流外,还需要考虑输油 管道输送最大流的最小费用。图 8 所示是带有运费的网络,其中第 1 个数字是网络的容 量,第 2 个数字是网络的单位运费。, n/ W9 @2 O6 Z) x5 x6 z
: D1 c3 ]- [) L% \5 W

) a3 G; k4 Z4 U5 j/ d2 V- {- J; U% Z4 |1 F+ J4 Q

% Q5 M: k% u1 C0 X& R解 按照最小费用流的数学规划写出相应的 LINGO 程序如下:# ?) S9 b! f! x# b* l
model:
) F, |; G$ b& i! l; a+ hsets:
9 L% ?9 J, h% B( @7 t5 xnodes/s,1,2,3,4,t/:d;  [+ N, Y# U! M+ X8 s$ _3 Z* e
arcs(nodes,nodes)/s 1,s 3,1 2,1 3,2 3,2 t,3 4,4 2,4 t/:c,u,f;) m! x5 {9 S/ i4 P2 o  Y6 D$ l
endsets8 M6 P; u3 x5 g( H" `5 G; _
data:3 c' `0 G+ i6 c# N, M" U% K
d=14 0 0 0 0 -14; !最大流为14;
) }/ X/ o9 A) }5 ^5 v' B; r! gc=2 8 2 5 1 6 3 4 7;1 S$ m# C/ z% `+ b
u=8 7 9 5 2 5 9 6 10;
3 D5 l2 m& b; p, ?enddata" ^% H! \5 Y5 N0 O2 o& ?: o+ ~  l
min=@sum(arcs:c*f); , X/ }4 e* P  a4 r! N# w' H+ n( a
@for(nodes(i)sum(arcs(i,j):f(i,j))-@sum(arcs(j,i):f(j,i))=d(i));5 A+ b# _' D- [; i3 y
@for(arcsbnd(0,f,u));
( s: P  y; Z% M/ o0 U1 f2 uend
3 J3 d4 S1 d8 ?( Y6 X9 O
$ J  D( e7 I* ]求得最大流的最小费用是 205,而原最大流的费用为 210 单位,原方案并不是最优 的。 类似地,可以利用赋权邻接矩阵编程求得最小费用最大流。LINGO 程序如下:
8 K7 q. u8 S7 n1 r5 N8 K! `: A, s7 h& D# [, C
model:# G3 f& F7 f/ w: o
sets:
/ p( C7 M  Q. F  R' m+ R1 e- E! e# cnodes/s,1,2,3,4,t/:d;
/ b+ W0 U; k1 v) [. Zarcs(nodes,nodes):c,u,f;! H5 Z, e# q6 _/ q, U% A$ X
endsets
8 W  y0 T) a) cdata:5 \; Q) H$ {" y0 M5 z
d=14 0 0 0 0 -14;5 D, f6 X! h1 g. U9 H
c=0; u=0;
/ x. p7 H; C+ Y7 Nenddata
! V+ S1 n$ S7 a' c8 ]calc:
( ^) a3 T6 |- D7 _/ _( Jc(1,2)=2;c(1,4)=8;2 c8 E% S' w0 P4 @: R, W! }
c(2,3)=2;c(2,4)=5;/ ^. F0 ?3 W# @& O. ]5 V
c(3,4)=1;c(3,6)=6;# U5 y# r  w1 H4 p& j7 Z" ]& Q6 e
c(4,5)=3;c(5,3)=4;c(5,6)=7;
- L. m* Y3 g( P, U8 qu(1,2)=8;u(1,4)=7;5 {, _# A1 q; K  r9 O
u(2,3)=9;u(2,4)=5;# W& y- h1 C0 |5 ]! M$ O. k- H: g
u(3,4)=2;u(3,6)=5;5 |; f" p& a" d# ]
u(4,5)=9;u(5,3)=6;u(5,6)=10;
" N0 a2 R# P9 \# w/ k- Dendcalc
1 v- G3 `6 Q3 y7 t( ^3 P8 W" Dmin=@sum(arcs:c*f);
% l. S: b$ |4 ?4 Y7 ^7 O@for(nodes(i)sum(nodes(j):f(i,j))-@sum(nodes(j):f(j,i))=d(i));
3 h+ r" f- ^  J; |2 o  e/ m@for(arcsbnd(0,f,u));7 I' F0 l" y, y2 T& }6 l
end
2 m8 ^. @- `: Q0 `$ R6 Q5 {
3 }5 ?! K. M/ t+ J& P2 求最小费用流的一种方法—迭代法: ^* X: }# K6 o! Q2 d9 K
这里所介绍的求最小费用流的方法叫做迭代法。这个方法是由 Busacker 和 Gowan 在 1961 年提出的。其主要步骤如下:
$ d  x& V) w' P& D2 X- u" ]
( u4 X7 p& z0 X4 Z: {4 G- u, |; Y5 H
7 y7 G$ z0 u; k* Q( v
下面我们编写了最小费用最大流函数 mincostmaxflow,其中调用了利用 Floyd 算法 求最短路的函数 floydpath。
0 {4 V: C- t: ?6 {! _2 E# G/ z' e3 k# a5 i7 ^+ r4 [
求解例 19 具体程序如下(下面的全部程序放在一个文件中):& c# y9 p9 g4 a1 G; ^! C
2 O" G# _1 K  H8 w6 V
function mainexample19) X+ |8 D# a, q, v+ M
clear;clc;
, V+ @6 H4 y# wglobal M num
3 i( d3 F' G( ?* mc=zeros(6);u=zeros(6);
" b( u7 ~" C2 ^+ r0 ~c(1,2)=2;c(1,4)=8;c(2,3)=2;c(2,4)=5;; t. B8 w; G  H- }$ t$ y8 Z" E2 k
c(3,4)=1;c(3,6)=6;c(4,5)=3;c(5,3)=4;c(5,6)=7;! ?: p( o5 }; B4 \! A1 e
u(1,2)=8;u(1,4)=7;u(2,3)=9;u(2,4)=5;2 A* l+ r% R& c: u  `7 p5 m" t, [
u(3,4)=2;u(3,6)=5;u(4,5)=9;u(5,3)=6;u(5,6)=10;9 c3 H4 ]7 V3 w+ N( u$ X
num=size(u,1);M=sum(sum(u))*num^2;
3 |$ I8 C' l. Z[f,val]=mincostmaxflow(u,c)
' z& J- ]' K' M9 C& d" B%求最短路径函数: w; A) N% o( I5 j; }
function path=floydpath(w);
! _! ~7 J" K( k4 e& D- @6 L) G) \global M num
% ]4 P5 U; x1 {w=w+((w==0)-eye(num))*M;
& X& H( p* L  Q. d8 Ep=zeros(num);
- _8 C( B. R5 U# Nfor k=1:num& T2 m/ H6 ]) {) \1 s: K; a
    for i=1:num
# B9 q5 [4 `' C* S# \0 ?        for j=1:num
$ e- v- _( G; p; j            if w(i,j)>w(i,k)+w(k,j)0 l3 @% }1 d/ N( Y  X3 Q
                w(i,j)=w(i,k)+w(k,j);
/ H  r* t3 l4 {7 y+ ~  @: h                p(i,j)=k;
9 i( H5 n' m% C            end
$ O0 l/ [* A- u" t9 x        end
8 g+ k# |& f$ c( m    end; ~7 v! q+ v8 ?0 T" U
end
# X& U2 w0 j8 w& E. xif w(1,num) ==M+ x' K$ g4 e$ Z! D
    path=[];* k# e/ `$ g) C2 m, e
    else
9 C. h6 W8 e, r& V* e    path=zeros(num);
1 i4 G$ W/ t8 R. v! j$ Q( q    s=1;t=num;m=p(s,t);
1 o6 W% S  `( f3 m6 ]    while ~isempty(m)& v1 o7 b# t. E9 x7 p* z
        if m(1)
8 Z* S3 p% L5 w1 y1 Z+ Y            s=[s,m(1)];t=[t,t(1)];t(1)=m(1);% G! Z. o# q1 |7 p
            m(1)=[];m=[p(s(1),t(1)),m,p(s(end),t(end))];
  n" y4 d) h# D1 k" Z        else) K) ^: y1 c% b6 I! z/ v0 t/ X
            path(s(1),t(1))=1;s(1)=[];m(1)=[];t(1)=[];
5 Q$ N1 y$ M( Q8 r$ v: t        end
$ a! t4 }  u: c' l    end
7 X8 A+ s# r# Zend3 h% D% \4 f6 \) c4 L1 d  m# ]
%最小费用最大流函数3 [8 Q3 j+ V6 X
function [flow,val]=mincostmaxflow(rongliang,cost,flowvalue);
+ e, X$ |% l1 O* F%第一个参数:容量矩阵;第二个参数:费用矩阵;5 g- h$ j' B$ |
%前两个参数必须在不通路处置零3 a2 E& h2 i. U! U
%第三个参数:指定容量值(可以不写,表示求最小费用最大流)
, X; }, J; u9 ]* n%返回值 flow 为可行流矩阵,val 为最小费用值! R8 l3 C: [6 X
global M
# s2 h3 D' i" z. q; g9 t+ Dflow=zeros(size(rongliang));allflow=sum(flow(1,);
2 q( v/ T" m6 ?4 v, n. F1 j0 pif nargin<3$ d0 c9 H+ E0 j" L9 X* s0 ]# e6 v
    flowvalue=M;6 s. P. i* ?9 I  H+ \0 a
end ( `4 N. F7 ~' y) B  |: I
while allflow<flowvalue7 K6 `/ i/ O) s3 O- q$ L
    w=(flow<rongliang).*cost-((flow>0).*cost)';, i* P8 h/ v7 N# A) D
    path=floydpath(w);%调用 floydpath 函数  x* h  F; e4 M+ D- Q5 {& l) O
    if isempty(path)
" a1 S5 v  H' Z. Q3 B        val=sum(sum(flow.*cost));
2 \0 ?  Y! p4 _$ A1 p+ Z% Y        return;
, {' {/ _( ~6 B% c) r6 @6 g    end9 j& I! F+ [( P; r, Q9 \  Q
    theta=min(min(path.*(rongliang-flow)+(path.*(rongliang-flow)==0).*M));
' D0 \- v8 }# k, ^& N' e    theta=min([min(path'.*flow+(path'.*flow==0).*M),theta]);0 O, C* j. g3 j) ^, W
    flow=flow+(rongliang>0).*(path-path').*theta;
$ Z2 d2 F4 }% q( F! q    allflow=sum(flow(1,);. j6 M4 `7 l. ^' C# D3 @
end
4 c. n3 a% e  t* l; S/ @3 Bval=sum(sum(flow.*cost)); 0 t. g0 i# {$ m( r4 N
0 ?) f9 h9 u6 R! l. \  k( [( t

, [: ?' L7 U( r  y  X' F( P  z; {/ p: B- C: B( d
. f5 w8 Q3 Q6 T6 b) f# ?6 Z
————————————————( K$ K' s9 k; B: E( b
版权声明:本文为CSDN博主「wamg潇潇」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。( o% k3 K5 N! a" Q9 U/ H; Y
原文链接:https://blog.csdn.net/qq_29831163/article/details/89787628* {8 N& U! t. c; ^

1 c0 v9 r9 `1 c1 _7 |& H. r0 N; G/ m6 ^+ H





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