5-5 最小费用最大流问题-xfj

合集下载

最小费用最大流

最小费用最大流
最小费用最大流
Spfa实现
概念
• 网络流图论中的一种理论与方法,研究网络 上的一类最优化问题 。 • 所谓网络或容量网络指的是一个连通的赋权 有向图 D=(V、E、C) , 其中V 是该图的 顶点集,E是有向边(即弧)集,C是弧上的容 量。此外顶点集中包括一个起点和一个终点。 网络上的流就是由起点流向终点的可行流, 这是定义在网络上的非负函数,它一方面受 到容量的限制,另一方面除去起点和终点以 外,在所有中途点要求保持流入量和流出量 是平衡的。
(3,3,1)
v0
(2,2,1) v3
(1,1,1)
(4,6,0)
v2
(2,3,0) (2,2,0)
(9,3,0) v5
(3,4,0)
如果 f 是可行流,则对收、发点vt、vs有
∑fsi =∑fjt =Wf ,
即从vs点发出的物质总量 = vt点输入的量.Wf 称为网络流 f 的总流量.
上述概念可以这样来理解,如G是一个运输网络,则 发点vs表示发送站,收点vt表示接收站,中间点vk表示中间 转运站,可行流 fij 表示某条运输线上通过的运输量,容量 Cij表示某条运输线能承担的最大运输量,Wf 表示运输总 量.
将各弧的单位运费作为长度,求v0到vn的最短 增流路v0v1v3v4vn,路长为8,可增加1单位的 流值。
v1
(4,3,0)
v4 (2,5,0) vn
(3,3,0)
v0
(2,2,0) v3
(1,1,0)
(4,6,0)
v2
(2,3,0) (2,2,0)
(9,3,0) v5
(3,4,0)
将各弧的单位运费作为长度,求v0到vn的最短 增流路v0v1v3v4vn,路长为8,可增加1单位的 流值。

网络流:最小费用最大流(最简单的算法)

网络流:最小费用最大流(最简单的算法)

网络流:最小费用最大流(最简单的算法)最小费用流在OI 竞赛中应当算是比较偏门的内容,但是NOI2008 中employee 的突然出现确实让许多人包括zkw 自己措手不及。

可怜的zkw 当时想出了最小费用流模型,可是他从来没有实现过,所以不敢写,此题0 分。

zkw 现在对费用流的心得是:虽然理论上难,但是写一个能AC 题的费用流还算简单。

