数学建模社区-数学中国

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

作者: 浅夏110    时间: 2020-5-20 17:36
标题: 最小费用流及其求法
1 最小费用流% X# j, r. [# \8 v1 A  C
上面我们介绍了一个网络上最短路以及最大流的算法,但是还没有考虑到网络上流 的费用问题,在许多实际问题中,费用的因素很重要。例如,在运输问题中,人们总是 希望在完成运输任务的同时,寻求一个使总的运输费用最小的运输方案。这就是下面要 介绍的最小费用流问题。- Q6 o# ^9 k% |8 l$ A

0 T" V' F% f- g) r3 ?最小费用流问题的线性规划表示
. `: s5 w5 i6 g3 ~$ D在运输网络 N = (s,t,V, A,U) 中,设  是定义在 A 上的非负函数,它表示通过弧 (i, j) 单位流的费用。所谓最小费用流问题就是从发点到收点怎样以最小费用输送一已 知量为v( f ) 的总流量。 最小费用流问题可以用如下的线性规划问题描述:
( T+ J) k. q$ i* N4 e! {% ]2 a6 y  M
3 U/ _3 Y! O7 ?: C/ f% Q
) ~% h3 \" V6 [' s  Q; B
8 f5 `! I- v! q, G3 d9 E8 v( u* ]2 ^6 Z& F: n; B# d, n
      例 19(最小费用最大流问题)5 h* u9 b, t. u: T. @
