最小费用流
最小费用流
(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吨的产品从工厂送到火车站,用 什么方法可以使运费最少?
最小费用流
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) 上通过单位流量所花费的费用。
最小费用流问题
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)
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、恢复悬挂点,并按其收发要求供销。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
最小费用流问题
定义7.2 (容量-费用网络中的流(flow) 的定义同前一章) 流x的(总)费用定义为
c( x )
( i , j )A
c
ij
xij
线性费用网络
di , i V (7.1)
(7.2)
最小费用流问题就是在网络中寻找总费用最小的可行流.
min c( x)
( i , j )A
只需证明网络中不存在关于y的负费用增广圈. 用反证法
假设增广后存在关于y的负费用增广圈W. 由于除P以外的弧及其流量在增广 前后没有发生改变, 于是P和W至少有一条公共弧. 不妨假设P和W只有一条公 共弧,记为(i,j) 如果 (i,j) 在P中是正向弧, 则在W中是反向弧; 反之, 如果 (i,j) 在P中是反向弧, 则在W中是正向弧
( 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, xij u ij , ( j, i) A, x ji 0,
其中称, uij(x)为弧(i,j)上的残留容量(residual capacity).
讨论算法复杂度时,假定: 弧(i,j)A时,弧(j,i) A;c ij = - cji A(x)=A (允许容量为0的弧仍然保留在网络中就可以了)11
6
7.1.2 最小费用流模型的特例及扩展
例 -运输问题(transportation Problem) 又称Hitchcock问题(Hitchcock,1941年)
min s.t.
( i , j ) A
c x
S
T
ij ij
(7.5) i S, j T , (i, j ) A. ( 7.6)
引理7.1 最小费用流问题存在可行流的必要条件
iV
di 0.
经典的最小费用流问题:单源单汇(起点s,终点t),寻找从s流 到t的给定流量(或最大流量、最小流量等)的最小费用流.
d s v, d t v
di 0(i s, t )
4
思考: 经典问题与一般问题有什么关系?是否等价?
1
最小费用流问题的例子
公路交通网络:车辆路线确定
S
T
1辆车
最短路问题
多辆车:车流
最小费用流问题
许多实际问题都可以转化为最小费用流问题
2
7.1.1 最小费用流问题
定义7.1 在流网络N=(V,A,L,U,D) 上增加如下的权函数: C: A R为弧上的权函数,弧(i,j)对应的权 C(i,j)记 为cij ,称为弧(i,j)的单位流量的成本或费用(cost); 此时网络可称为容量-费用网络 (一般仍可简称为网络),记为 N=(V,A,C,L,U,D).
c x
ij ij
s.t.
ij j:(i , j )A
x
j:( j ,i )A
x
ji
0 xij uij ,
(i, j) A
通常又称为转运问题(transshipment problem)或容量受限的 转运问题(capacitated transshipment problem).
消圈算法的思想
对于N(x)中的任何一个有向圈W, 它一定对应于原网络N中的一 个增广圈(增广弧构成的圈); 通过沿W对当前流x进行增广,可以获得流值相等的s-t可行流y. 定义W的费用为
C(W )
(i , j )W
c
ij
( x)
则当增广的流量为时 c( y) c( x) C (W ) 只要N中存在费用为负数的增广圈W, 即C(W)<0,则可以通过沿W 对当 前流 x 进行增广,获得流值相等但 费用更小的s-t可行流y.
k 1
r
至少存在一个费用为 负的增广圈. 矛盾
13
7.2.1 消圈算法: Klein (1967)等
STEP 0 . 在网络N=(s,t,V,A,C,U)中计算流值为v的可行流 x. STEP 1. 在残量网络N(x)中判别负圈. 若无负圈, 则已经找到了最 小费用流,结束;否则转STEP 2. STEP 2. 沿找到的负圈增广流量, 转STEP 1.
如果再令所有弧上的(单位流量)的费用为“弧长”, 则此时的最 小费用流问题就是第五章讨论过的最短路问题.
在第五章我们正是用这样的方式对最短路问题进行建模的
5
7.1.2 最小费用流模型的特例及扩展
例 - 最大流问题
s
t
设s为起点,t为终点,增加弧(t,s), 令
cts 1, uts
而令所有其他弧上的费用为0, 所有顶点上的供需量(外部流量)全为0.
7.1.2 最小费用流模型的特例及扩展
例 7.1 最短路问题
s
P
t
在有向网络中,令所有弧上容量下界为0,容量(上界)为1, 并令图中节点s的供需量为1,节点t的供需量为-1,则: 从s到t的一条有向路正好对应于网络中的一个可行流x (弧(i,j)位于s-t路上:xij =1;弧(i,j)不在s-t路上:xij=0).
ij j:( i , j ) A
x
ai , bj ,
i:( i , j ) A
x
完全二部图
( 7. 7 ) (7.8)
ij
只有源和汇
没有中间转运点
xij 0,
如果每条弧上还有容量(上下限)的限制, 则称为容量受限的运 输问题(capacitated transportation problem).
P W \ {(i, j )} 也是网 络中关于x的增广路, 且
s
i
j
P
t
C ( P W \ {(i, j )}) C ( P) C (W ) C ( P)
W
17
7.2.2 最小费用路算法 也称为连续最短路算法, 即Successive Shortest Path Algorithm), Jewell(1958), Iri(1960), Busacker & Gowen (1961) 独立提出的 STEP 0 . 取x为任一s-t可行流、且在同一流值的流中费用最小的 流 (如x=0). STEP 1. 若x的流值达到v, 结束;否则在残量网络N(x)中判别最 小费用路. 若无这样的路,则流值不可达到v, 结束;否则STEP 2. STEP 2. 沿该最小费用增广路增广流量(增广后的流值不超过v), 转STEP 1.
增益除了可以发生在弧上,类似地可以考虑增益发生在节点上
8
7.1.2 最小费用流模型的特例及扩展
最 问 短 路 题 最 小 费 用 流 问 题
带 增 益 的 最小费用流 问 题 凹费用网络 的最小费用 流 问 题 凸费用网络 的最小费用 流 问 题 线 规 问 性 划 题
最 问
大
流 题
指 派 问 题
14
7.2.1 消圈算法,例:
略
15
7.2.2 最小费用路算法 能否首先在网络N=(s,t,V,A,C,U)中计算流值为v’且费用最小的s-t 可行流(v’< v),然后对它沿增广路增广以增加流值呢?
对于N(x)中的一条从s到t的有向路P,它一定对应于原网络N中的 一条增广路,即可以通过沿P对当前流x进行增广,获得流值更 大的s-t可行流y. 定义P的费用为 C ( P) cij ( x)
1 1 0 令 x1 =x0-x, 则 x 0, v( x ) v( x ) v( x) 0 ,即令x1为网络N中的循环流.
一个循环流一定可以表示为至多m个非零圈流之和,所以可以将x1表示为r个 非零圈流之和( 1 r m )。设对应的有向圈为Wk,
x {v(Wk ) | (i, j ) Wk }
12
7.2.1 消圈算法(cycle-canceling algorithm)
定理7.1 可行流x为最小费用流的充要条件是N(x)中不存在负费 用增广圈.
必要性是显然的. 反证法证明充分性:
设x0为不同于的可行流,但费用低于x的费用,即
v( x) v( x 0 ) v
c( x) c( x 0 )
运 输 问 题
凸 规 划
狭义模型
广义模型
9
7.2 消圈算法与最小费用路算法
单源单汇网络 可行流x的流量(或流值)为v=v(x)= ds = - dt
如果我们并不给定ds 和dt , 则网络一般记为N=(s, t,V,A,C,U)
容量可行且转运点流量守恒的流称为s-t可行流,有时为了方 便也称为可行流. 最小费用流问题就是在网络N=(s,t,V,A,C,U)中计算流值为v的 最小费用流x 或者当不给定流值时, 计算流值最大的最小费用流x (此时流x 称为最小费用最大流).
有解的必要条件 可以不失一般性
a b
iS i jT
j
指派问题(assignment problem)
a b
iS i jT
j
ai b j 1, | S || T |
7
1.2 最小费用流模型的特例及扩展
(1)当一定的流量流过一条弧时,该弧上导致的总费用与流量 大小成线性正比关系,这样的流网络一般称为线性费用网络. 如果当一定的流量流过一条弧时,该弧上导致的总费用不一定 与流量大小成线性正比关系,而是流量大小的一个凹(或凸) 函数,则这样的网络称为凹(或凸)费用网络,相应的最小费 用流问题称为凹(凸)费用网络上的最小费用流问题. (2)当流量流过一条弧时,流出该弧的流量(即流入该弧终点 的流量)与进入该弧的流量(即流出该弧起点的流量)相等. 如果当流量流过一条弧时,流出该弧的流量是进入该弧的流量 的一个线性函数,即流出该弧的流量是对进入该弧的流量按一 定比例进行放大或缩小的结果,则这样的流网络一般称为带增 益(或盈亏)的流网络(flow with gain network).