最短路径问题
例:求以下带权图从 V0到 V6最短路径。
V0 V3 V6
V5
V4V1
V2
1
5
4 4
3
2
4
652
V0 V3 V6
V5
V4V1
V2
1
5
4 4
3
2
4
652
0 1 4 5 0 0 0
1 0 0 2 0 0 0
4 0 0 4 0 3 0
5 2 4 0 5 2 0
0 0 0 5 0 0 6
0 0 3 2 0 0 4
0 0 0 0 6 4 0
邻接矩阵 M 权值表示两点之间的长度
• 求最短路已有成熟的算法:迪杰斯特拉( Dijkstra )算法。具体可见数据结构或者图论方面的参考书。
• 数学规划方法,用 Lingo解决:
1 1
1 1
min
1, 1
: 1,
0, 1,
0 1
n n
ij iji j
n n
ij jij j
ij
z c x
i
st x x i n
i n
x
或
起点多一条边出去
终点多一条边进入
其他点进入的边数等于出去的边数
V0 V3 V6
V5
V4V1
V2
1
5
4 4
3
2
4
652
V0 V3 V6
V5
V4V1
V2
1
5
4 4
3
2
4
652
• 求最大流已有成熟的算法:标号法 ( Ford-Fulkerson 算法)。具体可见图论方面的参考书。
• 数学规划方法,用 Lingo 解决:
1 1
max
, 1
: ,
0, 1,
0
f
fn n
ij ji fj j
ij ij
v
v i
st x x v i n
i n
x c
除去源点和汇点的流量等于网络总流量之外,其他点所有流入的流量和流出的流量相等。
14
2
3
12
13
7
100
8
5
• 求最小生成树已有成熟的算法: prim 算法和 Kruskal 算法。具体可见图论方面的参考书。
• 数学规划方法,用 Lingo 解决:
1 1
11
1
min
: 1
1, 1
0 1
n n
ij iji j
n
jj
n
jij
ij
z c x
st x
x i
x
或
根至少有一条边连接到其他点
除根外 ,每个点只有一条边进入
3
1
2
4
76
59
• 旅行商问题图论中没有成熟的算法,有改良圈算法,但几乎不能找到最优解。
• 数学规划方法,用 Lingo 解决:
1 1
1
1
min
: 1, 1,2, ,
1, 1, 2, ,
1, 2
0 1, , 1,2, ,
0, 2,3, ,
n n
ij iji j
n
ijj
n
jij
i j ij
ij
i
z c x
st x j n
x i n
u u nx n i j n
x i j n
u i n
=
=
或
每个点只有一条边出去
每个点只有一条边进入除起点和终点外,
不构成回路。
只能在有哈密顿回路的情况下。
3
1
2
4
76
59
关键路径问题
• 如下图,某个项目由 4个作业(边)完成,每项作业需要一定时间(边的权值)完成,并且每项作业都需要在一定的状态(顶点)下才能开始,即要完成所有先行作业(所有进入该顶点的边)。求完成这个项目的最短时间。
• 无回路有向赋权图中的最长路径:关键路径。
14
2
3
12
13
7
100
• 关键路径问题图论中已有成熟的算法,具体可见数据结构或者图论方面的参考书。
• 数学规划方法,用 Lingo解决:
,
1
min
: , 0, , 1,2, ,
0, 0, 1,2, ,
n
j i ij i j
i
z x
st x x t t i j n
x x i n
设 xi 是作业 i 的开始时间。目标:最后一个作业的
开始时间最小。1
4
2
3
12
13
7
100
关键路径问题
• 为了得到每个作业的最早开工时间和最迟开工时间,可更改模型如下:
1
,
1
min
: , 0, , 1, 2, ,
0, 0, 1,2, ,
n
ii
ij j i ij i j
ij
i
z x
st s x x t t i j n
s
x x i n
0
全部作业的开始时间最小
当 sij>0 时,说明对应的作业的开始时间可以推迟 sij ,从而得到每个作业 i 的最迟开工时间。
关键路径还可以看成最长路,用求最短路径的方法来求解。
14
2
3
12
13
7
100