[高等教育]图论方法建模
合集下载
相关主题
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
2019/5/13
三、最小生成树问题
例15 用Kruskal算法求右图的最小生成树。
<<a1=[1 2 50;1 3 60]; a2=[2 4 65;2 5 40]; a3=[3 4 52;3 7 45]; a4=[4 5 50;4 6 30;4 7 42]; a5=[5 6 70]; map=[a1;a2;a3;a4;a5] [out,len]=kruskal(map)
2019/5/13
四、匹配问题
二分图的概念
• 二分图又称作二部图,是图论中的一种特殊 模型。
• 设G=(V,{R})是一个无向图。如顶点集V可
分割为两个互不相交的子集,并且图中每条
边依附的两个顶点都分属两个不同的子集。
则称图G为二分图。
1
2
3
4
5
2019/5/13
1
2
3
4
四、匹配问题
最大匹配
• 给定一个二分图G,在G的一个子图M中, M的边集{E}中的任意两条边都不依附于 同一个顶点,则称M是一个匹配。
{y2} y2饱和 y2x2 点
{y1,y2,y y1非饱
4}
和点
x1y2x 2y1
{y2,y3} y2饱和 y2x1
{y2,y3} y3饱和 y3x3
{x4,x1, {y2,y {y2,y3} N(s)=B 结束
x3}
3}
2019/5/13
四、匹配问题 • 最大匹配就是:
X1
X2
X3
X4
Y1
Y2
2019/5/13
四、匹百度文库问题
KM算法步骤
• Kuhn-Munkras算法流程: • (1)初始化可行顶标的值 • (2)用匈牙利算法寻找完备匹配 • (3)若未找到完备匹配则修改可行顶标的值 • (4)重复(2)(3)直到找到相等子图的完备匹配
为止
2019/5/13
四、匹配问题
调用km.m的m函数文件。
2019/5/13
五、旅行商问题
Euler图和Hamilton图
定义 经过G 的每条边的迹叫做G 的 Euler 迹;闭的 Euler 迹叫做 Euler 回路或 E 回路;含 Euler 回路的图叫做 Euler 图。
定义 包含G 的每个顶点的轨叫做 Hamilton(哈密顿)轨;
闭的 Hamilton 轨叫做 Hamilton 圈或 H 圈;含 Hamilton 圈的图
2019/5/13
四、匹配问题
例2 考虑完全的2部图,其中 X {x1, x2,, x5},
Y {y1, y2,, y5} 。边上的权如下矩阵。
3 5 5 4 1
2 2 0 2 2
W
2
4
4
1
0
0 1 1 0 0
1 2
13
3
l(x1) 5,l(x2 ) 2,l(x3) 4,l(x4 ) 1,l(x5) 3 l( y1) l( y5) 0
(iii) G 中有 Euler 迹的充要条件是 G 连通且至多有两个奇次
点。
2019/5/13
五、旅行商问题
例5 旅行商问题
网络流
一名推销员准备前往若干城市推销产品。 如何为他(她)设计一条最短的旅行路线(从 驻地出发,经过每个城市恰好一次,最后返回 驻地)?这一问题的研究历史十分悠久,通常 称之为旅行商问题。
2019/5/13
四、匹配问题
• 修改方法如下: • 先将一个未被匹配的顶点u(u in {x})做一次增广 路,记下哪些结点被访问那些结点没有被访问。求 出d=min{lx[i]+ly[j]-w[i,j]}其中i结点被访问,j结点没 有被访问。然后调整lx和ly:对于访问过的x顶点, 将它的可行标减去d,对于所有访问过的y顶点,将 它的可行标增加d。修改后的顶标仍是可行顶标,原 来的匹配M仍然存在,相等子图中至少出现了一条 不属于M的边,所以造成M的逐渐增广。
• 选择这样的边数最大的子集称为图的最 大匹配问题。
• 如果一个匹配中,图中的每个顶点都和 图中某条边相关联,则称此匹配为完全 匹配,也称作完备匹配。
2019/5/13
四、匹配问题
匈牙利算法
• 求最大匹配的一种显而易见的算法是:先找出 全部匹配,然后保留匹配数最多的。但是这个 算法的复杂度为边数的指数级函数。 • M中任意一条边的端点v称为(关于M的)饱和 点,G中其他定点称为非饱和点。 • 若P是图G中一条连通两个未匹配顶点的路径, 并且属M的边和不属M的边(即已匹配和待匹配的 边)在P上交替出现,则称P为相对于M的一条增 广路径。
四、匹配问题
例1 求二部图G中的最大匹配。
X1
X2
X3
X4
Y1
Y2
2019/5/13
Y3
Y4
四、匹配问题
M
xS
B
{x2y2,x3y3} x1 {x1}
{x1,x2} {y2}
{x1y2,x2,y x4 {x4}
1,x3y3}
{x4,x1} {y2}
N(s) y N(S) B yu M P
漳州师范学院数学建模课件
图与网络建模方法
第十二讲 图与网络建模方法
2019/5/13
主要内容
• 最小生成树问题 • 匹配问题 • 旅行商问题 • 最大流问题 • 最小费用最大流问题
2019/5/13
三、最小生成树问题
Kruskal算法构造最小生成树
Kruskal 算法如下: (i)选 e1 E(G) ,使得 w(e1) min 。 (ii)若 e1, e2 ,, ei 已选好,则从 E(G) {e1,e2,,ei}中选取 ei1 ,使得 ① 中无圈,且 G[{e1,e2 ,,ei ,ei1}] ② 。 w(ei1 ) min (iii)直到选得 e 1为止。
2019/5/13
三、最小生成树问题
调用leasttree_2.m的m函数文件。 命令形式: leasttree_2(a) 功能:a是权矩阵,该矩阵中的主对角全部是0, 并且不包含重复的权; 返回树的节点和权值。
2019/5/13
三、最小生成树问题
例12 用Kruskal算法求右图的最小生成树。
2019/5/13
三、最小生成树问题
例14 用Kruskal算法求右图的最小生成树。
<<a1=[1 2 50;1 3 60]; a2=[2 4 65;2 5 40]; a3=[3 4 52;3 7 45]; a4=[4 5 50;4 6 30;4 7 42]; a5=[5 6 70]; map=[a1;a2;a3;a4;a5] [out,len]=kruskal(map)
2019/5/13
四、匹配问题 • 结论: • P的路径长度必定为奇数,第一条边和最
后一条边都不属于M。
• M为G的最大匹配当且仅当不存在相对于 M的增广路径。
2019/5/13
四、匹配问题
基本步骤: (1)任意取G中的一个初始匹配M (2)若M饱和X中的每一个顶点,结束;否则转(3)
(3)在X中寻找一个M非饱和点x,置S {x}, B ;
叫做 Hamilton 图。
2019/5/13
五、旅行商问题
Euler图和Hamilton图
定理 (i)G 是 Euler 图的充分必要条件是 G 连通且每顶
点皆偶次。
(ii)
G
是
Euler
图的充分必要条件是 G
连通且 G
d
Ci
, Ci
是
i 1
圈, E(Ci ) E(C j ) (i j) 。
2019/5/13
四、匹配问题
最佳匹配
• 如果边上带权,找出权和最大的匹配叫做求 最佳匹配。
• 实际模型:某公司有职员x1,x2,…,xn,他们去 做工作y1,y2,…,yn,每个职员做各项工作的效 益未必一致,需要制定一个分工方案,使得 人尽其才,让公司获得的总效益最大。
• 数学模型:G是加权完全二分图,求总权值 最大的完备匹配。
2019/5/13
四、匹配问题
KM算法
• 对于任意的G和M,可行顶标都是存在的: • l(x) = maxw(x,y) • l(y) = 0 • 欲求完全二分图的最佳匹配,只要用匈牙利算法求
其相等子图的完备匹配;问题是当标号之后的Gl无 完备匹配时怎么办?1957年,Kuhn和Munkras给出 了一个解决该问题的有效算法,用逐次修改可行顶 标l(v)的办法使对应的相等子图之最大匹配逐次增 广,最后出现完备匹配。
命令形式: [M,MaxZjpp]=km(A,n)
功能:A是输入二部图的权矩阵,n是匹配点。 M—输出匹配矩阵; MaxZjpp—输出最优匹配的总长度。
<<A=[3 5 5 4 1;2 2 0 2 2;2 4 4 1 0;0 1 1 0 0;1 2 1 3 3]; [M,MaxZjpp]=km(A,5)
2019/5/13
四、匹配问题
KM算法
• 穷举的效率-n!,我们需要更加优秀的算法。 • 定理:设M是一个带权完全二分图G的一个完 备匹配,给每个顶点一个可行顶标(第i个x顶点的 可行标用lx[i]表示,第j个y顶点的可行标用ly[j]表 示),如果对所有的边(i,j) in G,都有lx[i]+ly[j]>=w[i,j] 成立(w[i,j]表示边的权),且对所有的边(i,j) in M,都有 lx[i]+ly[j]=w[i,j]成立,则M是图G的一个最佳匹配。
2019/5/13
四、匹配问题
例 指派问题
图的匹配
一家公司经理准备安排 N 名员工去完成 N 项任务,每人一项。由于各员工的特点不同, 不同的员工去完成同一项任务时所获得的回 报是不同的。怎样分配才能尽量的工作有人 做,更多的人有工作?
2019/5/13
x1, x2 ,, xn
四、匹配问题
这个问题可以用图的语言描述。其中 x1, x2 ,, xn 表示 工人, y1, y2 ,, yn 表示工作,边 (xi , y j ) 表示第i个人能 胜任第j项工作,这样就得到了一个二部图G,用点集 X表示{ x1, x2 ,, xn },点集Y表示{ y1, y2 ,, yn } ,二部 图G=(X,Y,E)。上述的工作分配问题就是要在图G中找 一个边集E的子集,使得集中任何两条边没有公共端 点,最好的方案就是要使此边集的边数尽可能多,这 就是匹配问题。
2019/5/13
Y3
Y4
四、匹配问题
调用pipei.m的m函数文件。 格式:[e,total]=pipei(d) 功能:d是二部图矩阵(0-1矩阵)。
e—输出匹配的路径; total—最大匹配的边数。
<<d=[0 1 0 0;1 1 0 1;0 1 1 0;0 1 1 0] [e,total]=pipei(d)
2019/5/13
三、最小生成树问题
例13 用Kruskal算法求右图的最小生成树。
<<M=Inf;a1=[M,50,60,M,M,M,M]; a2=[50,M,M,65,40,M,M]; a3=[60,M,M,52,M,M,45]; a4=[M,65,52,M,50,30,42]; a5=[M,40,M,50,M,70,M]; a6=[M,M,M,30,70,M,M]; a7=[M,M,45,42,M,M,M]; w=[a1;a2;a3;a4;a5;a6;a7] <<n=7;[a,b]=mintreek(n,w)
<<a(1,2)=50; a(1,3)=60; a(2,4)=65; a(2,5)=40; a(3,4)=52;a(3,7)=45; a(4,5)=50; a(4,6)=30;a(4,7)=42; a(5,6)=70; <<leasttree_2(a)
2019/5/13
三、最小生成树问题
调用mintreek.m的m函数文件。 命令形式: [a,b]=mintreek (n,w) 功能:w是权矩阵,该矩阵中的主对角全部是inf; n是顶点数; a返回最小生成树的权的总长度,b是返回其具体 的节点。并最终返回最小生成树的图形。
2019/5/13
三、最小生成树问题
调用kruskal.m的m函数文件。
命令形式: [out,len]=kruskal (map)
功能:map是输入矩阵,
map=[起点1 终点1 边长1;起点2 终点2 边长2;............;起点n 终点n 边长n]
out—输出边阵:[起点 终点]; len—输出最小生成树的总长度; 并最终返回最小生成树的图形。
(4)若N (S) B,则停止;否则,任意选择一点y N (S) B (5)若y为M饱和点转(6);否则作: 求一条从x到y的M可扩路P,置M ME(P), 转(2) (6)由于y是M饱和点,故M中有一边yu,置S S {u}, B B {y},转(4)
2019/5/13
三、最小生成树问题
例15 用Kruskal算法求右图的最小生成树。
<<a1=[1 2 50;1 3 60]; a2=[2 4 65;2 5 40]; a3=[3 4 52;3 7 45]; a4=[4 5 50;4 6 30;4 7 42]; a5=[5 6 70]; map=[a1;a2;a3;a4;a5] [out,len]=kruskal(map)
2019/5/13
四、匹配问题
二分图的概念
• 二分图又称作二部图,是图论中的一种特殊 模型。
• 设G=(V,{R})是一个无向图。如顶点集V可
分割为两个互不相交的子集,并且图中每条
边依附的两个顶点都分属两个不同的子集。
则称图G为二分图。
1
2
3
4
5
2019/5/13
1
2
3
4
四、匹配问题
最大匹配
• 给定一个二分图G,在G的一个子图M中, M的边集{E}中的任意两条边都不依附于 同一个顶点,则称M是一个匹配。
{y2} y2饱和 y2x2 点
{y1,y2,y y1非饱
4}
和点
x1y2x 2y1
{y2,y3} y2饱和 y2x1
{y2,y3} y3饱和 y3x3
{x4,x1, {y2,y {y2,y3} N(s)=B 结束
x3}
3}
2019/5/13
四、匹配问题 • 最大匹配就是:
X1
X2
X3
X4
Y1
Y2
2019/5/13
四、匹百度文库问题
KM算法步骤
• Kuhn-Munkras算法流程: • (1)初始化可行顶标的值 • (2)用匈牙利算法寻找完备匹配 • (3)若未找到完备匹配则修改可行顶标的值 • (4)重复(2)(3)直到找到相等子图的完备匹配
为止
2019/5/13
四、匹配问题
调用km.m的m函数文件。
2019/5/13
五、旅行商问题
Euler图和Hamilton图
定义 经过G 的每条边的迹叫做G 的 Euler 迹;闭的 Euler 迹叫做 Euler 回路或 E 回路;含 Euler 回路的图叫做 Euler 图。
定义 包含G 的每个顶点的轨叫做 Hamilton(哈密顿)轨;
闭的 Hamilton 轨叫做 Hamilton 圈或 H 圈;含 Hamilton 圈的图
2019/5/13
四、匹配问题
例2 考虑完全的2部图,其中 X {x1, x2,, x5},
Y {y1, y2,, y5} 。边上的权如下矩阵。
3 5 5 4 1
2 2 0 2 2
W
2
4
4
1
0
0 1 1 0 0
1 2
13
3
l(x1) 5,l(x2 ) 2,l(x3) 4,l(x4 ) 1,l(x5) 3 l( y1) l( y5) 0
(iii) G 中有 Euler 迹的充要条件是 G 连通且至多有两个奇次
点。
2019/5/13
五、旅行商问题
例5 旅行商问题
网络流
一名推销员准备前往若干城市推销产品。 如何为他(她)设计一条最短的旅行路线(从 驻地出发,经过每个城市恰好一次,最后返回 驻地)?这一问题的研究历史十分悠久,通常 称之为旅行商问题。
2019/5/13
四、匹配问题
• 修改方法如下: • 先将一个未被匹配的顶点u(u in {x})做一次增广 路,记下哪些结点被访问那些结点没有被访问。求 出d=min{lx[i]+ly[j]-w[i,j]}其中i结点被访问,j结点没 有被访问。然后调整lx和ly:对于访问过的x顶点, 将它的可行标减去d,对于所有访问过的y顶点,将 它的可行标增加d。修改后的顶标仍是可行顶标,原 来的匹配M仍然存在,相等子图中至少出现了一条 不属于M的边,所以造成M的逐渐增广。
• 选择这样的边数最大的子集称为图的最 大匹配问题。
• 如果一个匹配中,图中的每个顶点都和 图中某条边相关联,则称此匹配为完全 匹配,也称作完备匹配。
2019/5/13
四、匹配问题
匈牙利算法
• 求最大匹配的一种显而易见的算法是:先找出 全部匹配,然后保留匹配数最多的。但是这个 算法的复杂度为边数的指数级函数。 • M中任意一条边的端点v称为(关于M的)饱和 点,G中其他定点称为非饱和点。 • 若P是图G中一条连通两个未匹配顶点的路径, 并且属M的边和不属M的边(即已匹配和待匹配的 边)在P上交替出现,则称P为相对于M的一条增 广路径。
四、匹配问题
例1 求二部图G中的最大匹配。
X1
X2
X3
X4
Y1
Y2
2019/5/13
Y3
Y4
四、匹配问题
M
xS
B
{x2y2,x3y3} x1 {x1}
{x1,x2} {y2}
{x1y2,x2,y x4 {x4}
1,x3y3}
{x4,x1} {y2}
N(s) y N(S) B yu M P
漳州师范学院数学建模课件
图与网络建模方法
第十二讲 图与网络建模方法
2019/5/13
主要内容
• 最小生成树问题 • 匹配问题 • 旅行商问题 • 最大流问题 • 最小费用最大流问题
2019/5/13
三、最小生成树问题
Kruskal算法构造最小生成树
Kruskal 算法如下: (i)选 e1 E(G) ,使得 w(e1) min 。 (ii)若 e1, e2 ,, ei 已选好,则从 E(G) {e1,e2,,ei}中选取 ei1 ,使得 ① 中无圈,且 G[{e1,e2 ,,ei ,ei1}] ② 。 w(ei1 ) min (iii)直到选得 e 1为止。
2019/5/13
三、最小生成树问题
调用leasttree_2.m的m函数文件。 命令形式: leasttree_2(a) 功能:a是权矩阵,该矩阵中的主对角全部是0, 并且不包含重复的权; 返回树的节点和权值。
2019/5/13
三、最小生成树问题
例12 用Kruskal算法求右图的最小生成树。
2019/5/13
三、最小生成树问题
例14 用Kruskal算法求右图的最小生成树。
<<a1=[1 2 50;1 3 60]; a2=[2 4 65;2 5 40]; a3=[3 4 52;3 7 45]; a4=[4 5 50;4 6 30;4 7 42]; a5=[5 6 70]; map=[a1;a2;a3;a4;a5] [out,len]=kruskal(map)
2019/5/13
四、匹配问题 • 结论: • P的路径长度必定为奇数,第一条边和最
后一条边都不属于M。
• M为G的最大匹配当且仅当不存在相对于 M的增广路径。
2019/5/13
四、匹配问题
基本步骤: (1)任意取G中的一个初始匹配M (2)若M饱和X中的每一个顶点,结束;否则转(3)
(3)在X中寻找一个M非饱和点x,置S {x}, B ;
叫做 Hamilton 图。
2019/5/13
五、旅行商问题
Euler图和Hamilton图
定理 (i)G 是 Euler 图的充分必要条件是 G 连通且每顶
点皆偶次。
(ii)
G
是
Euler
图的充分必要条件是 G
连通且 G
d
Ci
, Ci
是
i 1
圈, E(Ci ) E(C j ) (i j) 。
2019/5/13
四、匹配问题
最佳匹配
• 如果边上带权,找出权和最大的匹配叫做求 最佳匹配。
• 实际模型:某公司有职员x1,x2,…,xn,他们去 做工作y1,y2,…,yn,每个职员做各项工作的效 益未必一致,需要制定一个分工方案,使得 人尽其才,让公司获得的总效益最大。
• 数学模型:G是加权完全二分图,求总权值 最大的完备匹配。
2019/5/13
四、匹配问题
KM算法
• 对于任意的G和M,可行顶标都是存在的: • l(x) = maxw(x,y) • l(y) = 0 • 欲求完全二分图的最佳匹配,只要用匈牙利算法求
其相等子图的完备匹配;问题是当标号之后的Gl无 完备匹配时怎么办?1957年,Kuhn和Munkras给出 了一个解决该问题的有效算法,用逐次修改可行顶 标l(v)的办法使对应的相等子图之最大匹配逐次增 广,最后出现完备匹配。
命令形式: [M,MaxZjpp]=km(A,n)
功能:A是输入二部图的权矩阵,n是匹配点。 M—输出匹配矩阵; MaxZjpp—输出最优匹配的总长度。
<<A=[3 5 5 4 1;2 2 0 2 2;2 4 4 1 0;0 1 1 0 0;1 2 1 3 3]; [M,MaxZjpp]=km(A,5)
2019/5/13
四、匹配问题
KM算法
• 穷举的效率-n!,我们需要更加优秀的算法。 • 定理:设M是一个带权完全二分图G的一个完 备匹配,给每个顶点一个可行顶标(第i个x顶点的 可行标用lx[i]表示,第j个y顶点的可行标用ly[j]表 示),如果对所有的边(i,j) in G,都有lx[i]+ly[j]>=w[i,j] 成立(w[i,j]表示边的权),且对所有的边(i,j) in M,都有 lx[i]+ly[j]=w[i,j]成立,则M是图G的一个最佳匹配。
2019/5/13
四、匹配问题
例 指派问题
图的匹配
一家公司经理准备安排 N 名员工去完成 N 项任务,每人一项。由于各员工的特点不同, 不同的员工去完成同一项任务时所获得的回 报是不同的。怎样分配才能尽量的工作有人 做,更多的人有工作?
2019/5/13
x1, x2 ,, xn
四、匹配问题
这个问题可以用图的语言描述。其中 x1, x2 ,, xn 表示 工人, y1, y2 ,, yn 表示工作,边 (xi , y j ) 表示第i个人能 胜任第j项工作,这样就得到了一个二部图G,用点集 X表示{ x1, x2 ,, xn },点集Y表示{ y1, y2 ,, yn } ,二部 图G=(X,Y,E)。上述的工作分配问题就是要在图G中找 一个边集E的子集,使得集中任何两条边没有公共端 点,最好的方案就是要使此边集的边数尽可能多,这 就是匹配问题。
2019/5/13
Y3
Y4
四、匹配问题
调用pipei.m的m函数文件。 格式:[e,total]=pipei(d) 功能:d是二部图矩阵(0-1矩阵)。
e—输出匹配的路径; total—最大匹配的边数。
<<d=[0 1 0 0;1 1 0 1;0 1 1 0;0 1 1 0] [e,total]=pipei(d)
2019/5/13
三、最小生成树问题
例13 用Kruskal算法求右图的最小生成树。
<<M=Inf;a1=[M,50,60,M,M,M,M]; a2=[50,M,M,65,40,M,M]; a3=[60,M,M,52,M,M,45]; a4=[M,65,52,M,50,30,42]; a5=[M,40,M,50,M,70,M]; a6=[M,M,M,30,70,M,M]; a7=[M,M,45,42,M,M,M]; w=[a1;a2;a3;a4;a5;a6;a7] <<n=7;[a,b]=mintreek(n,w)
<<a(1,2)=50; a(1,3)=60; a(2,4)=65; a(2,5)=40; a(3,4)=52;a(3,7)=45; a(4,5)=50; a(4,6)=30;a(4,7)=42; a(5,6)=70; <<leasttree_2(a)
2019/5/13
三、最小生成树问题
调用mintreek.m的m函数文件。 命令形式: [a,b]=mintreek (n,w) 功能:w是权矩阵,该矩阵中的主对角全部是inf; n是顶点数; a返回最小生成树的权的总长度,b是返回其具体 的节点。并最终返回最小生成树的图形。
2019/5/13
三、最小生成树问题
调用kruskal.m的m函数文件。
命令形式: [out,len]=kruskal (map)
功能:map是输入矩阵,
map=[起点1 终点1 边长1;起点2 终点2 边长2;............;起点n 终点n 边长n]
out—输出边阵:[起点 终点]; len—输出最小生成树的总长度; 并最终返回最小生成树的图形。
(4)若N (S) B,则停止;否则,任意选择一点y N (S) B (5)若y为M饱和点转(6);否则作: 求一条从x到y的M可扩路P,置M ME(P), 转(2) (6)由于y是M饱和点,故M中有一边yu,置S S {u}, B B {y},转(4)
2019/5/13