先贴一个我写的employee 程序:只有不到70 行,费用流比最大流还好写~程序代码:C++#include <cstdio>#include <cstring>using namespace std;const int maxint=~0U>>1;int n,m,pi[550]={0},cost=0;bool v[550]={0};struct etype{int t,c,u;etype *next,*pair;etype(){}etype(int t_,int c_,int u_,etype* next_):t(t_),c(c_),u(u_),next(next_){}void* operator new(unsigned,void* p){return p;}} *e[550],*eb[550];int aug(int no,int m){if(no==n)return cost+=pi[1]*m,m;v[no]=true;for(etype *&i=e[no];i;i=i->next)if(i->u && !v[i->t] && pi[i->t]+i->c==pi[no])if(int d=aug(i->t,m<i->u?m:i->u))return i->u-=d,i->pair->u+=d,d;return 0;}bool modlabel(){int d=maxint,c;for(int i=1;i<=n;++i)if(v[i])for(etype *j=eb[i];j;j=j->next)if(j->u && !v[j->t])if((c=j->c-pi[i]+pi[j->t])<d)d=c;if(d==maxint)return false;for(int i=1;i<=n;++i)if(v[i])pi[i]+=d,e[i]=eb[i];return true;}int main(){freopen("costflow.in","r",stdin);freopen("costflow.out","w",stdout);scanf("%d %d",&n,&m);etype *Pe=new etype[m+m];while(m--){int s,t,c,u;scanf("%d%d%d%d",&s,&t,&u,&c);e[s]=new(Pe++)etype(t, c,u,e[s]);e[t]=new(Pe++)etype(s,-c,0,e[t]);e[s]->pair=e[t];e[t]->pair=e[s];}memmove(eb,e,sizeof(e));do do memset(v,0,sizeof(v));while(aug(1,maxint));while(modlabel());printf("%d\n",cost);return 0;}程序代码:CB大牛翻译的PASCALvarn,m,i,l,s,t,c,cost,u:longint;v:array[0..600]of boolean;dis:array[0..600]of longint;e_n,e_t,e_c,e_u,e_p,e_x:array[0..250000]of longint;function min(a,b:longint):longint;beginif a>b then exit(b);exit(a);end;procedure addedge(s,t,c,u,k:longint);begininc(l);e_n[l]:=e_n[s];e_n[s]:=l;//下一条边e_t[l]:=t;//边的另一端e_c[l]:=c;//边的费用e_u[l]:=u;//边的容量e_p[l]:=l+k;//对应的边end;procedure build(s,t,c,u:longint);beginaddedge(s,t,c,u,1);addedge(t,s,-c,0,-1);end;function aug(no,m:longint):longint;vari,d:longint;beginif no=n then begininc(cost,m*dis[1]);exit(m);end;v[no]:=true;i:=e_x[no];while i<>0 do beginif (e_u[i]>0)and(not v[e_t[i]])and(dis[e_t[i]]+e_c[i]=dis[no]) then begind:=aug(e_t[i],min(m,e_u[i]));if d>0 then begindec(e_u[i],d);inc(e_u[e_p[i]],d);e_x[no]:=i;exit(d);end;end;i:=e_n[i];end;e_x[no]:=i;exit(0);end;function modlabel:boolean;vard,i,j:longint;begind:=maxlongint;for i:=1 to n do if v[i] then beginj:=e_n[i];while j<>0 do beginif (e_u[j]>0)and(not v[e_t[j]])and(e_c[j]-dis[i]+dis[e_t[j]]<d) then d:=e_c[j]-dis[i]+dis[e_t[j]];j:=e_n[j];end;end;if d=maxlongint then exit(true);for i:=1 to n do if v[i] then beginv[i]:=false;inc(dis[i],d);end;exit(false);end;beginassign(input,'coflow.in');reset(input);assign(output,'coflow.out');rewrite(output);readln(n,m);l:=n;for m:=m downto 1 do beginreadln(s,t,u,c);build(s,t,c,u);end;repeatfor i:=1 to n do e_x[i]:=e_n[i];while aug(1,maxlongint)>0 do fillchar(v,sizeof(v),0);until modlabel;writeln(cost);close(output);end.这里使用的是连续最短路算法。

最大流与最小费用流PPT课件

最大流与最小费用流PPT课件
第6页/共36页
(1)为了便于弧标号法的计算,首先需要将最大流 问题(譬如图10.3.1)重新改画成为图10.3.2的形式。
图10.3.2
第7页/共36页
在图10.3.2中,每条弧 上V标ij 有两个数字,其
中,靠近点 i 的是 ,c靠ij 近点 j 的是 。如c①ji
②表示5 从0①到②的最大通过量是5(百辆),从② 到①的最大通过量是0;② ③表示从2②到2③和 从③到②都可以通过2(百辆);等等。
例如,在图10.3.11中,从①到⑦的最短路是①— ③—⑤—⑦,代价为7,在这条最短非饱和路上取P 3 后,③—⑤变成容量为零,在下一次选择最短路时 应将③—⑤视为断路来选取最短非饱和路。另外, 选取①—③—⑤—⑦路后,③—①,⑤—③,⑦— ⑤的弧成为容量大于零的弧,可分别标上它们的代 价值为-3,-3,-1,是①—③,③—⑤,⑤—⑦的相 反数。
转入步骤④,用原图中各条弧上发点与收点数
值减去修改后的图上各点的数值,将得到正负号
相反的两个数,将这个数标在弧上,并将从正到
负的方向用箭头表示,这样就得到最大流量图。例
如原来弧(3,6) 是③ 7 0 ⑥,现在是③ 2 5 ⑥,
相减为±5,③那边为正,我们就记作③ 5⑥。
这样,就得到图10.3.9,即最大流量图。依这样的
第12页/共36页
通过第1次修改,得到图10.3.3。
图10.3.3
返回步骤①,进行第2次修改。
第13页/共36页
第2次修改: 选定①—②—⑤—⑦,在这条路中,由
于 P c25,所3 以,将 改为2c12, 改为0,c25 改
为5,c5、7 、 改为c213。c5修2 改c后75 的图变为图
10.3.4。

