数学建模社区-数学中国

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

作者: 浅夏110    时间: 2020-5-20 17:36
标题: 最小费用流及其求法
1 最小费用流, w% ~6 L/ C3 }; W" z
上面我们介绍了一个网络上最短路以及最大流的算法,但是还没有考虑到网络上流 的费用问题,在许多实际问题中,费用的因素很重要。例如,在运输问题中,人们总是 希望在完成运输任务的同时,寻求一个使总的运输费用最小的运输方案。这就是下面要 介绍的最小费用流问题。9 d9 q8 T7 A' }- z* X9 A8 j# N0 |: @
. i, |$ _( i2 a% h
最小费用流问题的线性规划表示
9 u6 L- m' T4 H" |# H8 |5 j7 f在运输网络 N = (s,t,V, A,U) 中,设  是定义在 A 上的非负函数,它表示通过弧 (i, j) 单位流的费用。所谓最小费用流问题就是从发点到收点怎样以最小费用输送一已 知量为v( f ) 的总流量。 最小费用流问题可以用如下的线性规划问题描述:3 s3 G. z6 B8 e2 G% U6 W) `
/ h/ v7 ?  n6 L! O% S% z

' q" r: A) D% `! [1 u
9 a) C0 \9 o/ n4 t- W; a$ L' i3 p  k  j( r; b
      例 19(最小费用最大流问题)
  H5 X- m. M1 }(续例 18)由于输油管道的长短不一或地质等原因, 使每条管道上运输费用也不相同,因此,除考虑输油管道的最大流外,还需要考虑输油 管道输送最大流的最小费用。图 8 所示是带有运费的网络,其中第 1 个数字是网络的容 量,第 2 个数字是网络的单位运费。
" b: E# Y2 I& |$ H/ I9 E3 _3 {
# ]3 H% V6 g4 S7 m! C

