图与网络优化模型
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
第十章 图与网络优化模型
在图论中通常用V 表示点,E 表示边(无向),A 表示弧(有向),G 表示图,点和边构成的图称为无向图,G=(V ,E ),点和弧构成的图称为有向图,G=(V ,A)。
对图G 的边(或弧)标上权数,称为赋权图。
求1到7的最短路。
本图是个有向图,弧上的数字不妨理解为距离。
目前用于求解最短路的算法有多种,如:动态规划法,Dijkstra 算法,0-1规划方法等。
下面只介绍0-1规划法
设1为起点,7为终点。
引入1,0=ij x 表示:若弧(i,j)在最短路上,1=ij x ,否则,0=ij x Z 为目标函数上各弧的路程之和。
起点1必定有一条弧出发,所以
12
1=∑=n
j j
x
终点n 必定有一条弧到达,所以11
1
=∑-=n i in
x
其它点有两种情况:
(1) 该点不在最短路上,即无进线弧,也无出线弧。
满足:
0,1=∑≠=n
k i i ik
x
,
且0,1=∑≠=n
k
i i ki
x
(2) 该点在最短路上,即有进线弧,也有出线弧。
满足:
1,1=∑≠=n
k
i i ik
x
,且
1,1=∑≠=n
k
i i ki
x
改写上述两个等式为:
0,1
,1==∑∑=≠=ii n
j kj n
k
i i ik
x x x
⎪⎪⎪⎪
⎪⎪⎩
⎪⎪⎪⎪⎪⎪⎨⎧===<<====
∑∑∑∑∑=====1,0,...,2,1,01,11..min 11
1111
,ij ii n
i ji n
i ij n
i in n
i i n
j i ij
ij
x n i x n
j x x x x t s x w
Z
model : sets :
city/1..7/;!定义7个城市;
links(city,city):dist,x;!定义各城市之间的距离表(若城市i 到城市j 无路,用一个大数表示),决策变量; endsets data :
dist=0 2 10 1000 1000 1000 1000 1000 0 7 3 1000 1000 1000 1000 1000 0 1000 4 1000 1000 1000 1000 1000 0 1000 1000 8 1000 1000 5 1000 0 3 7 1000 1000 1000 1000 1000 0 12 1000 1000 1000 4 1000 3 0 ; enddata
n=@size (city);
min =@sum (links:dist*x); @sum (city(i):x(1,i))=1; @sum (city(i):x(i,n))=1;
@for (city(i)|i#gt#1 #and# i#lt#n :
@sum (city(j):x(i,j))=@sum (city(j):x(j,i))); @for (city(i):x(i,i)=0); @for (links:@bin (x)); end
10.2 旅行售货员TSP 模型
有一个旅行推销员,从某个城市出发,要遍访若干城市各一次且仅一次,最后返回原来出发城市。
已知从城市I 到城市J 的旅费为ij C ,问如何安排旅行路线使总旅费最小?
分析:巡回---能到每个城市一次,且仅一次的一条线路称为一个巡回。
子巡回---从一个起点出发,到若干(不是全部)城市一次,且仅一次,又回到起点的一条线路称为一个子巡回.
定理1:含有一个子巡回,必定至少有两个子巡回. 定理2:TSP 模型的一条最优巡回,必定不含子巡回.
证明:如果含有子巡回,则必存在一个子巡回有这种情况:有一个城市要经过二次,才能回到起点城市.
如何用数学表达式来描述子巡回与总体巡回的区别呢?
显然,有子巡回的线路必然有一个城市(这个城市却不是起点城市)要经过二次,而不含子巡回的线路只有起点城市才经过二次.
假设有一条线路:
没有子巡回的情形:121...x x x x n →→→→
有子巡回的情形:113321......x x x x x x x x n i i →→→→→→→+
引入变量i u ,对上述线路上的各城市按序给予编号,1-=i u i ,每个城市只编一次号.
没有子巡回的情形1+-i i u u :-1,-1,-1,...,-1,-1
有子巡回的情形1+-i i u u :-1,-1,-1,...,m,...,-1,-1 m 不等于-1. 定理3: 设1,0=ij x 表示是否从城市I 到城市J,
约束条件:j i j i u u n nx u u j i ij j i ≠==≥-≤+-,...,3,2,...,2,1,0,,1 则:(1)任何含有子巡回的路线必然不满足上述约束条件(不管i u 如何取值) (2)不含子巡回的线路都可以满足上述约束条件.(只要i u 取适当值)
TSP 模型如下:
⎪⎪⎪⎪⎩⎪
⎪⎪⎪⎨⎧==≠==≠===
∑∑∑===不含子巡回
n j i x j i n i x j i n j x t s x c
Z ij n j ij n
i ij n
j i ij
ij
,...,3,2,1,,1,0,,...,3,2,1,1,,...,3,2,1,1..min 1
1
1
,
具体例子:
已知六个城市之间的路程如下表:
求一条TSP 线路?
model : sets :
CITY/1..6/:u;!定义六个城市,u 是TSP 线路的编号;
LINKS(CITY,CITY):dist,x;!dist 距离列表,x 为决策变量; endsets data :
!u=0,1,2,3,4,5; dist=
0 702 454 842 2396 1196
702 0 324 1093 2136 764 454 324 0 1137 2180
798
842 1093 1137 0 1616
1857
2396 2136
2180
1616 0 2900
1196
764 798 1857
2900
0 ;
enddata
n=@size (city);
Min =@sum (links:dist*x);
@for (links:@bin (x));!x 为0-1变量;
@for (city(i):@sum (city(j)|i#ne#j:x(i,j))=1); @for (city(i):@sum (city(j)|i#ne#j:x(j,i))=1); @for (city(i):@for (city(j)|j#GT#1 #and# i#ne#j:u(I)-U(j)+n*x(i,j)<=n-1););
@for (city(i):u(i)<=n-1); end
10.3 最小生成树和最优连线(minimal spanning tree MST 模型)
树是图论中的一种简单而又重要的图,它是连通并且无圈的无向图.记为G=(V,A). 树具有下列性质:
1、 树是连通图,但无回路;
2、 树中任意两个顶点间有且只有一条链;
3、 在树的不相邻的两个顶点间加上一条边,就得到一个圈;
4、 在树中任意去掉一条边,图就不连通;
5、 含有p 个顶点的树有p-1条边。
连通图G 的子图T ,若T 的顶点集与G 的顶点集相同,且T 为树。
称T 为图G 的生成树,(或支撑树),当然生成树不是唯一的。
如果图的边有权,则权和最小的生成树称为最小生成树。
但最小生成树也不一定唯一。
图G 有生成树的充要条件是G 连通。
具体实例:求下列赋权图的最小生成树。
假设ij w 表示点I 到点j 的权,当两个节点没有线路相通时,∞=ij w 。
设0-1变量ij x ,当1=ij x ,表示从节点I 到节点J 的边在树中;当0=ij x ,表示从节点I 到节点J 的边不在树中。
目标函数:∑==n
j i ij ij
x w
Z 1
,min
约束条件:
假设根节点为1v ,根节点只有出去的线路,且出去的线路不少于1条,但没有进来的线路。
所以: (1)
0,12
12
1=≥∑∑==n
j j n
j j
x x
,
其它节点(除根节点外)必须有且只有一条线路进来,但可能有0,1,多条出去。
(2)
j i n j x
n
i ij
≠==∑=,,...,3,2,11
任意两个节点都不能迂回。
(3)j i x x ji ij ≠≤+,1 树的边与节点关系。
(4)
11
,-=∑=n x
n
j i ij
仅仅上述条件还不够,因为一棵树是连通且不能有圈的。
为了描述圈,我们引进树层的概念,记根为0层,与从0层线路进来的节点都记为1层,与从1层线路进来的节点都记为2层,......。
每个节点都有一个层数,记为u ,所以 (5)1,01-≤=n u u i 。
每个节点的层数等于该节点进线的上节点的层数+1。
(6)n i x u
u n
i
k k ki k
i ,...,3,2,1,1=+=
∑≠=
注:条件(2)、(3)、(5)、(6)已限制了这棵树不会迂回,并且连通,不产生圈。
为什么?
model : sets :
node/1..8/:u;
link(node,node):dist,x; endsets
n=@size (node); data : dist=
; enddata
min =@sum (link:dist*x);
@sum (node(i)|i#gt#1:x(1,i))>=1; @sum (node(i)|i#gt#1:x(i,1))=0;
@for (node(k)|k#gt# 1:@sum (node(i)|i#ne#k:x(i,k))=1;); @for (link(i,k)|i#gt#k:x(i,k)+x(k,i)<=1;); @for (node(i):x(i,i)=0;); @sum (link:x)=n-1; u(1)=0;
@for (link:@bin (x));
@for (node(i)|i#gt#1:u(i)=@sum (node(k):u(k)*x(k,i))+1); @for (node(i)|i#gt#1:u(i)<=n-1;); end
10.4 最大流问题
定义1:给一个有向图G=(V ,E ),在V 中指定一个点,称为发点(记为s v ),和另一
个点,称为收点(记为t v ),其余的点称为中间点。
对于每一个弧E v v j i ∈),(,赋权
0),(≥j i v v w 称为弧容量。
这样的D 叫做一个网络,记G=(V,E,W)。
网络是赋权的有向图。
发
点只有流出弧,没有流进弧;收点只有流入弧,没有流出弧,这样的网络称为运输网络。
设),(j i v v f 是定义在网络G=(V ,E ,W )的边集E 上的一个实数函数,满足: (1)),(),(j i j i v v w v v f ≤---每条边的流量不超过该边大弧容量。
(2)
t
s
j
j
i
i
v x v x x v f v x f ≠≠=∑∑,,),(),(---中间点流入与流出平衡。
(3)∑∑==
j
t
j
i
i
s
v v f v v f Q ),(),(---发点总流出与收点总流入平衡。
称),(j i v v f 为网络G 的流。
Q 为总流量。
最大流问题就是在上述(1)(2)(3)的条件下,如何使Q 最大。
求网络最大流在图论中有Ford-Fulkerson 算法,但是网络最大流也是一个线性规划问题。
其数学模型:
∑==2
),1(max i i f Q -------由发点1到其它点的流出量总和。
N 表示收点.
⎪⎩⎪⎨⎧===≤≤∑∑n k k i f i k f n j i w j i f t s i i
ij ,...,2,1,),(),(,...,3,2,1,,),(0..
例:求下列从S到T的最大流
model:
sets:
node/1..5/;!定义节点;
link(node,node)/1,2 1,3 1,4 2,3 3,2 3,4 2,5 4,5/:w,f;
endsets
data:
w=2 9 3 7 6 4 8 5;
enddata
n=@size(node);
max=@sum(link(i,j)|i#eq#1:f(i,j));
@for(link(i,j):f(i,j)<=w(i,j));
@for(node(i)|i#gt#1#and#i#lt#n:@sum(link(j,i):f(j,i))=@sum(link(i,j): f(i,j)));
@sum(link(i,j)|i#eq#1:f(i,j))=@sum(link(i,j)|j#eq#n:f(i,j));
end
10.5 最小费用最大流
网络最大流中不涉及费用问题,在实际问题中,在网络中的各边的运输费用是各不相同的,在满足最大流的情况下,求出最小费用,就是最小费用最大流问题。
下图所示是最小费用最大流问题。
每一条边上有两个数字,前者表示容量,后者表示单位费用。
求最小费用最大流可以用线性规划问题模型,分两步:
1.先求没有费用的最大流。
model:
sets:
node/1..6/;!定义节点;
link(node,node)/1,2 1,3 2,3 2,4 3,5 4,3 4,6 5,6 5,4/:w,f;
endsets
data:
w=8 7 5 9 9 2 5 6 10;
enddata
n=@size(node);
max=@sum(link(i,j)|i#eq#1:f(i,j));
@for(link(i,j):f(i,j)<=w(i,j));
@for(node(i)|i#gt#1#and#i#lt#n:@sum(link(j,i):f(j,i))=@sum(link(i,j): f(i,j)));
@sum(link(i,j)|i#eq#1:f(i,j))=@sum(link(i,j)|j#eq#n:f(i,j));
end
最大流为11。
2.把最大流当作一个约束条件,求费用最小值。
model:
sets:
node/1..6/;!定义节点;
link(node,node)/1,2 1,3 2,3 2,4 3,5 4,3 4,6 5,6 5,4/:c,w,f;
endsets
data:
w=8 7 5 9 9 2 5 6 10;
c=2 8 5 2 3 1 6 4 7;
enddata
n=@size(node);
max=@sum(link(i,j):c(i,j)*f(i,j));
@sum(link(i,j)|i#eq#1:f(i,j))=11;
@for(link(i,j):f(i,j)<=w(i,j));
@for(node(i)|i#gt#1#and#i#lt#n:@sum(link(j,i):f(j,i))=@sum(link(i,j): f(i,j)));
@sum(link(i,j)|i#eq#1:f(i,j))=@sum(link(i,j)|j#eq#n:f(i,j));
end
最小费用为180。
方案如下:
弧 1-2 1--3 2-3 2-4 3-5 5-4 4-6 5-6 合计
流量 4 7 2 2 9 3 5 6 11
费用 8 56 10 4 27 21 30 24 180。