最小费用最大流问题

最小费用最大流问题

近似算法和启发式算法
要点一
近似算法
近似算法是一种用于求解NP-hard问题的有效方法,它可 以在多项式时间内找到一个近似最优解。最小费用最大流 问题的近似算法包括Ford-Fulkerson算法、EdmondsKarp算法等。
要点二
启发式算法
启发式算法是一种基于经验或直观的算法,它可以在合理 的时间内找到一个近似最优解。最小费用最大流问题的启 发式算法包括基于增广路径的算法、基于贪婪的算法等。
研究如何将最小费用最大流问题 应用于计算机科学领域,例如计 算机网络、云计算等。
物理学
研究如何借鉴物理学中的理论和 思想,解决最小费用最大流问题, 例如利用流体动力学中的思想来 研究网络中的流。
谢谢观看
Hale Waihona Puke 06未来研究方向和展望算法优化和改进
动态规划算法
研究如何优化动态规划算法,减少时间复杂度 和空间复杂度,提高求解效率。
近似算法
研究近似算法,在保证求解质量的前提下,提 高求解速度。
并行计算和分布式计算
研究如何利用并行计算和分布式计算技术,加速最小费用最大流问题的求解。
新的问题定义和模型
考虑更复杂的情况
和技术。
有界容量和无界容量
总结词
有界容量和无界容量是指在网络中节点之间 的容量是否有限制。
详细描述
在最小费用最大流问题中,如果节点之间的 容量有限制,即为有界容量问题;如果节点 之间的容量没有限制,即为无界容量问题。 有界容量问题可以通过增广路径算法、预流 推进算法等求解,而无界容量问题则需要采
用其他算法和技术进行求解。
算法概述
最小费用最大流问题是一种网络流问 题,旨在在给定有向图中寻找一条路 径,使得从源节点到汇点之间的总流 量最大,同时满足每个节点的流入量 等于流出量,以及每条边的容量限制。

图论专题小结:最小费用最大流算法

图论专题小结:最小费用最大流算法

图论专题小结:最小费用最大流算法一,给定流量F,求最小费用题意:网络中有两台计算机s,t。

现在每秒钟要从s到t传输大小为F的数据到t。

该网络中一共有N台计算机,其中有一些靠单向电缆相连接每条电缆用(from,to,cap,cost)表示从from发送给to,最大容量是cap,单位传输费用是cost。

问传输数据最小的花费是多少?解决最小费用流的一般思路是:每次都沿着最短路进行增广,增广一次之后累加本次增广的总费用,同时修改剩余的流量F,当F≤0时或dist[t]==INF时退出。

利用改进的Dijkstra算法求解(1)概述:题目要求在存在流量为F的前提下,总花费最少。

这类问题就是最小费用流问题。

该问题可以采用加入“势函数”后的Dijkstra算法解决。

因为对于每条边e=(u,v),有如下事实成立:h(v)≤h(u)+e.cost(其中h[u]表示s到u的最短距离)。

因此令dist[v]=dist[u]+e.cost+h[u]-h[v],。

那么所有的dist值必然大于等于0,这样就能用Dijkstra算法求解了。

下面代码中用了一个优先队列,每次优先出列dist值小的元素。

整个算法的时间复杂度是O(F*ElogV)(F是流量,E是边数,V是顶点数)。