( @/ a7 A- [! ^  u" j1 S0 I5 R
$ t/ r7 U3 s9 m9 [: K& P解 按照最小费用流的数学规划写出相应的 LINGO 程序如下:& g4 o8 v8 T/ `3 l+ N; Q! Z
model:
. Z) P" \8 I. X8 O" K( {sets:. Q# h6 ^- F& j# R5 t% A
nodes/s,1,2,3,4,t/:d;7 a( p$ n& y( n  K% u1 w
arcs(nodes,nodes)/s 1,s 3,1 2,1 3,2 3,2 t,3 4,4 2,4 t/:c,u,f;
: n- S+ l# ]4 F0 |/ Gendsets
. x& J9 K8 @6 p% zdata:5 N* m( z" {) I  h
d=14 0 0 0 0 -14; !最大流为14;. a0 x) V5 v+ `! u% p) U9 O
c=2 8 2 5 1 6 3 4 7;
8 r$ A. K. k" ^6 a5 i  B  m2 Lu=8 7 9 5 2 5 9 6 10;
! ]9 a8 [9 w" @1 P8 [' O+ \2 I/ X! M$ Uenddata
# q2 \# ~5 x/ T" Bmin=@sum(arcs:c*f);
* }) R* R% [- @% [. f7 \1 v0 E$ l@for(nodes(i)sum(arcs(i,j):f(i,j))-@sum(arcs(j,i):f(j,i))=d(i));: X+ V6 Y; D3 a3 e2 b5 S$ d, @) D* a
@for(arcsbnd(0,f,u));6 e7 j4 H: B0 ?) W8 [$ p
end
& p3 n$ m& [2 w9 {! S9 b6 i8 w  t5 q) l7 V$ b: k
求得最大流的最小费用是 205,而原最大流的费用为 210 单位,原方案并不是最优 的。 类似地,可以利用赋权邻接矩阵编程求得最小费用最大流。LINGO 程序如下:
) F# S& y9 l* v4 K- |& U3 K- n0 a2 g5 d6 A
model:
3 o' B2 |) H0 M$ S) y1 t9 ?sets:
2 @  x+ ~6 x' G. q1 Y! \nodes/s,1,2,3,4,t/:d;
1 J' j3 X! t8 N4 i7 a5 Aarcs(nodes,nodes):c,u,f;
9 G/ [, x6 e5 Cendsets
6 L# q7 H, X; A6 Sdata:
& t0 T0 r: b" W5 ~6 o% f( w" g$ yd=14 0 0 0 0 -14;  @0 U5 d9 V, }/ f& s  R3 N
c=0; u=0;
3 r1 K9 W; b, r9 [# A8 Cenddata
3 ^9 [! C/ x1 L$ ?6 B; Scalc:! K: @4 \0 d2 L$ j
c(1,2)=2;c(1,4)=8;: U0 D; L1 }! ^+ a( V
c(2,3)=2;c(2,4)=5;. f0 f" K! P& p( @0 N- M9 x
c(3,4)=1;c(3,6)=6;( C0 ~7 v7 x3 V; ~. i
c(4,5)=3;c(5,3)=4;c(5,6)=7;
' u- Z# R" I, [1 Au(1,2)=8;u(1,4)=7;! Y$ @* [# {; N( i4 d0 c' }1 T4 H
u(2,3)=9;u(2,4)=5;
8 h( I+ Z$ V2 E$ e# `u(3,4)=2;u(3,6)=5;" O$ `/ o4 c. J& Q6 d
u(4,5)=9;u(5,3)=6;u(5,6)=10;- _* I& b: F- m' I, e) M( U4 M
endcalc
0 a5 U, r7 N2 c7 M4 Fmin=@sum(arcs:c*f);
. H( m( P) z4 A6 T- u% S@for(nodes(i)sum(nodes(j):f(i,j))-@sum(nodes(j):f(j,i))=d(i));
  v( U8 T  Q" R3 B@for(arcsbnd(0,f,u));
" X. V9 J2 s* E4 Y  E; Jend 9 q( E. t; z0 b0 v- I' G

* p3 `8 @! @3 X$ F* _# U; E2 求最小费用流的一种方法—迭代法- b$ B( N8 W# E- `) ~, Y4 G
这里所介绍的求最小费用流的方法叫做迭代法。这个方法是由 Busacker 和 Gowan 在 1961 年提出的。其主要步骤如下:
3 I8 S. H" y6 F4 C* K; k
' r- e; t0 j8 [5 X8 N- R. r& |; ^
- u3 I. ^8 ~# o: q
下面我们编写了最小费用最大流函数 mincostmaxflow,其中调用了利用 Floyd 算法 求最短路的函数 floydpath。2 E" O' w  {: e2 p, N8 a* f
7 v: f- a7 ^- c1 G" o1 N* T) s
求解例 19 具体程序如下(下面的全部程序放在一个文件中):
: J, {- b5 M9 i7 {* G5 |6 d4 j. r" ]5 T5 J9 N! U/ \
function mainexample198 f8 {9 W8 U: O
clear;clc;
* m$ Q5 J! g- S. E9 L% i; }global M num
( ?* S3 W# u" r+ W6 mc=zeros(6);u=zeros(6);
6 D& D0 k; u1 V4 R! v" S. n" ~" lc(1,2)=2;c(1,4)=8;c(2,3)=2;c(2,4)=5;1 h: o  [) c* @- e4 I- r# f6 [
c(3,4)=1;c(3,6)=6;c(4,5)=3;c(5,3)=4;c(5,6)=7;( v2 Z+ V; u! d+ u2 A, a: W
u(1,2)=8;u(1,4)=7;u(2,3)=9;u(2,4)=5;
# G6 `8 _/ j" Uu(3,4)=2;u(3,6)=5;u(4,5)=9;u(5,3)=6;u(5,6)=10;  j  l, E  s0 [7 \- ~; P/ G
num=size(u,1);M=sum(sum(u))*num^2;% a: D. x/ `: T" _! Y. H/ s, c" ?
[f,val]=mincostmaxflow(u,c)8 j  P- d" B3 W: r) D  N
%求最短路径函数
3 g0 K3 d1 i5 B$ S7 nfunction path=floydpath(w);
) {7 X) g# z: p! V* S# w5 K4 Sglobal M num
/ `$ O- g$ J0 ~w=w+((w==0)-eye(num))*M;  y% u$ P' r  y1 H
p=zeros(num);
9 Q  l  B. F& a5 \for k=1:num
5 D& b1 C# v7 H0 q. G    for i=1:num
8 v1 T" o3 U) K  _2 {2 o2 \        for j=1:num0 p$ d0 U+ c8 e7 i
            if w(i,j)>w(i,k)+w(k,j)) g4 m* ^4 d1 c; N
                w(i,j)=w(i,k)+w(k,j);9 `# r, M3 X$ `* X' _7 u' l* Q
                p(i,j)=k;/ D0 c# f( x" k" |
            end
- w& l* E4 ?6 i$ }        end) z: y6 Z; [/ v  S5 W
    end+ C) Y2 ]8 q( O
end7 j: n$ d( ~) W& u
if w(1,num) ==M8 t7 w3 V8 {, ?+ N/ e5 X
    path=[];
5 e5 |1 r' B0 f1 N8 `0 H- ^$ g1 y" s    else4 h/ u  Q& t3 f6 ^; _* F
    path=zeros(num);! Z- c8 v4 w; I8 Q- }: V
    s=1;t=num;m=p(s,t);  H0 M3 j9 [6 @
    while ~isempty(m)7 I4 v9 r  K7 U
        if m(1)$ x% x! w7 |6 I1 Q
            s=[s,m(1)];t=[t,t(1)];t(1)=m(1);
, |, H2 ~1 U; ~$ M( ?# K% v            m(1)=[];m=[p(s(1),t(1)),m,p(s(end),t(end))];
. H' Q  h+ ^: u) k* q% g        else
3 W9 r) D, w6 I( T4 a1 v            path(s(1),t(1))=1;s(1)=[];m(1)=[];t(1)=[];
! _; o, D& @) m& H/ B        end5 _8 r2 t) }+ v5 k
    end
3 w/ M' r% t/ [8 Pend; [3 d# X* U; i% A6 v
%最小费用最大流函数
* _1 w6 L4 O3 X9 n8 f5 j+ ]function [flow,val]=mincostmaxflow(rongliang,cost,flowvalue);
) ^. a% H3 H7 P+ n& i  {%第一个参数:容量矩阵;第二个参数:费用矩阵;
0 [7 K! Y* ?0 s% S' n%前两个参数必须在不通路处置零
7 Y5 H; r/ @% u5 t) \' U" Y. J3 _2 {%第三个参数:指定容量值(可以不写,表示求最小费用最大流)% i0 J+ {% ?, C
%返回值 flow 为可行流矩阵,val 为最小费用值( B! a- F% G4 }: U
global M
* k1 H9 X) I2 d5 _3 Oflow=zeros(size(rongliang));allflow=sum(flow(1,);
. ]+ A& R2 Q9 w6 |! C! sif nargin<3
0 h0 {! G' m# K" H5 d% [1 j    flowvalue=M;8 n$ ^. _- J0 f8 J! b; ^2 A" Q
end
! ?1 L, o4 f& Z$ Swhile allflow<flowvalue
/ U! I* y& e) m/ Y2 o    w=(flow<rongliang).*cost-((flow>0).*cost)';. |/ i( @; d$ N
    path=floydpath(w);%调用 floydpath 函数+ L: X. z7 G+ e; M
    if isempty(path)
" `- P$ d4 M$ s6 u        val=sum(sum(flow.*cost));2 d" Y* `# @2 ~1 h; G
        return;
, f8 B" o* W. @* @& N' [, j    end
* R' O4 N) T5 P) y% v+ w( j    theta=min(min(path.*(rongliang-flow)+(path.*(rongliang-flow)==0).*M));
4 P. }$ T% o* z& y    theta=min([min(path'.*flow+(path'.*flow==0).*M),theta]);' Y+ g* l' M; _* {" e! g
    flow=flow+(rongliang>0).*(path-path').*theta;2 O% e4 a* q( P+ ^, [
    allflow=sum(flow(1,);. ?4 v" M6 w# n0 F" _2 y( w& p
end$ b, ?2 T" Q0 O  f) }- U0 g
val=sum(sum(flow.*cost));
" O& ~4 ^2 E3 s
% n& a1 o. k. D# O" b, V& V" Z. ?
8 I6 J9 H% M1 W3 v9 Y8 i2 N& G+ g( N* w/ U. m/ l1 S1 W4 @

1 o; b& n: |  R* U* Z; `————————————————! K) V2 q' x* ^, V
版权声明:本文为CSDN博主「wamg潇潇」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
2 P, ~& V. a" h2 G- @2 ^原文链接:https://blog.csdn.net/qq_29831163/article/details/89787628. [) `3 [- t* e7 v
5 i* l4 u2 T4 h3 V2 ^

0 m# ?. n& A3 T& U9 j3 {: M




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