数学建模社区-数学中国

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

作者: 浅夏110    时间: 2020-5-20 17:36
标题: 最小费用流及其求法
1 最小费用流
3 p4 r5 S7 @2 b5 s" ~; Q5 W上面我们介绍了一个网络上最短路以及最大流的算法,但是还没有考虑到网络上流 的费用问题,在许多实际问题中,费用的因素很重要。例如,在运输问题中,人们总是 希望在完成运输任务的同时,寻求一个使总的运输费用最小的运输方案。这就是下面要 介绍的最小费用流问题。! @; a! |$ U) i' Y2 Y3 T

  I! K% q9 b, f* j% |$ J  P最小费用流问题的线性规划表示
$ ]. f" ?' I/ ?$ k3 r7 L在运输网络 N = (s,t,V, A,U) 中,设  是定义在 A 上的非负函数,它表示通过弧 (i, j) 单位流的费用。所谓最小费用流问题就是从发点到收点怎样以最小费用输送一已 知量为v( f ) 的总流量。 最小费用流问题可以用如下的线性规划问题描述:
& P+ b  @) r! a) s* @
7 d  V& W/ ?! x/ A
7 f4 ?/ N) n+ w$ T  w3 s% o6 s. x; H3 N8 t0 [+ a; [' H8 ~
& G3 R7 i1 D# L% M  P0 k
      例 19(最小费用最大流问题)
, P. K7 _6 r( U' f' x. R(续例 18)由于输油管道的长短不一或地质等原因, 使每条管道上运输费用也不相同,因此,除考虑输油管道的最大流外,还需要考虑输油 管道输送最大流的最小费用。图 8 所示是带有运费的网络,其中第 1 个数字是网络的容 量,第 2 个数字是网络的单位运费。. A: X8 ?: \6 v  [; a
" L2 v  {5 l  L! ]. |
* ^! I" {" S  r0 x9 u( S2 ^

9 H# Z: N+ i: c) Q4 [2 s5 {" w
$ l! a" N  c9 n: x  z: R) v: K解 按照最小费用流的数学规划写出相应的 LINGO 程序如下:+ r. ?. h9 m  g
model:! b; E; v# ^$ |8 H; \
sets:
) b4 |4 a3 s8 J% w, \* znodes/s,1,2,3,4,t/:d;% e$ d! V4 S( |5 D
arcs(nodes,nodes)/s 1,s 3,1 2,1 3,2 3,2 t,3 4,4 2,4 t/:c,u,f;
/ }4 w. `7 N) j1 i1 {endsets
5 }- B, Q3 |, x) `$ ]/ Qdata:
$ E" h! {4 \8 T. |! i. m, Cd=14 0 0 0 0 -14; !最大流为14;- ~, r) |; \9 _; c1 v3 ?
c=2 8 2 5 1 6 3 4 7;
6 }! H9 A6 C0 `u=8 7 9 5 2 5 9 6 10;2 U: S: X9 ^) K8 K2 m# V
enddata4 H' D2 b" x( a; B1 a8 B
min=@sum(arcs:c*f);
9 }- ^/ b% Y4 G$ ?0 y5 U3 }% m; q@for(nodes(i)sum(arcs(i,j):f(i,j))-@sum(arcs(j,i):f(j,i))=d(i));
" q! g& c# `6 t3 y  j9 T@for(arcsbnd(0,f,u));
/ g- h# B; @0 S8 e. a9 j. V/ n/ \end
) h4 B) E  d+ a- \+ \( f2 ~$ a
% {1 C2 z( W/ q& t" X求得最大流的最小费用是 205,而原最大流的费用为 210 单位,原方案并不是最优 的。 类似地,可以利用赋权邻接矩阵编程求得最小费用最大流。LINGO 程序如下:
. I, N+ y( _4 M7 K8 u+ U. m- G5 |& @) h1 W  w+ P
model:
7 b% r' n5 e; a3 F9 Rsets:8 z2 Q0 m/ R& f0 w7 ?
nodes/s,1,2,3,4,t/:d;5 Q: r5 p$ s) I0 ], ]
arcs(nodes,nodes):c,u,f;
" G0 X, ]. Y4 P6 U# K* ]endsets
; f7 `( @7 b5 y! O, R0 Y7 Zdata:7 r$ i5 Y- U3 K1 L+ v
d=14 0 0 0 0 -14;
0 J+ W$ w) u4 s7 m. f+ W+ r4 }c=0; u=0;
4 z' A3 P, ^. t3 G. I4 a/ }enddata
' v  }- q, ~. `$ ^  u/ vcalc:2 [5 j4 h" S0 y
c(1,2)=2;c(1,4)=8;
% {2 b4 V: y6 b- ]$ _6 f7 qc(2,3)=2;c(2,4)=5;
. B/ s  k' P: m4 d% M4 g& b- [c(3,4)=1;c(3,6)=6;
% |  h' z0 U0 z: f- G$ y5 I* gc(4,5)=3;c(5,3)=4;c(5,6)=7;4 b. T( z& C6 W7 [2 S& O
u(1,2)=8;u(1,4)=7;
/ u2 k* |- o7 {. F' _u(2,3)=9;u(2,4)=5;
+ K. t# Q$ z0 J! r/ }" `) Ru(3,4)=2;u(3,6)=5;
6 K3 {6 U2 e4 _6 i3 Vu(4,5)=9;u(5,3)=6;u(5,6)=10;" [& O; P' ]6 J& Q$ s; {
endcalc
/ s$ y, C4 [4 y/ l/ O+ U  U( F* Mmin=@sum(arcs:c*f);4 u3 F  `% v! N7 i$ \7 D
@for(nodes(i)sum(nodes(j):f(i,j))-@sum(nodes(j):f(j,i))=d(i));
9 q2 e, z. w$ R6 e- U  H. x* Q, |/ G@for(arcsbnd(0,f,u));6 R+ Q( Z, ~4 B
end - d% ^! _/ \  H5 c
/ a' D+ N9 c. B' ?
2 求最小费用流的一种方法—迭代法
4 W# b5 t( _3 e) t1 j这里所介绍的求最小费用流的方法叫做迭代法。这个方法是由 Busacker 和 Gowan 在 1961 年提出的。其主要步骤如下:9 K7 J5 T0 a3 `( g+ y" b/ l

: u& S9 B8 T5 X) s
$ t& @0 l* y9 U8 w0 u% I5 l4 L0 m) s9 o8 m2 r6 K* n' ]8 y
下面我们编写了最小费用最大流函数 mincostmaxflow,其中调用了利用 Floyd 算法 求最短路的函数 floydpath。
4 D$ p5 [+ b* z2 H
+ V( M$ v4 p0 v0 v5 O9 `# P6 u求解例 19 具体程序如下(下面的全部程序放在一个文件中):
' `( a' h3 F2 X% Y
0 B' t6 P+ ^/ F+ Hfunction mainexample191 b" i4 n0 B! Z# A6 Z6 V
clear;clc; ) |0 c+ ]+ Y' m% e6 O( j. r" x$ r
global M num' A9 G) J  v; C7 {
c=zeros(6);u=zeros(6);
- l" [  d$ B, c) P2 Nc(1,2)=2;c(1,4)=8;c(2,3)=2;c(2,4)=5;  m% c7 b* L& u4 o  K
c(3,4)=1;c(3,6)=6;c(4,5)=3;c(5,3)=4;c(5,6)=7;
0 V1 l3 f' y; S! x- xu(1,2)=8;u(1,4)=7;u(2,3)=9;u(2,4)=5;
/ X) B0 p7 \- Wu(3,4)=2;u(3,6)=5;u(4,5)=9;u(5,3)=6;u(5,6)=10;* S+ X3 r6 }% ?# f
num=size(u,1);M=sum(sum(u))*num^2;3 w0 G% o- F1 G5 e/ I, L
[f,val]=mincostmaxflow(u,c)% U* R8 e, e  L. O2 o( m# ^
%求最短路径函数- m: r! B# f0 }, v& z- o
function path=floydpath(w);/ K) m  z. b/ p( v4 \" [) m
global M num
0 M4 i2 p7 m6 a! aw=w+((w==0)-eye(num))*M;; U$ ~8 n5 R; ~2 H
p=zeros(num);
9 |) t  K4 z0 _$ A. @for k=1:num+ M2 D; B9 V2 v. Y; {
    for i=1:num
' Y$ e( ~4 c/ [4 a        for j=1:num- ~) i% s* y' }  U8 o- Y* p/ o
            if w(i,j)>w(i,k)+w(k,j)
( P7 V. \9 }2 ~' B  L! @                w(i,j)=w(i,k)+w(k,j);
. N1 Y+ P9 R& c0 l                p(i,j)=k;
4 {( k$ `$ {' p. K$ X            end
. y, v* F. R7 k1 {9 B2 k        end
' `0 [0 V9 ^0 }) T    end
$ P' D% B" a, i; Iend
; r1 K0 s8 N/ s4 N% }if w(1,num) ==M" W( |! f  e. R* T
    path=[];6 I' Z! d! E# g, Q3 J  |$ }
    else0 k! s/ o7 s" f! \- A
    path=zeros(num);
9 V( n  J+ {8 C2 }8 L$ M3 H; c    s=1;t=num;m=p(s,t);
; q% b0 ^" J6 R- r$ W) O  Z    while ~isempty(m)
& W% P. z0 n4 B7 d        if m(1)
% `' p$ `" L$ U+ _2 F            s=[s,m(1)];t=[t,t(1)];t(1)=m(1);
$ @* H8 G6 z. N1 y' E9 H            m(1)=[];m=[p(s(1),t(1)),m,p(s(end),t(end))];/ f4 f. a" d" B' A0 r: n+ F
        else$ e2 S& K1 C; Y1 Y  b
            path(s(1),t(1))=1;s(1)=[];m(1)=[];t(1)=[];( d. `( Q7 Y$ B5 l; k9 f, d
        end! j1 Q4 U+ ]/ B+ X
    end; L; L  q1 s( [! J; i) d
end
  L: A. u7 Q, j& E%最小费用最大流函数
" U4 m( q" C' C  i" V$ s2 V9 zfunction [flow,val]=mincostmaxflow(rongliang,cost,flowvalue);
- L+ _) r; e5 ^5 O5 n& O9 W%第一个参数:容量矩阵;第二个参数:费用矩阵;  `2 u: J- C& i: j4 I
%前两个参数必须在不通路处置零/ E. ^2 p7 O! `# O$ `2 u
%第三个参数:指定容量值(可以不写,表示求最小费用最大流)2 E+ _5 P1 g5 P' a' C
%返回值 flow 为可行流矩阵,val 为最小费用值- f/ B( g' y# d: x3 ?
global M
0 k" l$ ?+ S" ~4 K2 P8 Hflow=zeros(size(rongliang));allflow=sum(flow(1,);1 e% R. e  J4 U% R  {+ N
if nargin<31 \3 h4 ?8 r. N! c
    flowvalue=M;
  q, H$ }* `* `# ^8 ~end
9 I$ U1 L+ v9 {7 x9 ?while allflow<flowvalue# d- C- y( R9 M
    w=(flow<rongliang).*cost-((flow>0).*cost)';5 o; g0 j/ P7 s: s
    path=floydpath(w);%调用 floydpath 函数
' ^6 W) ^0 Z$ x9 y: \: E    if isempty(path)
: u2 ~7 r7 o' P  t4 q3 Q+ p6 n        val=sum(sum(flow.*cost));
' p, c, f  Y- G3 J0 r) `        return;, a7 |# I7 t+ \3 c6 {8 [
    end7 F, x2 v  b7 a1 W+ A" l% b2 _. _) ~
    theta=min(min(path.*(rongliang-flow)+(path.*(rongliang-flow)==0).*M));, @, W+ }1 V2 P4 L: O; _3 v. d
    theta=min([min(path'.*flow+(path'.*flow==0).*M),theta]);+ M" N2 F3 @. @) Z) r
    flow=flow+(rongliang>0).*(path-path').*theta;
8 ]- q; c) ]8 b    allflow=sum(flow(1,);# y; r+ n* n! h) z3 E
end0 h0 e" U* o# \- V
val=sum(sum(flow.*cost));
5 P5 `7 n$ W4 }1 L9 R# O' I- K, o4 j. U( ]5 i8 [7 V* m

- l" R, s" c+ l) n' p# S9 y  r) z! ]+ U' t! K( [) z1 U
& m' {6 k# r( {
————————————————& {4 T, ~* m; O. p' ^0 b) E
版权声明:本文为CSDN博主「wamg潇潇」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
0 c2 A4 Z# z5 n原文链接:https://blog.csdn.net/qq_29831163/article/details/89787628
. k6 |5 @' ]. q- y' R! U
" R6 C5 o, K& ?7 D; e; |' P
9 J2 ~! n( r" u7 f2 R




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