1.#include<iostream>2.#include<algorithm>3.#include<string>4.#include<sstream>5.#include<set>6.#include<vector>7.#include<stack>8.#include<map>9.#include<queue>10.#include<deque>11.#include<cstdlib>12.#include<cstdio>13.#include<cstring>14.#include<cmath>15.#include<ctime>16.#include<functional>ing namespace std;18.19.#define N 100020.#define INF 10000000021.typedef pair<int, int>P;//first保存最短距离,second保存顶点的编号22.23.struct Edge24.{25.int to, cap, cost, rev;//终点,容量(指残量网络中的),费用,反向边编号26.Edge(int t, int c, int cc, int r) :to(t), cap(c), cost(cc), rev(r){}27.};28.int V;//顶点数29.vector<Edge>G[N];//图的邻接表30.int h[N];//顶点的势31.int dist[N];//最短距离32.int prevv[N];//最短路中的父结点33.int preve[N];//最短路中的父边34.35.void addedge(int from, int to, int cap, int cost)36.{37.G[from].push_back(Edge( to, cap, cost,G[to].size()));38.G[to].push_back(Edge( from, 0, -cost, G[from].size() - 1 ));39.}40.int min_cost_flow(int s, int t, int f)//返回最小费用41.{42.int res = 0;43.fill(h, h + V, 0);44.while (f>0)//f>0时还需要继续增广45.{46.priority_queue<P, vector<P>, greater<P> >q;47.fill(dist, dist + V, INF);//距离初始化为INF48.dist[s] = 0;49.q.push(P(0, s));50.while (!q.empty())51.{52.P p = q.top(); q.pop();53.int v = p.second;54.if (dist[v]<p.first)continue;//p.first是v入队列时候的值,dist[v]是目前的值,如果目前的更优,扔掉旧值55.for (int i = 0; i<G[v].size(); i++)56.{57.Edge&e = G[v][i];58.if (e.cap>0 && dist[e.to]>dist[v] + e.cost + h[v] - h[e.to])//松弛操作59.{60.dist[e.to] = dist[v] + e.cost + h[v] - h[e.to];61.prevv[e.to] = v;//更新父结点62.preve[e.to] = i;//更新父边编号63.q.push(P(dist[e.to], e.to));64.}65.}66.}67.if (dist[t] == INF)//如果dist[t]还是初始时候的INF,那么说明s-t不连通,不能再增广了68.return -1;69.for (int j = 0; j<V; j++)//更新h70.h[j] += dist[j];71.int d = f;72.for (int x = t; x != s; x = prevv[x])73. d = min(d, G[prevv[x]][preve[x]].cap);//从t出发沿着最短路返回s找可改进量74. f -= d;75.res += d*h[t];//h[t]表示最短距离的同时,也代表了这条最短路上的费用之和,乘以流量d即可得到本次增广所需的费用76.for (int x = t; x != s; x = prevv[x])77.{78.Edge&e = G[prevv[x]][preve[x]];79. e.cap -= d;//修改残量值80.G[x][e.rev].cap += d;81.}82.}83.return res;84.}85.86.int main()87.{88.freopen("t.txt", "r", stdin);89.int m;90.while (cin >> V >> m)91.{92.for (int i = 0; i<m; i++)93.{94.int from, to, cap, cost;95.cin >> from >> to >> cap >> cost;96.addedge(from, to, cap, cost);97.}98.int s, t, f;99.cin >> s >> t >> f;100.cout << min_cost_flow(s, t, f) << endl;101.}102.return 0;103.}104.二,网络输出最大流时,求出最小的费用这就是最小费用最大流问题:既要求出最大流,又要求出达到最大流时候的最小费用。

运筹学课件最小费用流问题概要

运筹学课件最小费用流问题概要

vt
) 2 , 4 , 3 (
(3,10,3)
v2
v3
第三次剩s
-1
-2
vt
2
6
3
v2
-3
v3
第三次调整网络流
v1
1 ( ) 4 , ,10
(5 ,5 ,1 )
vs
( 8,8 ,1)
(4,5,2)
vt
) 2 , ,4 4 (
(4,10,3)
( ,6) 0,2
v2
v3
v1
三、求解最小费用流的复合标号法
修正如下: 标号过程中,永久标号和临时标号一样 是可以改变的。对任一顶点而言,它有 可能反复变成T标号和P标号,顶点每次 变成P标号,标号过程都要从该顶点重新 开始。 所有顶点变为P标号,算法停止。
三、求解最小费用流的复合标号法
P(vs ) [0, ,0]
正向弧是非饱和弧: 反向弧是非零流弧:
(0 ,5 , 1)
( f ij ,cij ,bij )
(0,5,2)
1
0,
4)

vs (

6) 2, 0,
0, 8,
vt
) 2 , 4 , 0 (
1)
(0,10,3)
v2
v3
第一次剩余网络最短路
v1
1
D=4
4
vs
1
2
vt
2
6
3
v2
v3
第一次调整网络流
v1
(5,5,2)
0, ( , 0 1 4)
P(vs ) [0, ,0]
0, 8, 1)
vt
( 0 ) 2 , ,4
T (v2 ) [vs ,8,1] P

最小费用最大流问题

最小费用最大流问题

