图论中几个典型问题的求解.ppt
《图论中几个典型问题的求解.ppt》由会员分享,可在线阅读,更多相关《图论中几个典型问题的求解.ppt(161页珍藏版)》请在三一办公上搜索。
1、图论中几个典型问题的求解,1 图的基本概念,图是一种直观形象地描述已知信息的方式,它使事物之间的关系简洁明了,是分析问题的有用工具,很多实际问题可以用图来描述。,一、图的定义,图论是以图为研究对象的数学分支,在图论中,图由一些点和点之间的连线所组成 称图中的点为顶点(节点),称连接顶点的没有方向的线段为边,称有方向的线段为弧用V=v1,v2,表示全体顶点的集合,用 E=e1,e2,表示全体边的集合,如果对于E中的任一条边ek,在V中都有一对顶点(vi,vj)和它对应,则称由V和E组成的集体为一个图,记为G=V,E,简写为G,二、基本概念,点与边相连接称为关联,与边e关联的顶点称为该边的端点,与
2、同一条边关联的两个顶点称为相邻顶点,与同一个顶点关联的边称为相邻边具有相同顶点的边称为平行边,两个端点重合的边称为环所有线段都没有方向的图称为无向图,所有线段都有方向的图称为有向图,既有边也有弧的图称为混合图在无向图中,没有环和平行边的图称为简单图,任意两个顶点之间都有一条边相连的简单图称为完全图任意两个顶点之间有且只有一条弧相连的有向图称为竞赛图,在无向图中与顶点v关联的边的数目(环算两次)称为该顶点的度(或次数),记为d(v)。度为奇数的顶点叫做奇点,度为偶数的顶点叫做偶点。在有向图中,从顶点v引出的边的数目称为该顶点的出度,记为d+(v),从顶点v引入的边的数目称为该顶点的入度,记为d-
3、(v),而d(v)d+(v)+d-(v)称为v的次数。,在图中,两个顶点u和v之间由顶点和边构成的交错序列(使u和v相通)称为链(通道),没有重复边的通道称为迹,起点与终点重合的通道称为闭通道,不重合的称为开通道,没有重复顶点(必然边也不重复)的开通道称为路,起点与终点重合的路称为圈(回路)包含奇数个顶点(或边)的圈称为奇圈,包含偶数个顶点(或边)的圈称为偶圈。如果顶点u和v之间存在一条路,则称u和v是连通的,任意两个顶点都连通的图称为连通图无圈的连通图称为树,如果一棵树T包含了图G的所有顶点,称T为G的生成树,如果图G的每条边e都对应一个实数C(e),称C(e)为该边e的权,称图G为赋权图通
4、常称赋权的有向图为网络图中边e6和e7是平行边,e9是环,顶点v4是悬挂点,边e4是悬挂边,2 最短路问题,最短路问题是图论应用的基础,很多实际问题,如线路的布设、运输规划、运输网络最小费用流等问题,都可以通过建立最短路模型来求解。有些有深度的图与网络优化问题,如旅行售货商、中国邮递员等问题,需要在首先求出任意两点之间最短路的基础上解决。一、最短路的概念给定一个连通的赋权图G=V,E,设R是连接节点vi和vj的一条路,该路的权定义为路中所有各边权之和,如果路R在所有连接节点vi和vj的路中权最小,则称它为vi和vj间的最短路。,二、任意两点之间的最短路(Floyd算法)Floyd算法利用距离矩
5、阵进行迭代运算,可以一次性地求出任意两点之间的最短路,该方法的思路有创意,计算量小,编程较简单,又称矩阵求解法。1算法原理 设A=aijmn是图的权矩阵(也称带权邻接矩阵),其中aij是图上连接顶点i和j的边的权,如果两顶点之间没有直接相连的边(即两顶点不相邻),则aij=。,令矩阵D(0)=A,作为迭代的初始矩阵,从它出发按照一定规则求D(1),又由D(1)按照类似的规则求D(2),依此类推进行迭代直至求出D(n),设矩阵D(m)的元素为dij(m),迭代规则为:上式表示dij(1)在dij(0)以及从顶点vi经过顶点v1到vj的权之和di1(0)+d1j(0)两者之中选择最短长度。依此规则
6、迭代。,上式表示dij(2)在dij(1)以及从顶点vi经过顶点v2到vj的权之和di2(1)+d2j(1)两者之中选择最短长度。依此类推,迭代公式为:上式表示dij(m)在dij(m-1)以及从顶点vi经过顶点vm到vj的权之和dim(m-1)+dmj(m-1)两者之中选择最短长度。当m=n时结束迭代。,2程序设计 先编写Flody算法的子程序(函数)如下:Function D,R=floyd(a)n=size(a,1);D=a;%D是初始矩阵for i=1:n for j=1:n R(i,j)=j;endend,for k=1:n for i=1:n for j=1:n if D(i,k)
7、+D(k,j)D(i,j)D(i,j)=D(i,k)+D(k,j);%在循环中进行矩阵迭代 R(i,j)=R(i,k);%R是路径矩阵 end end endendD,R%输出最短路矩阵和最短路的路径矩阵。,以上程序是通用程序,只需输入初始距离矩阵,就能输出最短路矩阵以及最短路的路径矩阵,将程序以文件名floyd.m存盘。例1 以2007年研究生数学建模竞赛C题为例,已知16个邮政支局的初始距离矩阵,求任意两个节点之间的最短路。解:编写主程序如下:a=0,27,44,17,11,27,42,inf,inf,inf,20,25,21,21,18,27,inf;inf,inf,inf,inf,30
8、,inf,inf,inf,21,13,20,inf,inf,inf,inf,9,0;D,R=floyd(a);,输入数据中的inf表示无穷大(两个顶点之间没有边直接相连)。运行以上程序,求得最短路矩阵D和最短路的路径矩阵。此处省略结果。,3 最小生成树,一、最小生成树的概念树是图论中的一种简单而重要的图,连通并且无圈的无向图称为树,常用T表示。树有以下性质:(1)树中任意两点之间有唯一路径;(2)树的边数等于顶点数减1;(3)在树中删去任意一条边就不连通;(4)在树中任意两个不相邻的顶点间添加一条边,则恰好产生一个圈。,具有n个顶点的无向连通图是树的充分必要条件是它有n-1条边连通图G的子图T
9、,如果它的顶点集与G的顶点集相同,且T为树,则称T是图G的生成树,又称支撑树。如果图的边有权(对应于边的实数),则生成树上各边权的总和称为生成树的权,生成树并不唯一,权达到最小的生成树称为最小生成树(Minimal Spanning Tree,简称MST),最小生成树不一定唯一,最小生成树是网络优化中的一个重要问题,在网络设计中有广泛的应用,例如如何修筑一些公路把若干个城镇连接起来且总里程最短;如何架设通讯网络将若干个地区连接起来且总费用最省;如何修筑水渠将水源和若干块待灌溉的土地连接起来且总距离最短等等这些应用问题通称为最优连线问题,其实质是寻找图的最小生成树,二、Prim(普里姆)算法求图
10、的最小生成树最常用的算法有两种:Prim(普里姆)算法和Kruskal(克罗斯克尔)算法,这两种方法都由贪婪法的思想发展而来。贪婪法又称贪心法,该法总是做出在当前看来最好的选择,也就是说该算法并不从整体最优考虑,它所做出的选择只是在某种意义上的局部最优选择。虽然贪婪算法不能对所有问题都得到整体最优解,但是它对某些问题能够得到整体最优解,例如图的固定起点的最短路问题,最小生成树问题。有时候,即使贪婪算法不能得到整体最优解,但其结果却是整体最优解的很好近似。,Prim算法的思路是:把所有顶点分成部分(两个集合),一个用S表示(该集合中的顶点都涂成红色),另一个用V-S表示(该集合中的顶点都涂成白色
11、),开始时S中只有一个顶点v1,其余顶点都是白色,在一个端点为红色,另一个端点为白色的边中选取权最小的边,将该边涂红(表示入选最小生成树)并且把该边的白色端点也涂红(表示移入S中)这个过程一直进行下去,S中的端点越来越多,直到所有顶点都涂成红色为止,或者说红色边达到n-1条为止。,从Prim算法的思路中可以看出,该算法的关键是如何找出连接红点和白点的所有边中找出权最小的边。若G为完全图,当前有k个红点,则有n-k个白点,有k(n-k)条连接红、白点的边,为了在如此众多的边中找到权最小的边,可以分两步走,对每一个白点,先从连接该点至k个红点的k条中找出权最小的边作为候选边,然后对n-k个白点,从
12、n-k条候选边中找出权最小的边。,实现Prim算法的Matlab编程思路如下:(1)设第一个红点是节点v1。构建初始候选边的权矩阵B。该矩阵有3行,第一行表示当前红点,开始时第一个红点是v1,故第一行都是1,第二行表示白点,开始时白点的序号是2,3,n,第三行表示连接红点和白点的边的权值。当前入选最小生成树的最短边将从该矩阵中产生。初始最小生成树T是空集。(2)对B矩阵的第3行排序,即对候选边的权值进行排序,选取最短边(权值最小的边),把该边涂红(选入最小生成树的边集T),该边的白色端点也涂成红色。,(3)将(2)选出的边移出B(不参与下一轮竞选),即将它从B矩阵中删除。当前有n-2个白点(两
13、个红点),对每个白点都有到两个红点的两条边,通过比较这两者的大小,选出权值小的边,放入B矩阵的相应位置上,由此构建新的候选边矩阵B,此时B矩阵的有n-2列。(4)对新的B矩阵重复(2)和(3),T中的边将越来越多,B矩阵的列数越来越少,当选入T中的红色边达到n-1条时结束运算,输出T。,按照以上思路编写Matlab程序如下:function T,e=prim(a)T=;%T为最小生成树的边集,开始为空集。e=0;%e是最小生成树的长度,开始为0。v=1;%v表示第一个红点是1号顶点。n=size(a,1);%n是总顶点数,它等于初始距离矩阵a的列数。c=2:n;%c代表所有白点,开始是2,3,
14、n。,for j=2:n b(1,j-1)=1;b(2,j-1)=j;b(3,j-1)=a(1,j);end%以上一段程序生成3行n-1列的矩阵,存储初始候选边及其权值信息,该矩阵的第一行都是1,表示第一个红色点是1号顶点,第二行表示白色点依次为2,3,n,第三行表示所有连接红点和白点的边的权值,while size(T,2)n-1%只要最小生成树的边数小于n-1就循环m,i=min(b(3,:);%从候选边中找出权值最小的边(其值存入变量m,序号为i)T(:,size(T,2)+1)=b(:,i);%当前最短边(含起点、终点和权值3个树中)存入T中当前列,表示入选最小生成树 e=e+b(3,
15、i);%累计最小生成树的长度 v=b(2,i);%把新入选最小生成树的边的白色端点变成当前红点,t=find(c=b(2,i);c(t)=;%把该点从白点集合中移出去b(:,i)=;%把该边从候选边中删除 for j=1:length(c)d=a(v,b(2,j);if db(3,j)b(1,j)=v;b(3,j)=d;endend,%以上循环调整候选边集合,入选该集合的边数等于当前白点数,对每一个白点入选一条边,该边通过比较连接该白点到红点的边的权值大小确定,小者入选。该循环是程序的关键和核心部分。endT,e以上程序以文件名prim.m存盘。,例2 以2007年研究生数学建模竞赛C题为例,
16、已知县邮政局X1和16个邮政支局的初始距离矩阵,求该运输图的最小生成树。解:在Matlab中输入a=0,27,44,17,11,27,42,inf,inf,inf,20,25,21,21,18,27,inf;inf,inf,inf,inf,30,inf,inf,inf,21,13,20,inf,inf,inf,inf,9,0;T,e=prim(a);,计算结果为:T=1 5 6 7 5 5 11 16 11 10 16 16 4 1 1 145 6 7 8 4 11 16 17 10 9 15 12 3 13 14 211 13 9 13 14 15 9 9 10 11 11 14 19 21
17、 21 21e=221T中每一列代表入选最小生成树的一条边,每一列有3个元素,前两个代表顶点的编号,第3个是边的权值。e是最小生成树的总长。,三、Kruskal(克罗斯克尔)算法Kruskal(克罗斯克尔)算法又称“避圈法”,也是一种贪婪算法。给定加权连通图G=V,E,Kruskal算法的基本思路如下:(1)把所有边按照权值的大小由小到大排序,将最小边入选最小生成树T。(2)从剩下的边中选取权值最小的边,并且该边与T中已经存在的边不形成圈,将它也取进T中(若某边权值虽然小,但形成圈则舍去此边,并且另选。重复步骤(2),直至入选T的边达到n-1条为止。,由以上思路可知,Kruskal算法的关键是
18、如何判断一条候选边是否会与T中已有边形成圈,下面介绍一种判断方法。设所有顶点都是红色,选入最小生成树T的边为红色,没有选入的边为白色。则红点和红边会形成一个或者一个以上的连通分支,它们都是G的子树,当一条待选边的两个端点属于同一棵子树时候就会形成圈,否则不构成圈,且该边入选后会使原来两个不连通的红色子树合并成为一棵红色连通子树。因此判断一条边是否会与现有红边形成圈,只需要判断该边的两个端点是否属于同一棵子树。,可以用下面的方法来实现以上判断:给每棵子树一个不同的编号,对每一个顶点引入一个标记t,表示该顶点所在子树的编号。当加入一条红色边时,就该边两个端点所在的子树连接起来成为一棵子树,从而两棵
19、子树中的顶点标记要改成一样。,按照以上思路编写Matlab程序如下:function T,c=kruskal(a)n=size(a,1);%n 是总顶点数m=0;for i=1:n-1 for j=i+1:n if a(i,j)0 end endend,%以上循环生成图的边权矩阵,该矩阵有3行,第1行和第2行是顶点的编号,第3行是边的权值,矩阵的列数对于图的边数,每一列代表一条边。程序运行以后,该矩阵的列数(即图的总边数记录在变量m中)。B,i=sortrows(b,3);B=B;%实现对边权矩阵按照权值大小由小到大排序,B是排序以后的边权矩阵。k=0;%k表示已经被选入最小生成树的边数t=1
20、:n;%开始每个顶点各自为一棵独立的子树,子树的编号分别1,2,n。T=;c=0;%开始时最小生成树为空集,权值之和为0,for i=1:m%对排序以后的边权矩阵,按顺序考察每一条边if t(B(1,i)=t(B(2,i)%当第i条边的两个端点所在子树的编号不相等时,该边与已经选入最小生成树的边不形成圈,于是运行以下语句 k=k+1;%入选最小生成树的边数k增加1 T(:,k)=B(:,i);%把该边选入最小生成树的集合T c=c+B(3,i);%把该边的权值加到最小生成树的总权值之中 tmin=min(t(B(1,i),t(B(2,i);tmax=max(t(B(1,i),t(B(2,i);
21、,%入选边的两个端点分别属于不同的子树,t标号不同,对这两个t标号排序 for j=1:n if t(j)=tmax t(j)=tmin;end end%将入选边所属两个t标号合并成一个(大标号改为小标号)end,if k=n-1%如果入选最小生成树的边数达到n-1,则结束计算 break;endendT,c以上程序以文件名kruskal.m存盘。,仍然以例2的数据为例,先输入数据矩阵a,然后运行T,e=kruskal(a)得到计算结果。T=6 11 16 10 1 9 15 5 7 4 12 5 3 1 1 27 16 17 11 5 10 16 6 8 5 16 11 4 13 14 14
22、9 9 9 10 11 11 11 13 13 14 14 15 19 21 21 21e=221该结果与Prim算法求出的结果相同。虽然Prim和kruskal两种算法的思路都由贪婪法发展而来,但它们用来求最小生成树时,最终输出结果必定是最优解。,最小生成树 的图形,四、用LINGO求最小生成树1.把最小生成树问题转化为整数规划采用一定的方法可以把最小生成树问题转化为整数规划,然后用LINGO求解。节点1表示树根,点i到点j的距离用Cij表示,当两个节点之间没有线路相通时,两点之间距离用M(很大的实数)表示。引入0-1整数变量xij:若xij=1(且ij)表示从i到j的边在树中,xij0则表
23、示该边不在树中。,目标函数约束条件:(1)除树根外每个点都有线路通到(且只需要一次)表示为(2)至少有一条线路从1出来,以上约束条件是必要条件,但不充分,类似于TSP问题,增加一个变量u,再附加约束条件:(1)限制uj的取值范围为:u1=0,1ujn-1,j=2,3,.,n;用以下不等式可以达到目的:uj1且uj n-1-(n-2)x1j,j1,(2)如果线路从j到k,则uk=uj+1,且避免来回重复和圈,约束条件为:ujuk+xkj-(n-2)(1-xkj)+(n-3)xjk,1kn,2jn jk;,最优连线(最小生成树)转化为整数规划:,例3 假设某电力公司计划在七个村庄之间架设电线,各村
24、庄之间的距离如图所示试求出使电线总长度最小的架线方案,2.LINGO程序编写LINGO程序如下:MODEL:sets:city/1.7/:u;!定义7个城市;link(city,city):dist,x;!距离矩阵和决策变量;endsets n=size(city);data:!dist是距离矩阵;,dist=0 3 4 7 100 100 100 3 0 3 2 4 100 100 4 3 0 100 5 7 100 7 2 100 0 2 100 6 100 4 5 2 0 1 4 100 100 7 100 1 0 2100 100 100 6 4 2 0;!这里可改为你要解决的问题的数
25、据;enddata,min=sum(link:dist*x);!目标函数;U(1)=0;for(link:bin(x);!定义X为01变量;FOR(city(K)|K#GT#1:sum(city(I)|I#ne#K:x(I,K)=1;for(city(J)|J#gt#1#and#J#ne#K:u(J)=u(K)+X(K,J)-(N-2)*(1-X(K,J)+(N-3)*X(J,K);););sum(city(J)|J#GT#1:x(1,J)=1;for(city(K)|K#gt#1:U(K)=1;U(K)=N-1-(N-2)*X(1,K););end,计算结果:目标函数值(最优连线的长度)为1
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 图论中 几个 典型 问题 求解
链接地址:https://www.31ppt.com/p-6042723.html