(续例 18)由于输油管道的长短不一或地质等原因, 使每条管道上运输费用也不相同,因此,除考虑输油管道的最大流外,还需要考虑输油 管道输送最大流的最小费用。图 8 所示是带有运费的网络,其中第 1 个数字是网络的容 量,第 2 个数字是网络的单位运费。
$ ^8 |) K0 A5 G: i& V
' J8 w: }7 J" x! \4 F& h. k# n4 j' Y, P( p' I7 Y! y' ~

# |7 z( c5 s5 M. v5 i
: p# d5 ]/ x% [+ s; i) q2 S解 按照最小费用流的数学规划写出相应的 LINGO 程序如下:
$ \, @7 L1 I% t$ Q7 @' I, d/ jmodel:6 L6 t4 B2 _/ y5 J0 W
sets:
1 e7 c, W' K, U+ U, knodes/s,1,2,3,4,t/:d;
+ v* n0 }& l" ]8 farcs(nodes,nodes)/s 1,s 3,1 2,1 3,2 3,2 t,3 4,4 2,4 t/:c,u,f;
% p2 K" }' J) B' Qendsets
" K- X9 l" y, i& R+ hdata:) H, S& e8 P% b- ]
d=14 0 0 0 0 -14; !最大流为14;) Z% j7 j9 l1 x( S) H
c=2 8 2 5 1 6 3 4 7;
1 |; E9 c3 ~2 e0 R. Bu=8 7 9 5 2 5 9 6 10;: F) ]: h' ~5 A* X( ]
enddata
8 O# H# _, D3 a3 Hmin=@sum(arcs:c*f); 0 p7 L; O  M3 C% Q. N
@for(nodes(i)sum(arcs(i,j):f(i,j))-@sum(arcs(j,i):f(j,i))=d(i));
/ j0 K, Q: J, A- _5 X5 U; z@for(arcsbnd(0,f,u));
& S$ R4 L; f* l3 h% W  Vend( p8 n( M/ m3 \  I

5 ^/ J" {. J6 A3 Z1 S5 l求得最大流的最小费用是 205,而原最大流的费用为 210 单位,原方案并不是最优 的。 类似地,可以利用赋权邻接矩阵编程求得最小费用最大流。LINGO 程序如下:7 R& U  t. J6 v$ l/ ?1 ~

/ n$ n; T; o8 l+ fmodel:- k% X, x/ x, T7 f" |$ [* M
sets:
! u2 h3 Z' X- n. ~7 p# f' i, v& `nodes/s,1,2,3,4,t/:d;- ?9 E, }' {! P8 r
arcs(nodes,nodes):c,u,f;
) ?9 J  p2 N" p/ qendsets2 z+ R; D8 n* ]$ O& Z
data:
5 R0 |+ P% B# {, V- Md=14 0 0 0 0 -14;
3 D& ^) \8 v: _# e3 [c=0; u=0;
# y; D1 b. i% T2 ?3 J% _4 zenddata
3 M  l1 G0 P% g& \calc:
7 I: D8 v: H. u( O1 R0 rc(1,2)=2;c(1,4)=8;
4 p$ Q+ u) _& I5 z( Mc(2,3)=2;c(2,4)=5;3 U8 z6 D* W, r6 u3 E3 x$ c) t
c(3,4)=1;c(3,6)=6;; {0 q5 i/ W& u- O% i- r% u% t
c(4,5)=3;c(5,3)=4;c(5,6)=7;
3 s5 ^+ _6 J2 _, a# \" zu(1,2)=8;u(1,4)=7;6 m! u9 f% b) ~1 p- `
u(2,3)=9;u(2,4)=5;6 g0 T$ q$ o0 D3 x
u(3,4)=2;u(3,6)=5;
; x8 A/ I7 @0 l, p  pu(4,5)=9;u(5,3)=6;u(5,6)=10;
( D5 _; R3 g2 P$ `! C- ]endcalc
/ n9 s; S; q: B% Nmin=@sum(arcs:c*f);
" B! J% n# m  b' [2 y@for(nodes(i)sum(nodes(j):f(i,j))-@sum(nodes(j):f(j,i))=d(i));4 G4 N) c$ ]# u9 ~* z% J
@for(arcsbnd(0,f,u));6 r$ |+ e0 Q3 i: I8 E4 |- q4 t3 y; e
end ; T3 |" G6 ]! L9 ^$ m# p% N

( R2 f' S( @( X2 求最小费用流的一种方法—迭代法
$ y8 k2 r/ e7 ~这里所介绍的求最小费用流的方法叫做迭代法。这个方法是由 Busacker 和 Gowan 在 1961 年提出的。其主要步骤如下:& a" X& p, m8 P8 l

/ Y2 A, Q" y; n+ j' t. I% m. K6 p
3 ?7 ]& I9 `% N0 T9 F6 H4 L7 g" y2 n" h. ?+ ^8 E
下面我们编写了最小费用最大流函数 mincostmaxflow,其中调用了利用 Floyd 算法 求最短路的函数 floydpath。/ W' w. ]& w9 |7 b" O1 r0 s

( w- Y$ R1 C3 m( W求解例 19 具体程序如下(下面的全部程序放在一个文件中):
' {: ?- {& t7 c/ z- A- Z1 Q
" I2 Y* W  B. P' `6 gfunction mainexample19+ u& C; Y, q6 f0 F) H$ i4 W
clear;clc; % v. O" b; }' |8 [6 Y! l
global M num, w6 k  ]9 g+ [6 H2 K8 u. s
c=zeros(6);u=zeros(6);5 x' {2 \# ]% m3 r
c(1,2)=2;c(1,4)=8;c(2,3)=2;c(2,4)=5;
6 @# U9 ]9 i  S$ ]% U4 F- n. Wc(3,4)=1;c(3,6)=6;c(4,5)=3;c(5,3)=4;c(5,6)=7;
, w/ @; V" e4 f1 V+ R& ou(1,2)=8;u(1,4)=7;u(2,3)=9;u(2,4)=5;/ \7 X/ [# J# x6 ?  n, l6 `5 v
u(3,4)=2;u(3,6)=5;u(4,5)=9;u(5,3)=6;u(5,6)=10;
/ h+ c/ f  A) z- v9 @& I& @$ Dnum=size(u,1);M=sum(sum(u))*num^2;
# S; j2 `6 V0 c8 X$ i[f,val]=mincostmaxflow(u,c)6 C2 G. \9 _* _6 C7 Q
%求最短路径函数, c" h1 J* D, F( p! \: h
function path=floydpath(w);+ v0 w+ N6 C+ }% Y9 R$ f
global M num
: w3 r; h7 S& |2 K$ {0 G  T* B- @w=w+((w==0)-eye(num))*M;2 x3 N7 k# \/ L/ e9 D# ?, N
p=zeros(num);' Q/ [. Z; ~3 ^& p5 y% H9 |' J
for k=1:num
9 V. S' {! r6 Z* w8 j    for i=1:num1 {4 B, p0 x# N
        for j=1:num; f, }  F$ ?$ }
            if w(i,j)>w(i,k)+w(k,j)
6 X4 D# V3 ?# P* s! E& ?; K                w(i,j)=w(i,k)+w(k,j);
% {5 Y' y7 ?) ]% Q7 v& j                p(i,j)=k;
! N6 Q+ R( Q: O* w3 U* y            end
. s  N- l; u8 q( w8 k        end
6 c& h! `: f* [; b    end1 H  J- [2 N1 u" C( I
end
' c' }9 l3 H' R# ^if w(1,num) ==M+ b9 t& \/ j" d/ r
    path=[];
* _% O/ o* t8 ]$ z5 }6 U" z. z# e    else9 D# o5 `: K. a. ?
    path=zeros(num);
! V& y  g$ M; y1 ?    s=1;t=num;m=p(s,t);+ t9 I8 _0 s! @9 V/ R6 z
    while ~isempty(m); u2 _- a$ @- O, x" ]! `
        if m(1)
/ h; O& `, U+ ~# `& d) t            s=[s,m(1)];t=[t,t(1)];t(1)=m(1);9 r* u+ H$ }8 u; z- l
            m(1)=[];m=[p(s(1),t(1)),m,p(s(end),t(end))];# A- `, @% i* L0 M4 A1 d0 a# k
        else
# X, v0 V4 C: R: g" A0 [3 z0 p            path(s(1),t(1))=1;s(1)=[];m(1)=[];t(1)=[];
( x+ p. A2 s  s! A2 v. ~        end' ^; c4 `" U" F; p+ g
    end2 L1 T3 ^' v/ X2 v  Q1 v
end" B1 h6 J' R0 I6 |
%最小费用最大流函数/ H) I$ F' m% N& F1 V* m: h+ u( w
function [flow,val]=mincostmaxflow(rongliang,cost,flowvalue);
' d  R" n6 }& m%第一个参数:容量矩阵;第二个参数:费用矩阵;
3 m( c7 G" K) @9 g& ^: p+ D- C%前两个参数必须在不通路处置零
  Z( p! W& Y5 t8 n% J2 H! `%第三个参数:指定容量值(可以不写,表示求最小费用最大流)/ l" K6 J  b( y6 _; [% Q% P& X
%返回值 flow 为可行流矩阵,val 为最小费用值' L7 Z# f4 f& y4 C; ?& `
global M
  e2 i* @; J* ~% u* n4 ]flow=zeros(size(rongliang));allflow=sum(flow(1,);$ i! ]4 Y9 N$ h$ x: n! U
if nargin<32 f4 X, z6 W8 b/ |" W. u  z
    flowvalue=M;5 b3 u8 K- A: K3 T: W
end
) c, f0 p7 L$ h/ G% h) o1 U" [while allflow<flowvalue9 Y; I) G  j- o1 q# {) s* _
    w=(flow<rongliang).*cost-((flow>0).*cost)';' ^  l2 ~" F, W1 `' `' e1 F
    path=floydpath(w);%调用 floydpath 函数
: [  c! P1 W9 s" X4 r: {    if isempty(path)
  l) W9 }- i4 N' x: ?9 U& Z        val=sum(sum(flow.*cost));7 z: e4 k" ]2 x6 k
        return;6 C) @# }6 l: n7 O; g
    end- o5 V7 L% j1 \9 r
    theta=min(min(path.*(rongliang-flow)+(path.*(rongliang-flow)==0).*M));1 y( [+ a4 s0 Y7 V9 v
    theta=min([min(path'.*flow+(path'.*flow==0).*M),theta]);
- z+ A. k9 ]) M  v; F    flow=flow+(rongliang>0).*(path-path').*theta;- G0 O; j9 t$ y5 a, m. c
    allflow=sum(flow(1,);
/ Q% C* i) @: B$ E5 }+ W5 t% m: Oend8 y4 r7 a/ L2 `, \+ Q  G( X
val=sum(sum(flow.*cost)); / M/ `/ _& W9 ?9 A: z
$ A+ Q/ Q% U# }2 H5 I8 z2 G& P

; t. O% c6 P# G* e, a$ \9 C. |3 V3 [' h
* g6 ^! x6 Q' ~1 ^
————————————————( l. y  b3 I- v  r% ]3 r& e  c
版权声明:本文为CSDN博主「wamg潇潇」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。8 X- k7 }0 \# T- w. D3 L2 W
原文链接:https://blog.csdn.net/qq_29831163/article/details/89787628
8 Q# t  e4 o: g( L) d, a. k3 }4 x" ^  t! x5 D

6 R& j9 d0 i) C3 {& d5 J




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