i):f(j,i))=0; ); @sum(edge(i,j)|i#eq#@index(s):f(i,j)) =vf; @sum(edge(j,i)|i#eq#@index(t):f(j,i)) =vf; @for(edge(i,j):@bnd(0,f(i,j),u(i,j))) ; end

min
( i , j )E

cij fij ;
s.t.
jV ( i , j )E

fij
jV ( j ,i )E

v f , i s , f ji v f , i t , 0, i s, t.
0 fij uij ,(i, j ) E.
LINGO 程序求解 model: sets: points/s,v1,v2,v3,v4,t/; edge(points,points) /s,v1 s,v2 v1,v2 v1,v3 v2,v4 v3,v2 v3,t v4,v3 v4,t/:c,u,f; endsets data: c=2 8 5 2 3 1 6 4 7; u=8 7 5 9 9 2 5 6 10; vf=14; enddata min=@sum(edge(i,j):c(i,j)*f(i,j)); @for(points(i)|i#ne#@index(s) #and# i#ne#@index(t): @sum(edge(i,j):f(i,j))-@sum(edge(j,
最小费用最大流问题
例 本例是最大流问题的延伸,由于输油管道的长短不 一,或地质等原因,使每条管道上运输费用也不相 同,因此,除考虑输油管道的最大流外,还需要考 虑输油管道输送最大流的最小费用,下图所示是带 有运输费的网络,其中第 1 个数字是网络的容量, 第 2 个数字是网络的单位运费.

最大流与最小费用流

最大流与最小费用流
v1
5
转入调整过程,令δ = δ vt = 2 为调整量,从 vt点 v4 开始,由逆增广链方向按标号[ +v4 , 2] 找到点, 令 f 4′t = f。 2 4t + 再由 v4 点标号 [ +v1, 2找到前一个点 v1 ,并 ] ′ 令 f14 = f14 + 2。按 v点标号找到点 v5。 1 ′ 由于标号为 v5 , ( v5 , v1 )为反向边,令 f15 = f15 2 ′ 由 v5 点的标号在找到 v2 ,令 f 25 = f 25 + 2 。 由 v2 点找到 vs,令 f s′2 = f s 2 + 2 调整过程结束,调整中的可增广链见图544,调整后的可行流见图5-45。
vj
三、求最大流的标号算法 设已有一个可行流f,标号的方法可分为两步:第 1步是标号过程,通过标号来寻找可增广链;第2 步是调整过程,沿可增广链调整f以增加流量。 1.标号过程 (1)给发点以标号 ( , +∞ ) (2)选择一个已标号的顶点 vi ,对于 vi 的所有 未标号的邻接点 v j 按下列规则处理: a) 若边 ( vi , v j ) ∈ E ,且 f ji > 0, 则令 δ j = min ( f ji , δ i ) , 并给以标号 ( vi , δ i ) 。 b) 若边 ( vi , v j ) ∈ E,且 fij < cij 时,令 δ j = min ( cij f ji , δ i ) 并给以标号 ( + vi , δ j )
j k
(即中间点 vi 的物资的输入量与输出量相等) 对收、发点 ut , us ,有 ∑ f si = ∑ f jt = W
i j
(即从 us 点发出的物资总量等于 ut 点输入量)W为 网络流的总流量。
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

