最小费用流
最小费用流
s
a W
t
b
Edmonds和Karp
• 假设增广前s到u的距离为d(u), 增广后的费 用函数为w(e), 对于弧e=uv定义一个新的权 值w*(e) = w(e) + d(u) – d(v), 则对于任意s-t 路X, 有w*(X) = w(X) – d(x), 即对于权函数 w(e), w*(e), 从s出发的单源最短路树完全一 样 • 改进算法: 用w*(e)=w(e)+d(u)-d(v)作为权函 数计算单源最短路d*(x), 然后计算出真正的 新最短路
消圈定理
• 消圈定理: 流量为f的可行流x为流量为f的最 小费用流当且仅当x没有负费用增广圈 • 必要性显然,用反证法证明充分性。 • 假设存在不同的可行流x0使得它的费用比x 更低,则它们的差x1=x0-x是网络中的负费 用循环流。既然是循环流,x1一定可以分解 为至多m个非零圈流之和,则它们中至少有 一个圈是负费用的(有限个非负费用之和 仍是非负的),这个圈就是题目中非负增 广圈,矛盾
例1. Another Assignment Problem (SPOJ 684)
• 第i类工人有a(i)个, 第j类工作有b(j)个, 第i类 工人做第j类工作的代价是c(i,j). 用最小代价 把所有工人安排好位
目录
• 消圈算法及其正确性 • 连续最短路算法及其改进 • 应用
最小费用流
• 如下图, 弧上除了网络外还有一个费用值 • 总费用等于每条弧的流量与费用的乘积
残量网络
• 残量网络N’=(G’,c’,s,t) • c’的定义同不带费用的网络流问题 • 费用定义
– 正向弧费用为w(e) – 反向弧费用为-w(e)
连续最短路算法
图论专题小结:最小费用最大流算法
图论专题小结:最小费用最大流算法一,给定流量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.二,网络输出最大流时,求出最小的费用这就是最小费用最大流问题:既要求出最大流,又要求出达到最大流时候的最小费用。
网络优化-7-最小费用流问题
最小费用流问题
定义7.2 (容量-费用网络中的流(flow) 的定义同前一章)
流x的(总)费用定义为 c(x) cijxij 线性费用网络 (i,j)A
最小费用流问题就是在网络中寻找总费用最小的可行流.
mc(ix)n cix ji j s.t. x i j x j id i, i V( 7 .1 )
di >0:供应点(supply node)或源(source)、起始点或发货点 di <0:需求点(demand node)或汇(sink) 、终止点或吸收点
di =0:转运点(transshipment node)或平衡点、中间点
可以把L 0的网络转化为L=0的网络进行研究(思考?) 除非特别说明, 假设L=0,网络简记为N=(V,A,C,U,D).
大的s-t可行流y. 定义P的费用为 C(P) cij(x) (i,j)P
则当增广的流量为时 c (y ) c (x )• C (P )
为了获得最小费用流,我们希望沿费用最小的增广路对当前流x 进行增广,以最小的费用增加获得流值更大的s-t可行流y
16
7.2.2 最小费用路算法
定理7.2 设x为流值为v的最小费用流,P为关于x的从s到t的一条 最小费用增广路,且沿P所能增广的流量为 ,则增广后得到流 值为v+ 的最小费用流y.
(i,j) A
j : ( i,j) A j : (j,i) A
0 x i j u i,j ( i , j ) A ( 7 . 2 )
通常又称为转运问题(transshipment problem)或容量受限的 转运问题(capacitated transshipment problem).
如果当流量流过一条弧时,流出该弧的流量是进入该弧的流量 的一个线性函数,即流出该弧的流量是对进入该弧的流量按一 定比例进行放大或缩小的结果,则这样的流网络一般称为带增 益(或盈亏)的流网络(flow with gain network).
最大网络流最小费用流模型
该函数满足:
(1)对于G的残流网络中的每一条边(u,v)有,h(u) h(v)+1; (2)h(t)=0。 G的残流网络中满足h(u) = h(v)+1的边(u,v)称为G的可推流边。
11
一般的预流推进算法
步骤0:构造初始预流flow: 对源顶点s的每条出边(s,v)令flow(s,v)=cap(s,v); 对其余边(u,v)令flow(u,v)=0。构造一有效的高度函数h。 步骤1:如果残量网络中不存在活顶点,则计算结束,已经得到最大流; 否则转步骤2。 步骤2:在网络中选取活顶点v。 如果存在顶点v的出边为可推流边,则选取一条这样的可推流边,并沿此边推流。 否则令h(v) = min{h(w)+1 | (v,w)是当前残流网络中的边},并转步骤1。
6
2 算法描述 最大流的增广路算法如下。该算法也常称作Ford Fulkerson算法。
template <class Graph, class Edge> class MAXFLOW { const Graph &G; int s, t,maxf; vector<int> wt; vector<Edge *> st; int ST(int v) const { return st[v]->other(v); } void augment(int s, int t) { int d = st[t]->capRto(t); for (int v = ST(t); v != s; v = ST(v)) if (st[v]->capRto(v) < d) d = st[v]->capRto(v); st[t]->addflowRto(t, d); maxf+=d; for ( v = ST(t); v != s; v = ST(v)) st[v]->addflowRto(v, d); } bool pfs(); public: MAXFLOW(const Graph &G, int s, int t,int &maxflow) : G(G), s(s), t(t), st(G.V()), wt(G.V()),maxf(0) { while (pfs()) augment(s, t); maxflow+=maxf;} };
最大流与最小费用流
c67 = 7 − P = 7 - 6 = 1
通过第1次修改,得到图3。
图3 返回步骤①,进行第2次修改。
次修改: 第2次修改 次修改 选定①—②—⑤—⑦,在这条路中,由 于 P = c25 = 3 ,所以,将 c12 改为2 , 25 改 c 为0,c57 改为5,c 21 、 52 、 75 改为3。修改后 c c 的图变为图4。
x12 + x13 + x14 = x57 + x67 = f
x12 + x32 x + x 23 13 x14 + x34 x + x 35 25 x36 + x 46 = x 23 + x 25 = x32 + x34 + x35 + x36 = x 46 + x65 = x56 + x57 + x56 = x65 + x67
所以取 P = c13 = 6 。
③在路①—③—⑥—⑦中,修改每一 条弧的容量
c13 = 6-P = 6-6 = 0
c36 = 7 − P = 7 - 6 = 1
c31 = 0 + P = 0 + 6 = 6
c63 = 0 + P = 0 + 6 = 6
c76 = 0 + P = 0 + 6 = 6
f = f 0 ≤ f max
(15)
使其代价最小,即
d=
( i , j )∈V
∑d
ij
xij = min
(16)
式中:d ij 指单位车辆数通过弧 (i, j )的代价。
图11 代价条件
图1 约束条件
最小费用流算法
最小费用流算法
最小费用流算法是一种简单的费用流算法,它旨在解决费用流问题,其中边权最小化。
它可以用于解决实际应用中的资源分配问题,表示流程网络(Flow Network)中使用费用
流算法利用边权来最小化流量路线。
最小费用流算法是一种基于增广路径的状态搜索算法。
它主要由两步组成:一是从源结点到汇结点的增广搜索;二是根据找到的增广路径调
整边权。
只要满足三个要求:1. 所有结点都有非负出度;2. 所有边都具有非负权;3.
所有结点都有相同的进入现金流,则最小费用流算法就可以得到最优解。
在最小费用流问题中,要求最小化所有边上的流入和流出时消耗的权重和,考虑到这
些约束,最小费用流算法具有一定的优越性。
首先,最小费用流算法可以在常数时间内完
成寻路,寻路的次数不会太多,其逻辑清晰,容易理解,对于每个结点,只需要搜索到可
达目的地的路径,而不需要考虑搜索路径的可行性。
由于最小费用流算法在查找算法中总
是具有优先权,因此它也可以改善整体优化算法,提供快速和可靠的结果。
最小费用流算法在实际应用中比较广泛,它可以用于解决很多实际问题,包括报价,
补给,物流等。
最小费用流算法可以帮助用户充分利用现有资源、实现最低开销,同时还
保持最大的流动性,从而降低建设成本和管理成本,使企业经营更加高效。
运筹学课件最小费用流问题概要
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
运筹学_最小费用流问题ppt课件
⑷在G中与这条最短路相应的可增广链μ上,
做 f (k) = fμ(k-1)θ
其中θ =min{μm+ in(cij
-
fi
(k-1)
j
),mμ-in
f
(k-1)
ij
}
此时 f (k)的流量为 W (f (k-1)) +θ , 若W (f (k-1)) +θ = v则停,
否则 令 f (k) 代替 f (k-1) ,返回⑵.
每条边用两条方向相反的有向边代替, 各边的权lij按如下
规则: 1. 当边 (vi , vj) ∈E, 令 lij =
dij 当 f ij < c ij +∞ 当 f ij = 0
( 其中+∞的意义是: 这条边已饱和, 不能再增大流量, 否则
要花费很高的代价, 实际无法实现, 因此权为+∞的边可从
网络中去掉. )
(10,0)
(7,5)
(10,4)
vs (8,5)
(5,5)
(2,0)
vt (0,0)
vs
1 1(-2) (2,6)
vt
-1
(2,2)
v2 (10,0) v3
v2 (10,3) v3
(c) f (1) W( f (1))=5
(d) L ( f (1) )
d (f (1)) = 5×1+5×2+ 5×1= 20
p160 - 166 6.12(c).
定义 已知网络G=(V, E, C, d), f 是G上的一个可行流, μ
为从v s到v t的(关于 f 的)可增广链, d (μ) = ∑ d i j - ∑ d i j
μ+
最大流与最小费用流
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为 网络流的总流量。
第七节 最小费用流问题
运输问题
ai表示发点i可供应的产品数量 bj表示收点j所需的产品数量 wij表示从发点i到收点j的单位产品运输费用 xij表示从发点i分配给收点j的产品数量
min s.t.
wij xij
i, j
xij ai , (i =1,2,...,m) j
xij = bj , ( j =1,2,...,n) i
第2步(决定哪些弧可以改变流量) 用I表示这样的弧集合使p(j)-p(i)=wij,同时xij<cij 用R表示这样的弧集合使p(j)-p(i)=wij,同时xij>0 续
第3步(改变流量)用最大流算法,在I∪R上找增广路,增 加流量。 如果从s到t的流量已经是v,那么计算停止,已经得到一 个流量是v的最小费用流。 如果从s到t不能再增加流量,检查在Q∪I∪R中是否能找 到增广路。如果不能找到增广路,那么该网络的最大流达 不到v;如果在Q∪I∪R中能找到增广路,就转入第4步。
第七节 最小费用流问题
最小费用流算法
规划形式 算法步骤 算法复杂性
运输问题
对偶规划 算法步骤
规划形式
基本假设:
给定有向网络 G=(N,A,C,W),其中 cij 表示弧(i,j)∈A 的容量,wij 表示单位流通过弧(i,j)∈A 的费用。则流
x=(xij)的费用为 wij xij i, j
问题:
规划形式
续二
对偶规划D
max {p(t )v - p(s)v - cijrij }
(i, j )A
s.t.
p( j ) - p(i ) - rij wij , (i, j ) A
rij 0, (i, j ) A p(i )无限制, i N
最小费用流算法的步骤
6.-5最小费用最大流问题
v1
(7,7) (2,0)
vs
(8,4)
(5,0)
vt
(4,4)
v2
(10,4)
v3
(未标费用)
最大流图fmax=11
(10,4)
v1
第1次迭代
(7,1)
(2,6) (10,4,0)
v1
(7,1,5) (2,6,0)
vs (5,2)
(8,1)
vt
(4,2)
vs (5,2,5)
(8,1,5)
min{15 4, 7 0,11 0} 7
④得到新的可行流,刷新网络图 v2
(3,3,0) (7,8, 7) (4,9, 4)
f 17 f max 20
(15, 2,11)
v4
(11,3, 7)
vs
(9, 6, 6)
(bij , cij , 0)
Vi
原网络
Vj
(bij , cij )
Vi
增广费用网络
Vj
非饱和弧上 (0 xij bij ) ,原有弧以单位 费用作权数,后加弧(虚线弧)以单位 费用的负数作权数:
(bij ,cij , xij ) (bij xij , cij )
( xij ,cij )
第五节 最小费用最大流问题
一、基本概念
1、什么是最小费用最大流问题?
对每一条弧都给出单位流量费用的容量网络 D=(V,A,B)(称为费用容量网络)中, 求取最大流X,使输送流量的总费用
C(X)=∑cijxij为最小的一类优化问题。
其中,bij表示弧(vi,vj)上的容量,xij表 示弧(vi,vj)上的流量,cij表示弧(vi,vj) 上通过单位流量所花费的费用。
6-4-1 最小费用流
例:书P167例11
最优流向图 运输费用最低的流向图 对流 两顶点间的边上,存在相反方向的流 如上图中的f14和f41
l内 l外
回路内侧有流向箭头的各边边长之和
内圈流线长 外圈流线长 圈长
l
回路外侧有流向箭头的各边边长之和
回路的各边边长之和
流向图是最优流向图的充要条件 (1)流向图中无对流 (2)对每一个回路,内圈流线长和外圈流线 长都不大于回路圈长之半,即: l内≤l / 2,且l外≤l / 2
§ 6 最小费用流
一、无弧容量限制时流
f12 w12 1 a1 w41 f14 f32 w23 w34 3 a3 f34 4 a4 f41
收点
2 a4
发点
流向图 在网络图中画出表示(货物)流向箭头的图 流应是可行流(顶点满足平衡条件,弧容量未限制) 一个流向图代表一个运输方案
求最优流向图的步骤
书P167
1、检查网络中有无悬挂点,若有悬挂点,首先考虑其供 销要求,并将其收、发量并入相邻顶点(在回路上)。 2、给出一可行流。 3、检查有无对流,若在某条边上有对流,将其中流量小 者对销。 4、检查每一回路的内圈流线长和外圈流线长,若均满足 上述充要条件(2)者,则该流向图为最优流向图;若 在某一回路上不满足上述条件,对内(或外)圈流线长 过大者,在该回路上加上一相反流向,使内(或外)圈 某一边上的流量对销,从而将其流线长缩短。经若干步 调整,总可使调整后的流向图满足充要条件(2),这 时就得到了最优流向图。 5、恢复悬挂点,并按其收发要求供销。
最小费用流问题
05
最小费用流问题的扩展问题
多源和多汇问题
多个源点
当网络中有多个源点时,每个源点都有自己的供应量,要求流经整个网络并从指定的汇点流出。最小 费用流问题需要找到一种分配方式,使得从各个源点出发的流量的总和等于各自的供应量,同时总费 用最小。
多个汇点
与多源点类似,当网络中有多个汇点时,每个汇点都有自己的需求量,要求流经整个网络并流入各个 汇点。最小费用流问题需要找到一种分配方式,使得从源点出发的流量能够满足各个汇点的需求,同 时总费用最小。
问题背景和重要性
• 最小费用流问题在实际生活中有着广泛的应用,如物流网 络中的最优路径选择、通信网络中的数据流优化、电力网 络中的电力分配等。解决最小费用流问题可以为企业和组 织节省大量的成本和资源,提高运营效率。
问题的限制和假设
限制
最小费用流问题通常需要考虑图中可能存在的瓶颈和约束条件,如边的容量限 制、流量方向限制等。
动态变化
实际网络中流量的变化可能导致 最小费用流问题需要不断更新求 解,需要设计能够适应动态变化 的算法。
多目标优化
在实际应用中,最小费用流问题 常常需要考虑多个目标,如费用、 时间、可靠性等,需要发展多目 标优化的方法。
感谢观看
THANKS
最小费用流问
• 最小费用流问题概述 • 最小费用流问题的数学模型 • 最小费用流问题的算法 • 最小费用流问题的应用场景 • 最小费用流问题的扩展问题 • 最小费用流问题的挑战和未来研
究方向
目录
01
最小费用流问题概述
问题定义
• 最小费用流问题是在给定一个有向图或无向图中,寻找一条或 多条路径,使得从源点到汇点的总流量最大,且每条边的流量 不超过该边的容量,同时要求总费用最小。
最小流算法
最小流算法是网络流的一种算法,主要用于解决最小费用流问题。
最小费用流问题是在给定一个有向图中,寻找一条从源点s到汇点t的流量最大的流,使得整个流的费用最小。
最小流算法的基本思想是:首先找到一个增广路径,然后沿着这个路径进行增广,直到没有增广路径为止。
在增广路径上,每条边的流量可以增加,费用也随之增加;而在非增广路径上,每条边的流量不能增加,否则就会违反容量限制。
因此,最小流算法的关键在于找到增广路径。
最小流算法的实现可以采用Ford-Fulkerson算法或Edmonds-Karp算法。
Ford-Fulkerson算法的基本思想是:不断寻找增广路径并对其进行增广,直到没有增广路径为止。
Edmonds-Karp 算法则是Ford-Fulkerson算法的一种改进版本,可以更快地找到增广路径。
在实现最小流算法时,需要注意以下几点:
必须判断是否存在可行流,即源点s到汇点t是否存在一条流量大于等于0的路径。
在增广路径上,每条边的流量可以增加,但必须保证不违反容量限制。
在非增广路径上,每条边的流量不能增加,否则就会违反容量限制。
必须记录每条边的当前流量和最小费用,以便后续的增广操作。
必须判断是否还有增广路径存在,否则需要停止增广操作。
最小流算法的时间复杂度取决于找到增广路径的方法。
如果采用BFS(宽度优先搜索)方法,时间复杂度为O(V^2E),其中V是顶点数,E是边数;如果采用Dijkstra算法或Bellman-Ford 算法,时间复杂度为O(V^3E)。
4最小费用流问题
第4节最小费用流问题现实中的许多问题除了要求流量最大之外,还要求费用最低。
也就是达到最大流量的方案不止一个,还要考虑费用最低的问题。
对于网络N=(V,A,B)上的每条弧(v i,v j)∈A,给定了弧的容量b ij和单位流量的费用c ij(c ij≥0),寻求一个可行流f={x ij}并使其总费用C(f)=c ij x ij达到最小。
求解最小费用流的方法有生成法与调整法两种。
生成法是从零流开始,每次依据最小费用链作为可扩充的路,进行网络流量增大的调整。
调整法只是调整流量的分布,不断改进与改善,使费用减少,寻求最小费用流,但网络流量保持不变。
调整法体现了管理的不断改进与改善哲理,下面以调整法为例,介绍最小费用的求解过程。
一、调整法求解步骤一般求解过程步骤如下:(1)先不考虑费用问题,求得任一可行流f(2)根据这一可行流f构造赋权有向图W(f)。
顶点是原网络N的顶点,弧权根据可行流f 确定。
若弧(v i,v j)的流量可以增加,则照原方向画弧,标上费用c ij,;若弧(v i,v j)的流量可以减少,则照反方向画弧,标上费用-c ij,。
(3)在赋权有向图W(f)中寻找负回路μ。
若没有负回路,则得到最小费用流;若存在负回路,则调整与负回路相对应的弧上的流量,使之费用减少。
(4)根据所得的负回路,比较弧的方向和负回路μ的方向,划分出前向弧和后向弧,计算调整量θ。
θ=min然后,进行流量调整。
若弧(v i,v j)与负回路μ方向一致,则其流量调整为x ij+θ;若弧(v i,v j)与负回路μ方向相反,则其流量调整为x ij-θ。
(5)继续第(2)步,构造赋权有向图,寻找负回路,调整流量,直到没有负回路。
二、调整法应用举例[例6—5]事实上,企业在进行网络流量的调整时,时常要考虑费用问题。
图6—11中弧旁的数字为(b ij,x ij)和c ij。
其中,弧(v s,v1)和(v s,v2)的c s1和c s2分别是两家供应商的货物价格;弧(v5,v t),(v6,v t)和(v7,v t)的c5t,c6t和c7t分别是三个目标市场销售商的售货成本;其余弧(v i,v j)的c ij 为运输、装卸、仓储等物流作业费用。
6.-5最小费用最大流问题解析
3、增广链的费用 当沿着一条关于可行流 X 的增广链 (流量修正路线)μ,以修正量ε=1进
行调整,得到新的可行流
~ ( ) - C( x X)为
增广链μ的费用。
~ ,则称 xC
此时, ① ~ x 的流量 f( ~ x ) = f(X)+1; ②增广链μ的费用就是以单位调整量调整 可行流时所付出的费用; ③当修正量ε=1时,
(15, 2)
v2
(3,3)
(7,8) (4,9)
v4
(11,3)
vs
(9, 6)
vt
(5,5)
(10,1)
v3
(6,3)
v5
②用Ford算法求最短增广链,路线是vs—v3—v5—vt
③调整流量:在增广链上有:
在初始可行 流的基础上 min{bs 3 xs 3 , b35 x35 , b5t x5t } 调整流量
(bij , cij ,0)
Vi
原网络
Vj
(bij , cij )
Vi
增广费用网络
Vj
非饱和弧上 (0 xij bij ) ,原有弧以单位 费用作权数,后加弧(虚线弧)以单位 费用的负数作权数:
(bij ,cij , xij )
(bij xij , cij )
( xij ,cij )
min{9 0,6 0,10 0} 6
④得到新的可行流,刷新网络图 v2
(3,3, 0) (7,8,0) (4,9,0)
f 6 f max 20
(15, 2, 0)
v4
(11,3, 0)
vs
(9,6,6)
vt
(5,5, 0)
(10,1, 6)
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
(4,6,2)
v2
(2,3,0) (2,2,2)
再求v0到vn的最短增流路v0v2v3v1v4vn,路长为 14,可增加1单位的流值。(v3v1反向弧,同 最大流处理)
v1
(4,3,2)
v4 (2,5,3) vn (9,3,0) v5 (3,4,2)
(3,3,3)
v0
(2,2,1) v3
(1,1,1)
b
17,3 (c )
c
(4)在 sbct 路中,每边的容量减 5, wsb ,如图 d。求最小费 用通路 sabct, 单位流费用和为 4 (2) 3 2 7, f0 3 , 边 ( c, t ) 饱 和。
s
0,
12, 4
a
13,6
0,
t
3, 2
11, 2
b
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)
(单位运费,边容量,流值)
v1
(4,3,0)
v4 (2,5,0) vn (9,3,0) v5 (3,4,0)
(3,3,0)
s
0,
b
9, 4
8, 2
a
0,
t
0,
13, 6
9, 3
(e)
c
s
16
6
8
a
0
14
t
8
b
8
c
(f)
实际问题实例:一个工厂要将产品送 到火车站,可以有许多道路供其选择,在 不同路线上每吨货物的运费并不相同,而 且每条路线只能有限重量的货物运输,那 么要将w吨的产品从工厂送到火车站,用 什么方法可以使运费最少?
(4,6,0)
v2
(2,3,0) (2,2,0)
将各弧的单位运费作为长度,求v0到vn的最短 增流路v0v1v3v4vn,路长为8,可增加1单位的 流值。
v1
(4,3,0)
v4 (2,5,0) vn (9,3,0) v5 (3,4,0)Leabharlann (3,3,0)v0
(2,2,0) v3
(1,1,0)
(4,6,0)
(4,6,3)
v2
(2,3,1) (2,2,2)
再求v0到vn的最短增流路v0v2v3v1v4vn,路长为 14,可增加1单位的流值。(v3v1反向弧,同 最大流处理)
v1
(4,3,3)
v4 (2,5,4) vn (9,3,0) v5 (3,4,2)
(3,3,3)
v0
(2,2,0) v3
(1,1,1)
(4,6,2)
v2
(2,3,0) (2,2,2)
再求v0到vn的最短增流路v0v2v3v1v4vn,路长为 14,可增加1单位的流值。(v3v1反向弧,同 最大流处理)
v1
(4,3,2)
v4 (2,5,3) vn (9,3,0) v5 (3,4,2)
(3,3,3)
v0
(2,2,1) v3
(1,1,1)
v0
(2,2,0) v3
(1,1,0)
(4,6,0)
v2
(2,3,0) (2,2,0)
将各弧的单位运费作为长度,求v0到vn的最短 增流路v0v1v3v4vn,路长为8,可增加1单位的 流值。
v1
(4,3,0)
v4 (2,5,0) vn (9,3,0) v5 (3,4,0)
(3,3,0)
v0
(2,2,0) v3
s
16,1
15, 4 11, 2
a
14,1
t
8, 2
13, 6
b
17,3
(a)
c
2) 在上述最小费用通路中的每边的 cij 中减去 11, 去掉边 (b, a ) , 作反向边 (a, b) ,且 c(a, b) f0 , w(a, b) 2 ,如图 b。
wsa wst 5, f0 3 , 在新网络中求最小费用通路 sat, 边 (a, t ) 饱和。
v2
(2,3,0) (2,2,0)
将各弧的单位运费作为长度,求v0到vn的最短 增流路v0v1v3v4vn,路长为8,可增加1单位的 流值。
v1
(4,3,0)
v4 (2,5,1) vn (9,3,0) v5 (3,4,0)
(3,3,1)
v0
(2,2,1) v3
(1,1,1)
(4,6,0)
v2
(2,3,0) (2,2,0)
v1
(4,3,0)
v4 (2,5,1) vn (9,3,0) v5 (3,4,0)
(3,3,1)
v0
(2,2,1) v3
(1,1,1)
(4,6,0)
v2
(2,3,0) (2,2,0)
再求v0到vn的最短增流路v0v1v4vn,路长为9, 可增加2单位的流值。
v1
(4,3,0)
v4 (2,5,1) vn (9,3,0) v5 (3,4,0)
(4,6,2)
v2
(2,3,0) (2,2,2)
再求v0到vn的最短增流路v0v2v3v1v4vn,路长为 14,可增加1单位的流值。(v3v1反向弧,同 最大流处理)
v1
(4,3,3)
v4 (2,5,4) vn (9,3,0) v5 (3,4,2)
(3,3,3)
v0
(2,2,0) v3
(1,1,1)
0 fij uij , (i, j) A .
注:(1)如果 v( f ) 最大流 v( f max ) ,则本问题就是最小费用最 大流问题。 (2)如果 v( f ) v( f max ) ,则本问题无解。
求最小费用流的算法—迭代法 这里所介绍的求最小费用流的方法叫做迭代法。 这个方法是由 Busacker 和 Gowan 在 1961 年提出的。其主要步骤如下: (i)求出从发点到收点的最小费用通路 P( s, t ) , 记该通路的边集 合为 E ( P ) 。 (ii)对 P( s, t ) 分配最大可能的流量: f0 min{c( x, y) | ( x, y) E( P)}; 对所有的 ( x, y) E ( P) ,令 c( x, y) c( x, y) f0 ; 对 P( s, t ) 上的饱和边, 其单位流费用相应改为 , 且当 x 或 y s 或 t 时,将该 P( s, t ) 上的饱和边 ( x, y ) 变为反向边 ( y , x ) 。令 c( y, x) f0 , w( y, x) w( x, y) (iii)在这样构成的新网络中,重复上述步骤(i),(ii),直到从发 点到收点的全部流量等于 为止(或者再也找不到从 s 到 t 的最小 费用道路) 。此时为最小费用最大流。
(3,3,3)
v0
(2,2,1) v3
(1,1,1)
(4,6,2)
v2
(2,3,0) (2,2,2)
再求v0到vn的最短增流路v0v2v5vn,路长为9, 可增加2单位的流值。
v1
(4,3,2)
v4 (2,5,3) vn (9,3,0) v5 (3,4,2)
(3,3,3)
v0
(2,2,1) v3
(1,1,1)
(4,6,2)
v2
(2,3,0) (2,2,2)
再求v0到vn的最短增流路v0v2v3v1v4vn,路长为 14,可增加1单位的流值。(v3v1反向弧,同 最大流处理)
v1
(4,3,2)
v4 (2,5,3) vn (9,3,0) v5 (3,4,2)
(3,3,3)
v0
(2,2,1) v3
(1,1,1)
例 求下图网络中的最小费用流。图中每边上第一个数字是容量 c(i , j ) cij ,第二个数字是单位流费用 w(i, j) wij
s
16,1
15, 4 11, 2
a
14,1
t
8, 2
13, 6
b
17,3
c
解: (1)求 s 到 t 的最小费用通路 sbat,如图 a。单位费用和 wsb wba wat 1 2 1 4 。 本路径中可分配的最大流 f 0 11。边 (b, a ) 饱和。
(4,6,0)
v2
(2,3,0) (2,2,0)
再求v0到vn的最短增流路v0v1v4vn,路长为9, 可增加2单位的流值。
v1
(4,3,2)
v4 (2,5,3) vn (9,3,0) v5 (3,4,0)
(3,3,3)
v0
(2,2,1) v3
(1,1,1)
(4,6,0)
v2
(2,3,0) (2,2,0)
12,3
(d )
c
(5)在 sabct 路中,每边的容量减 3, wsb ,如图 e。在 e 中 再也找不到 s 到 t 的最小费用通路,算法结束。
s
0,
9, 4
8, 2
a
0,
t
0,
13, 6
b
9, 3
c
(e)
综合以上结果,网络中流的分配如图 f。 于是从 s 到 t 的流为: Val f 11 3 5 3 22 最小费用为: 6 4 14 1 16 1 8 2 8 2 8 3 0 6 110
最小费用最大流
前面介绍了一个网络上最大流的算法, 但是还没有考虑到网络 上流的费用问题,在许多实际问题中,费用的因素很重要。例如, 在运输问题中, 人们总是希望在完成运输任务的同时, 寻求一个使 总的运输费用最小的运输方案。 这就是下面要介绍的最小费用流问 题。 在运输网络 N (V , E, c, s, t ) 中,设 w(i, j ) 、 c(i, j ) 、 f (i, j ) 分 别表示边 (i, j ) 的单位流费用、容量和流量, Val f 。所谓最小 费用流问题就是从发点到收点怎样以最小费用输送一已知量为 Val f 的总流量。