v2
v3
(10, 0) ①流量调整量 总流量v(f 总流量v(f(1))=5
v2
v3
=min{8-0,5-0,7ε1=min{8-0,5-0,7-0}=5 ②最小费用增广链的费用 ∑bij=1+2+1=4 ③新的可行流为f(1),总费 新的可行流为f =4× 用b1=4×5=20
vs →v2 →v1 →vt
2、最小费用流 对于一个费用容量网络,具有相同 对于一个费用容量网络, 流量 v(f) 的可行流中,总费用b(f)最小的 的可行流中,总费用b(f)最小的 可行流称为该费用容量网络关于流量 v(f) 的最小费用流,简称流量为 v(f) 的最小 的最小费用流,简称流量为 费用流。 费用流。
3、增广链的费用 当沿着一条关于可行流 f 进行调整,得到新的可行流 f 进行调整, 称 b( f ) − b( f ) 的增广 ,则 链(流量修正路线)µ,以修正量 流量修正路线) ,以修正量ε=1 增广链µ的费用。 为增广链µ的费用。
v2
v3
即是f 的最小费用增广链。 即是f(1)的最小费用增广链
第3次迭代
-4 4
v1
-2 6
பைடு நூலகம்
-1
(10, 2)
v1
(7, 7) (2, 0)
vs
-1
1
vt
2 (8, 8)
vs
(5, 5)
vt
(4, 3)
v2
3
v3
①零流弧保持原边,非饱和非 零流弧保持原边, 零流弧增添后向弧, 零流弧增添后向弧,饱和弧去 掉原边增添后向弧 ②用列表法求得最短路
增广费用网络图的 增广费用网络图的构造方法 将流量网络中的每一条弧( 将流量网络中的每一条弧(vi,vj)都看 作一对方向相反的弧,并定义弧的权数如 作一对方向相反的弧, 下: vi (cij,fij) c vj
-bij 若fij>0 +∞ 若fij=0
wij =
bij 若fij< cij +∞ 若fij=cij
应该如何实现“ 应该如何实现“始终保持网络中的可 行流是最小费用流” 行流是最小费用流” 呢?
2、算法原理 (1)定理 若f 是流量为v(f)的最 是流量为v f 的最 小费用流,µ是关于 f 的所有增广 小费用流, 是关于 链中费用最小的增广链, 链中费用最小的增广链,那么沿着 费用最小的增广链 µ去调整 f 得到的新的可行流 f 去 就是流量为 最小费用流。 就是流量为 v( f ) 的最小费用流。
第1次迭代
4
v1
2 6
1
(10,0)
v1
(7, 5) (2, 0)
vs
1
vt
2
vs
(8, 5)
(5, 5)
vt
(4, 0)
3 中全部是零流弧, ① f(0)中全部是零流弧,则保 持原边不变,单位费用为权; 持原边不变,单位费用为权; ②所有的权均大于零,可用D 所有的权均大于零,可用D 氏标号法求出最短路: 氏标号法求出最短路:
-4
v1
6 2 3 -3
-1
vs
-1
4 -2
vt v3
-2
v2
vs v1 v2 v3 vs v1 v2 v3 vt 0 -4 -1 -3 -1 4 0 2 -2 0 6 3 0 -2
vt d(1) d(2) d(3) d(4) 0 4 0 4 2 10 0 0 4 2 5 0 4 2 5
第三步--第三步--- 将最短路还原成流量网 络图(cij,fij)中的最小费用增广链µ, 中的最小费用增广链µ 络图( 在µ上对可行流f(0)进行调整(采用最 上对可行流f 进行调整( 大流问题中的增广链流量调整方法) 大流问题中的增广链流量调整方法), 得到新的可行流图。返回第二步, 得到新的可行流图。返回第二步, 将f(0)替换为新的可行流即可。 替换为新的可行流即可。
(2)实现思路
基于第一种求解途径,根据上述定理, 基于第一种求解途径,根据上述定理, 从流量为v(f) 的最小费用流 开始,只要找 的最小费用流f 开始, 从流量为 到其上的最小费用增广链, 到其上的最小费用增广链,在该链上调整流 最小费用增广链 量,就得到增加流量后的最小费用流。循环 就得到增加流量后的最小费用流。 增加流量后的最小费用流 往复就可以求出最小费用最大流。 往复就可以求出最小费用最大流。 实施中的关键——寻找最小费用增广链 实施中的关键——寻找最小费用增广链 具体方法:构造增广费用网络图, 具体方法:构造增广费用网络图,借助最短路 算法寻找最小费用增广链。 算法寻找最小费用增广链。
4、举例:以下图为例,求最小费用最大 举例:以下图为例, 弧旁的数字为(c 流,弧旁的数字为(cij,bij)。
(10,4)
v1
(7,1) (2,6)
vs (5,2)
(8,1)
vt
(4,2)
v2
(10,3)
v3
解:(1)以零流弧为初始可行流 (0),则初始可行 :( )以零流弧为初始可行流f 流的流量v(f 流的流量 (0))=0。 。
二、求解最小费用最大流问题的对偶法 1、求解途径: 求解途径:
(1)始终保持网络中的可行流是最小费用 始终保持网络中的可行流是 网络中的可行流是最小费用 流,然后不断调整,使流量逐步增大, 然后不断调整, 流量逐步增大, 最终成为最小费用的最大流; 最终成为最小费用的最大流; (2)始终保持可行流是最大流,通过不断 始终保持可行流是最大流, 可行流是最大流 调整使费用逐步减小 调整使费用逐步减小,最终成为最大流 费用逐步减小, 量的最小费用流。 量的最小费用流。
即是f(0)的最小费用增广链。 即是f 最小费用增广链。
第2次迭代
4
v1
-2 1 6
-1
(10, 2)
v1
(7, 7) (2, 0)
vs
1 -1
vt
2
vs (5, 5)
(8, 5)
vt
(4, 0)
3 零流弧保持原边, ①零流弧保持原边,非饱和非 零流弧(v 零流弧(vs,v2)和(v1,vt)增添 后向弧,饱和弧(v 后向弧,饱和弧(v2,v1)去掉原 弧增添后向弧; 弧增添后向弧; ②用列表法求出最短路: 用列表法求出最短路:
-bij Vi Vj
非饱和且非零流弧上( 非饱和且非零流弧上( cij>fij>0) ,原有 弧以单位费用作权数, 弧以单位费用作权数,并添加以单位费 用的负数作为权数后向弧 虚线弧): 负数作为权数后向弧( 用的负数作为权数后向弧(虚线弧):
3、整个过程的求解步骤: 整个过程的求解步骤: 第一步--第一步 取初始可行流为零流 ,它必为
wji =
wij =
bij 若fij< cij +∞ 若fij=cij
wji =
-bij 若fij>0 +∞ 若fij=0
对于零流弧(f =0),在其对应位置构造 对于零流弧(fij=0),在其对应位置构造 与其方向相同且权数为b 的弧; 与其方向相同且权数为bij的弧; 对于饱和弧(f 对于饱和弧(fij=cij),在其对应位置构造与其方 向相反且权数为- 的弧; 向相反且权数为-bij的弧; 对于非饱和且非零流弧( 对于非饱和且非零流弧( cij>fij>0),在其对应位 >0), 置构造与其方向相同且边权为b 的弧, 置构造与其方向相同且边权为bij的弧,以及与 其方向相反且边权为- 的弧。 其方向相反且边权为-bij的弧。 处理完所有的弧,即形成增广费用网络图。 处理完所有的弧,即形成增广费用网络图。
v2
v3
③对应最小费用增广链
vs →v1 →v2 →v3 →vt
+ − + +
第 5次 迭 代 次
-4
v1
6 2 3 -3
-1
vs
-1
4 -2
vt v3
-2
v2
①添加弧; 添加弧; 用列表法计算发现Vs ②用列表法计算发现Vs Vt之间不存在一条最 和Vt之间不存在一条最 短路,计算结束。 短路,计算结束。当前 的可行流f 的可行流f(4)即为所求的 最小费用最大流。 最小费用最大流。
v s → v1 → v 2 → v3 → vt
(10, 4) ①调整流量 =min{10-2,5,10-3,4-3}=1, ε4=min{10-2,5,10-3,4-3}=1, 总流量v(f =10+1=11; 总流量v(f(4)) =10+1=11; ②最小费用增广链的费用 =4∑bij=4-2+3+2=7 ③新的可行流为f(4),总费用 新的可行流为f 原费用+ b4=原费用+新增费用 =48+7×1=55。 =48+7×1=55。
零流弧上(f =0) 保持原弧不变, 零流弧上(fij=0) ,保持原弧不变,将 单位费用作为权数, 单位费用作为权数,即wij= bij:
Vi bij Vj
饱和弧上(f 饱和弧上(fij=cij):去掉原有弧,添加 去掉原有弧, 负数作为权数 以单位费用的负数作为权数后向弧 以单位费用的负数作为权数后向弧 (虚线弧): 虚线弧):
(10, 3) 流量调整量ε =min{8①流量调整量ε3=min{85,10-0,4-0}=3, 5,10-0,4-0}=3, 总流量v(f 原流量+ 总流量v(f(3)) =原流量+新 增流量=7+3=10 =7+3=10; 增流量=7+3=10; ②最小费用增广链的费用 ∑bij=1+3+2=6 ③新的可行流为f(3),总费用 新的可行流为f 原费用+ b3=原费用+新增费用 =30+6× =30+6×3=48
相关文档
最新文档