




已阅读5页,还剩156页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
图论中几个典型问题的求解,1图的基本概念,图是一种直观形象地描述已知信息的方式,它使事物之间的关系简洁明了,是分析问题的有用工具,很多实际问题可以用图来描述。,一、图的定义,图论是以图为研究对象的数学分支,在图论中,图由一些点和点之间的连线所组成称图中的点为顶点(节点),称连接顶点的没有方向的线段为边,称有方向的线段为弧用V=v1,v2,表示全体顶点的集合,用E=e1,e2,表示全体边的集合,如果对于E中的任一条边ek,在V中都有一对顶点(vi,vj)和它对应,则称由V和E组成的集体为一个图,记为G=V,E,简写为G,二、基本概念,点与边相连接称为关联,与边e关联的顶点称为该边的端点,与同一条边关联的两个顶点称为相邻顶点,与同一个顶点关联的边称为相邻边具有相同顶点的边称为平行边,两个端点重合的边称为环所有线段都没有方向的图称为无向图,所有线段都有方向的图称为有向图,既有边也有弧的图称为混合图在无向图中,没有环和平行边的图称为简单图,任意两个顶点之间都有一条边相连的简单图称为完全图任意两个顶点之间有且只有一条弧相连的有向图称为竞赛图,在无向图中与顶点v关联的边的数目(环算两次)称为该顶点的度(或次数),记为d(v)。度为奇数的顶点叫做奇点,度为偶数的顶点叫做偶点。在有向图中,从顶点v引出的边的数目称为该顶点的出度,记为d+(v),从顶点v引入的边的数目称为该顶点的入度,记为d-(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为赋权图通常称赋权的有向图为网络图中边e6和e7是平行边,e9是环,顶点v4是悬挂点,边e4是悬挂边,2最短路问题,最短路问题是图论应用的基础,很多实际问题,如线路的布设、运输规划、运输网络最小费用流等问题,都可以通过建立最短路模型来求解。有些有深度的图与网络优化问题,如旅行售货商、中国邮递员等问题,需要在首先求出任意两点之间最短路的基础上解决。一、最短路的概念给定一个连通的赋权图G=V,E,设R是连接节点vi和vj的一条路,该路的权定义为路中所有各边权之和,如果路R在所有连接节点vi和vj的路中权最小,则称它为vi和vj间的最短路。,二、任意两点之间的最短路(Floyd算法)Floyd算法利用距离矩阵进行迭代运算,可以一次性地求出任意两点之间的最短路,该方法的思路有创意,计算量小,编程较简单,又称矩阵求解法。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)两者之中选择最短长度。依此规则迭代。,上式表示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算法的子程序(函数)如下:FunctionD,R=floyd(a)n=size(a,1);D=a;%D是初始矩阵fori=1:nforj=1:nR(i,j)=j;endend,fork=1:nfori=1:nforj=1:nifD(i,k)+D(k,j)D(i,j)D(i,j)=D(i,k)+D(k,j);%在循环中进行矩阵迭代R(i,j)=R(i,k);%R是路径矩阵endendendendD,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,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,如果它的顶点集与G的顶点集相同,且T为树,则称T是图G的生成树,又称支撑树。如果图的边有权(对应于边的实数),则生成树上各边权的总和称为生成树的权,生成树并不唯一,权达到最小的生成树称为最小生成树(MinimalSpanningTree,简称MST),最小生成树不一定唯一,最小生成树是网络优化中的一个重要问题,在网络设计中有广泛的应用,例如如何修筑一些公路把若干个城镇连接起来且总里程最短;如何架设通讯网络将若干个地区连接起来且总费用最省;如何修筑水渠将水源和若干块待灌溉的土地连接起来且总距离最短等等这些应用问题通称为最优连线问题,其实质是寻找图的最小生成树,二、Prim(普里姆)算法求图的最小生成树最常用的算法有两种:Prim(普里姆)算法和Kruskal(克罗斯克尔)算法,这两种方法都由贪婪法的思想发展而来。贪婪法又称贪心法,该法总是做出在当前看来最好的选择,也就是说该算法并不从整体最优考虑,它所做出的选择只是在某种意义上的局部最优选择。虽然贪婪算法不能对所有问题都得到整体最优解,但是它对某些问题能够得到整体最优解,例如图的固定起点的最短路问题,最小生成树问题。有时候,即使贪婪算法不能得到整体最优解,但其结果却是整体最优解的很好近似。,Prim算法的思路是:把所有顶点分成部分(两个集合),一个用S表示(该集合中的顶点都涂成红色),另一个用V-S表示(该集合中的顶点都涂成白色),开始时S中只有一个顶点v1,其余顶点都是白色,在一个端点为红色,另一个端点为白色的边中选取权最小的边,将该边涂红(表示入选最小生成树)并且把该边的白色端点也涂红(表示移入S中)这个过程一直进行下去,S中的端点越来越多,直到所有顶点都涂成红色为止,或者说红色边达到n-1条为止。,从Prim算法的思路中可以看出,该算法的关键是如何找出连接红点和白点的所有边中找出权最小的边。若G为完全图,当前有k个红点,则有n-k个白点,有k(n-k)条连接红、白点的边,为了在如此众多的边中找到权最小的边,可以分两步走,对每一个白点,先从连接该点至k个红点的k条中找出权最小的边作为候选边,然后对n-k个白点,从n-k条候选边中找出权最小的边。,实现Prim算法的Matlab编程思路如下:(1)设第一个红点是节点v1。构建初始候选边的权矩阵B。该矩阵有3行,第一行表示当前红点,开始时第一个红点是v1,故第一行都是1,第二行表示白点,开始时白点的序号是2,3,n,第三行表示连接红点和白点的边的权值。当前入选最小生成树的最短边将从该矩阵中产生。初始最小生成树T是空集。(2)对B矩阵的第3行排序,即对候选边的权值进行排序,选取最短边(权值最小的边),把该边涂红(选入最小生成树的边集T),该边的白色端点也涂成红色。,(3)将(2)选出的边移出B(不参与下一轮竞选),即将它从B矩阵中删除。当前有n-2个白点(两个红点),对每个白点都有到两个红点的两条边,通过比较这两者的大小,选出权值小的边,放入B矩阵的相应位置上,由此构建新的候选边矩阵B,此时B矩阵的有n-2列。(4)对新的B矩阵重复(2)和(3),T中的边将越来越多,B矩阵的列数越来越少,当选入T中的红色边达到n-1条时结束运算,输出T。,按照以上思路编写Matlab程序如下:functionT,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,n。,forj=2:nb(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,第三行表示所有连接红点和白点的边的权值,whilesize(T,2)1,(2)如果线路从j到k,则uk=uj+1,且避免来回重复和圈,约束条件为:ujuk+xkj-(n-2)(1-xkj)+(n-3)xjk,1kn,2jnjk;,最优连线(最小生成树)转化为整数规划:,例3假设某电力公司计划在七个村庄之间架设电线,各村庄之间的距离如图所示试求出使电线总长度最小的架线方案,2.LINGO程序编写LINGO程序如下:MODEL:sets:city/1.7/:u;!定义7个城市;link(city,city):dist,x;!距离矩阵和决策变量;endsetsn=size(city);data:!dist是距离矩阵;,dist=034710010010030324100100430100571007210002100610045201410010071001021001001006420;!这里可改为你要解决的问题的数据;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,计算结果:目标函数值(最优连线的长度)为13,最优连线的构成如图所示,4旅行商问题,一、旅行商问题的基本概念,旅行商问题(又称货郎担问题,travelingsalesmanproblem,简称TSP问题)是典型的组合优化问题,并且是一个NP完全难题,其提法为:有n个城市,相互之间的旅行费用(或距离)为已知,有一个旅行推销商,从某个基点城市出发,要遍访其余n-1个城市至少一次,最后回到出发点,试找出总费用最小(或总路程最短)的旅行路线。称能够到每个城市至少一次的回路为旅行商回路,其中费用最少者为最优旅行商回路.,在图论中,经过所有顶点恰好一次的圈(路)称为哈密顿圈(路),简称H圈(H路),存在H圈的图称为哈密顿图,简称H图。旅行商问题是指在赋权图上经过每个顶点至少一次,且总长度(路径上权的总和)达到最小的闭通路。在加权的连通无向图中,权最小的H圈简称最优H圈;经过每个顶点至少一次且权最小的闭通路称为最优旅行商回路。注意:最优H圈与最优旅行商回路两者是有区别的,最优H圈只允许经过每个顶点恰好一次,而最优旅行商回路允许经过某些顶点一次以上。,定理1在加权图G=(V,E)中,若对任意顶点x,y,z(zx,zy),都满足w(x,y)w(x,z)+w(y,z)(三角形的两边之和大于等于第三边,称为三角不等式),则该图的最优哈密顿圈也是最优旅行商回路。对于连通的非完全赋权图G,先求出任意两点之间的最短路,然后用最短路作为每一条边的权,构造一个以V为顶点集的完全图G=(V,E),容易证明,在如此构造出来的图G中,各边的权自然满足三角不等式,故在加权图G中寻求最优旅行商回路的问题就可以转化为在图G中寻求最优哈密顿圈的问题。,寻找最优哈密顿圈和最优旅行商回路是图论中的典型问题,而且是一个NP完全难题。问题的求解没有多项式时间算法,除了穷举法,目前还没有寻找最优解的算法,随着顶点数的增加,运算所需时间呈指数级增长,当顶点数较大时,求出最优解所需时间可能是难以忍受的。可行的方法是用近似算法,力争在较短时间寻找接近最优解的近似最优解。旅行商问题得到了许多学者的关注和长期研究,提出了多种近似算法,例如分支定界法、遗传算法、模拟退火法、蚁群算法、神经网络方法、粒子群优化算法、重绕最小生成树法、二次逐边修正法等。,二、用LINGO求解TSP问题的方法一1.把最优哈密顿圈问题转化为0-1线性规划将任意两点之间的最短路作为两点之间边的权构造完全图G。引入0-1整数变量xij(且ij):若xij=1则边i-j在回路中,而xij0则表示否。目标函数首先必须满足约束条件:对每个城市访问一次且仅一次。从城市i出发一次(到其它城市去),表示为,从某个城市到达j一次且仅一次,表示为:以上建立的模型类似于指派问题的模型,对TSP问题只是必要条件,并不充分。,例如,用图示路线连接六个城市,满足以上两个约束条件,但这样的路线出现了两个子回路,两者之间不通,不构成整体巡回路线。为此需要考虑增加充分的约束条件以避免产生子巡回。下面介绍一种方法:增加变量ui,i=2,3,n,(它的大小可以取正整数:例如从起点出发所达到的城市u=2,依此类推)。,附加约束条件:ui-uj+nxijn-1,i=1,n,j=2,n,且ij。下面证明:(1)任何含子巡回的路线都必然不满足该约束条件(不管ui如何取值);(2)全部不含子巡回的整体巡回路线都可以满足该约束条件(只要ui取适当值)。用反证法证明(1),假设存在子巡回,则至少有两个子巡回。那么(必然)至少有一个子巡回中不含起点城市1,如上图中的4564,则必有u4-u5+nn-1,u5-u6+nn-1,u6-u4+nn-1,把这三个不等式加起来得到nn-1,不可能,故假设不能成立。而对整体巡回,因为附加约束中j2,不包含起点城市1,故不会发生矛盾。,对于整体巡回路线,只要ui取适当值,都可以满足该约束条件:()对于总巡回上的边,xij=1,ui可取访问城市i的顺序数,则必有ui-uj-1,约束条件ui-uj+nxijn-1变成:-1+nn-1,必然成立。()对于非总巡回上的边,因为xij=0,约束条件ui-uj+nxijn-1变成-1n-1,肯定成立。综上所述,该约束条件只限止子巡回,不影响其它,于是TSP问题转化成了一个整数线性规划问题。,求最优哈密顿圈可以表示为规划:,2.LINGO程序!旅行售货员问题;model:sets:city/1.17/:u;!定义17个城市;link(city,city):dist,!距离矩阵;x;!决策变量;endsetsn=size(city);data:!距离矩阵;,C=016.311.910.12812.9620.628.422.220.835.722.130.223.727.83616.3012.226.423.98.810.336.940.132.216.731.614.722.87.411.519.711.912.202236.1215.932.540.334.128.943.826.93519.617.625.810.126.422020.42316.110.518.312.115.228.132.238.433.837.946.12823.936.120.4015.1342416.28.37.27.724.31831.335.432.912.98.8212315.1018.933.531.323.47.922.89.217.316.220.328.5610.35.916.13418.9026.634.428.226.841.72533.117.721.83020.636.932.510.52433.526.607.815.725.731.742.74244.348.456.628.440.140.318.316.231.334.47.807.923.423.940.534.247.551.649.122.232.234.112.18.323.428.215.77.9015.51632.626.339.643.741.220.816.728.915.27.27.926.825.723.415.5014.917.125.224.128.236.435.731.643.828.17.722.841.731.723.91614.9018.410.325.733.425.222.114.726.932.224.39.22542.740.532.617.118.408.17.326.22330.222.83538.41817.333.14234.226.325.210.38.1015.423.114.923.77.419.633.831.316.217.744.347.539.624.125.77.315.4018.920.327.811.517.637.935.420.321.848.451.643.728.233.426.223.118.908.23619.725.846.132.928.53056.649.141.236.425.22314.920.38.20;,!这里可改为你要解决的问题的数据;enddata!目标函数;min=sum(link:dist*x);FOR(city(K):!进入城市K;sum(city(I)|I#ne#K:x(I,K)=1;!离开城市K;sum(city(J)|J#ne#K:x(K,J)=1;);!保证不出现子圈;,for(city(I)|I#gt#1:for(city(J)|J#gt#1#and#I#ne#J:u(I)-u(J)+n*x(I,J)=n-1););!限制u的范围以加速模型的求解,保证所加限制并不排除掉TSP问题的最优解;for(city(I):u(I)=n-1);for(link:bin(x);!定义X为01变量;end,计算结果:目标函数值:159.3路线:17316171413152611125109841因为以上规划是线性规划,所以求解不费时,当顶点数为2030个时,一般几分钟就可以得到最优解。利用LINGO软件的强大优化能力,不必研究旅行商问题的算法,通过编写不太复杂的LINGO程序,能够较快地解决实际问题,达到事半功倍的效果。,三、用LINGO求解TSP问题的方法二1.对城市排序,找出最优排序在现实中的城市交通图中,有些城市之间有直接道路,有些则没有,如果两点之间没有直接的通路,则两点之间的距离取最短路(经过其它点),即用任意两点之间的最短路Cij作为图的距离矩阵,构成一个完全图G,其任意一对顶点都有一条边相连。图G的最优旅行商回路等价于图G的最优哈密顿圈,此时形式上的环形巡回路线实际上个别点有可能不止经过一次。,设某个城市为旅行的出发地和终点(相当于总部所在地),旅行者从该城市出发到其它n个城市各一次且仅一次,最后回到出发地。我们把行进路线分成n步,每一步到一个城市(第n+1步返回出发地),于是一条旅行路线就相当于n个城市的一种排列,n个城市共有n!种排列方式。排序不同则总里程(或费用)可能不同,总里程(或总费用)最小的排序就是我们要寻找的最优路线。,引入0-1型决策变量Xkj,下标k表示旅行的步数,下标j表示到达哪一个城市,Xkj=1表示旅行者第k个目的地(到达点)是城市j,Xkj=0则表示否。用lj表示总部到各城市的距离,用Cij表示城市i与城市j之间的最短路。从出发地到第1个点的路程为从最后一个点返回出发地的里程为,假设在第k步到达城市i,在第k+1步达到城市j,即Xki=Xk+1,j=1,则走过的里程为:CijXkiXk+1,j从第1点到第n点走过的总里程为目标函数为,约束条件有以下2条:(1)每一步到达一个城市,即(2)每一个城市必须到一次且只需一次,即,综上所述,可以把最优哈密顿圈问题转化成如下非线性0-1规划,以上规划中允许包含其它约束条件。用LINGO可以求解该规划,举例如下。某县邮局和10个乡镇支局组成该县的邮政运输网络,已知县局到各支局的距离和支局之间的距离矩阵(数据在程序中)。用一辆邮车完成邮件运输任务,邮车从县局出发到各支局去一次且只需一次,最后回到县局,求总路程最短的行驶路线。解:本题是“旅行商”问题。可以用上面介绍的方法求解。,编写LINGO程序如下:MODEL:SETS:CITY/1.10/:JL;STEP/1.10/;LINE(STEP,CITY):X;LINKS(CITY,CITY):C;ENDSETS,DATA:JL=71,56,27,30,28,26,15,9,30,27;C=0,15,44,47,64,83,86,75,93,9815,0,29,32,49,68,71,60,78,8344,29,0,20,37,53,42,31,49,5447,32,20,0,17,36,42,39,60,5764,49,37,17,0,19,37,37,58,5583,68,53,36,19,0,18,35,56,4786,71,42,42,37,18,0,24,38,2975,60,31,39,37,35,24,0,21,2693,78,49,60,58,56,38,21,0,2998,83,54,57,55,47,29,26,29,0;ENDDATA,FOR(LINE:BIN(X);M1=SIZE(STEP);FOR(CITY(I):SUM(STEP(N):X(N,I)=1);FOR(STEP(N):SUM(CITY(I):X(N,I)=1);L1=SUM(CITY(I):(X(1,I)+X(M1,I)*JL(I);LX=SUM(STEP(N)|N#LT#M1:SUM(LINKS(I,J):C(I,J)*X(N,I)*X(N+1,J);MIN=L1+LX;END,在程序运行前需要对LINGO的参数作必要的设置。对于非线性规划,LINGO提供两种求解方法,一种是“GlobalSolver”(称为全局优化求解器),另一种是“MultistartSolver”(称为多起点算法),全局优化求解器优点是确保找到全局最优解,缺点是有时需要较长运行时间。多起点算法的优点是节省运行时间,但不能保证找到的解就是全局最优解,设置起点数多一些往往找到的解就是全局最优解。点击菜单“Options”,再打开全局优化求解器“GlobalSolver”选项,可以选或不选“GlobalSolver”,当选择多起点算法“MultistartSolver”时,需要设置起点数,若选择“SolverDecides”表示由LINGO决定。,对以上程序,我们选择“GlobalSolver”,点击菜单“Options”,在全局优化求解器“GlobalSolver”选项框内打“”,再点击“确定”。运行以上程序,费时4分多钟,得到最优解:目标函数值(总路程)260公里邮车的行驶路线为:县局89107654123县局,四、多旅行商(MTSP)问题1.多旅行商问题的概念在现实中问题中,有时候不是由一人走遍所有点,而是由几个人分工合作,每个人只到其中部分城市,每个点都有人来过一次且只需一次,事先不指定谁到哪些点,求出使总路程最小的旅行规划(每个人的行走路线)。例如邮路规划中,为了在允许的时间内完成邮件运输任务,县局的邮车往往不止1辆,而是用若干辆邮车分工运输,只要保证每个支局有邮车来过即可,为了节省行驶费用,需要规划几辆邮车的最佳路线。这就是多旅行商问题。,多旅行商问题的提法如下:有n+1个城市,相互间的路程(或旅行费用)为已知,有k个旅行商都从总部所在城市出发,赴其它城市旅行推销,分工遍历其余n个城市,即每个城市各有任意一名旅行商来过一次且仅一次,最后都回到出发地,目标是总路程最短或总费用最省。多旅行商问题在物流配送、邮路优化等方面具有较高的实用价值,而在现实问题中,研究对象往往不是单纯的旅行商问题,而要考虑各种约束条件,例如时间约束、载重量约束等等。研究这一类带约束条件的多旅行商问题具有很强的现实意义。,在现实的多旅行商问题中,往往带有约束条件,例如时间约束、载重量约束等等。带约束条件的多旅行商问题具有广泛现实意义,且是极具挑战性的难题,我们仍然把它转化为0-1非线性规划并编成LINGO程序来求解。实例某县邮政局管辖16个支局,已知县局到各支局的距离以及16个支局之间的距离矩阵。寄达各支局和各支局收寄的邮件(袋)如下表所示:,县邮局和各支局分布图,每一辆邮车最多装载65袋邮件,邮车的运行成本为3元/公里。试用最少邮车,并规划邮车的行驶路线使总费用最省。分析:首先考虑最少邮车数量,由题目所给表中数据,寄达16个支局的邮件总数为176袋,从各支局收寄的邮件总数为170袋,每一辆邮车最多容纳65袋邮件,至少需要176/652.7辆邮车,由于邮车数量为整数,故最少需要3辆邮车。如果3辆邮车能够完成邮件运输任务,则3辆车就是邮车数量的最优解。,运输费用与行驶里程成正比,总里程最短对应总费用最省。把16个支局放在一起作为一个整体考虑,找出3条邮路,每条邮路都从县局出发,到若干支局进行卸装,最后回到县局。各邮车路过的支局数量未知,合理安排各邮车的行驶路线,由3辆邮车分别承包运输,在满足运载量约束前提下,把3条巡回路线的总里程最小作为优化的目标。该问题相当于附带约束条件的多旅行商模型。,2.0-1规划模型引入0-1型决策变量Xkj,Ykj,Zkj,分别表示3辆邮车第k步到达支局j,下标k表示邮车行走的步数,下标j表示到达哪一个支局,当决策变量Xkj,Ykj,Zkj等于1时分别表示某邮车第k个装卸点是支局j,等于0时表示否。设各邮车管辖的支局数量分别为m1,m2,m3,则m1+m2+m3=16。约束条件有以下3条:(1)任何一辆车在任何一步到达一个支局,即,(2)任何一个支局必须有一辆邮车到达一次且只需要一次,即(3)在邮车行进的任何路段上,装载的邮件不超过65袋。设寄达各支局的邮件量为Pj,各支局收寄的邮件量为Qj。装载量是动态变化的,以第1辆邮车为例,出发时的装载量为,到第1个支局卸装以后,装载量变为在行驶过程中,装载量的递推公式为约束条件为,综上所述,建立多旅行商问题的0-1规划模型如下:,装载量的计算公式为:,3.LINGO程序编写LINGO程序如下:MODEL:SETS:STATION/1.16/:JL,P,Q;STEPX/1.6/:WX;STEPY/1.5/:WY;STEPZ/1.5/:WZ;LINEX(STEPX,STATION):X;LINEY(STEPY,STATION):Y;LINEZ(STEPZ,STATION):Z;LINKS(STATION,STATION):C;ENDSETS,DATA:JL=27361711243144403020252121182736;P=10,15,6,9,13,6,11,4,13,17,11,2,11,21,13,14;Q=9,14,5,10,9,10,13,9,15,9,6,7,13,15,10,16;C=0312738515871675747524821415261310193327324564534761575248566327190142734474939294238382938443833140132033352515333232152430512727130921372626434545282938583234209013323235475252353342714547332113019303950656548444067644935373219011203154613425215753392526323011010204351241413474729152635392010018364114918,526142334347503120180234625142348573832455265544336230272233422152383245526561514146270394857414829152835483424142522390112052563824293344251491433481109616344303842402113182342572090;ENDDATA,FOR(LINEX:BIN(X);FOR(LINEY:BIN(Y);FOR(LINEZ:BIN(Z);M1=SIZE(STEPX);M2=SIZE(STEPY);M3=SIZE(STEPZ);FOR(STATION(I):SUM(STEPX(N):X(N,I)+SUM(STEPY(N):Y(N,I)+SUM(STEPZ(N):Z(N,I)=1);FOR(STEPX(N):SUM(STATION(I):X(N,I)=1);FOR(STEPY(N):SUM(STATION(I):Y(N,I)=1);FOR(STEPZ(N):SUM(STATION(I):Z(N,I)=1);,WX0=SUM(STATION(I):P*SUM(STEPX(N):X(N,I);WY0=SUM(STATION(I):P*SUM(STEPY(N):Y(N,I);WZ0=SUM(STATION(I):P*SUM(STEPZ(N):Z(N,I);WX(1)=WX0-SUM(STATION(J):(P(J)-Q(J)*X(1,J);WY(1)=WY0-SUM(STATION(J):(P(J)-Q(J)*Y(1,J);WZ(1)=WZ0-SUM(STATION(J):(P(J)-Q(J)*Z(1,J);FOR(STEPX(N)|N#GE#2:WX(N)=WX(N-1)-SUM(STATION(J):(P(J)-Q(J)*X(N,J);FOR(STEPY(N)|N#GE#2:WY(N)=WY(N-1)-SUM(STATION(J):(P(J)-Q(J)*Y(N,J);FOR(STEPZ(N)|N#GE#2:WZ(N)=WZ(N-1)-SUM(STATION(J):(P(J)-Q(J)*Z(N,J);WX0=65;WY0=65;WZ0=65;FOR(STEPX(N):WX(N)=65);FOR(STEPY(N):WY(N)1,%表示有2个或以上互不连通的部分return%不是连通图就返回endn=max(max(E(:,1:2);%n是图的顶点总数m=size(E,1);%m是边的总数,fori=1:nb(i)=0;forj=1:mifE(j,1)=i|E(j,2)=ib(i)=b(i)+1;endendend%b表示各顶点的度数,rp=rem(b,2);%各顶点的度数除2取余数,偶点的余数为0,奇点的余数为1srp=sum(rp);%srp是rp的总和switchsrpcase0,%若余数的总和为0,则所有顶点为偶点,原图是欧拉图eu=1;case2,%恰好有两个奇点,原图是半欧拉图eu=0.5;otherwise,%否则是非欧拉图return,end%以下程序寻找一条欧拉巡回或欧拉道路ifsrp=0,%对于欧拉图v1=1;%把第一个顶点作为欧拉巡回的起点else%对于半欧拉图v1=find(rp);%先找出奇点v1=v1(1);%把第一个奇点作为欧拉道路的起点end,vc=v1;%vc是当前顶点m=size(E,1);%m是边的总数E1=E(:,1:2),1:m;%E1代表候选边集,开始时它的前两列与E相同,第三列表示边的顺序号%以下是Fleury算法whileisempty(E1),%若E1非空则循环evc=find(E1(:,1)=vc)|(E1(:,2)=vc);%找出与当前顶点vc关联的边levc=length(evc);%统计与当前顶点vc关联的边的总数,iflevc=1,%只有一条路cEu=cEu;E1(evc,3);%把新的边加入欧拉巡回或欧拉道路中vcold=vc;vc=sum(E1(evc,1:2)-vc;%vc为新的当前点E1=E1(setdiff(1:size(E1,1),evc),:);%删除孤立顶点E2=E1(:,1:2);E2gv=E2vcold;E2(E2gv)=E2(E2gv)-1;,E1(:,1:2)=E2;ifvcvcold,vc=vc-1;endifv1vcold,v1=v1-1;endelse%从顶点vc出发有若干条路可供选择,fork=1:levc,E2=E1(setdiff(1:size(E1,1),evc(k),:);ncv=arComp(E2);%确定E2的互不相连的分枝数目nco=max(ncv);if(max(ncv)=1),%此时E2为连通图,即选中的边不是割边(桥)cEu=cEu;E1(evc(k),3);%把该边加入欧拉巡回或欧拉道路中,vc=sum(E1(evc(k),1:2)-vc;%vc为新的当前点E1=E2;break;endendendendreturn,在fleury算法过程中,每次预选一条边,需要判断它是否为当前子图的割边,为此先假定把该边从当前边集中删去,然后判断余下的子图是否连通,若不连通,则选中的边是当前子图的割边,若仍然连通,则不是割边,可以把该边加入巡回中。在程序arEuler中,通过调用函数arComp来确定图的互不连通的分枝数,根据它的返回结果判定图的连通性。,functionncV=arComp(E,n)%功能是确定图的互不连通的分枝数目。输入参数E是图的边集,它使m行2列矩阵,每一行的两个数字代表一条边的两个顶点,共有m条边,n是图的顶点数,该参数不是必须的,可以省略,此时默认n=max(max(E),但是,假如最末尾的顶点是孤立的点,则该参数不能省略。%输出参数ncV是n行1列向量,每个数字代表相应顶点的互不连通的分枝数目,由ncV可以判断图的连通性,若max(ncV)1,则图有2个以上互不连通的分枝。,m,n1,E1=arValidation(E);%验证数据的有效性E2=E1(:,1:2);E1(:,21);%E2的行数是E1的两倍,新增加的行由原来各边的两个顶点交换次序得到Dec,Ord=arDecOrd(E2);%对有向图E2进行分解ncV=sum(Dec*diag(1:size(Dec,2),2);%互不相连的分枝数if(nargin1)endreturn,在程序arComp中,通过调用函数arValidation(E)来确任数组E的有效性。functionm,n,newE=arValidation(E);%输入参数E与前面相同,输出参数m是图的边数,n1是图的顶点数,数组newE的第一和第二列等同于输入数据E,第三列是各边的权重。se=size(E);%se是数组E的大小(行数和列数)m=se(1);,ifse(2)0);fork=1:n,Ak=(Ak*A0);As=As|Ak;end,A=As;T,ir,jc=unique(A.*A,rows);Dec=T;Ord=A(ir,ir);ns=size(Ord,1);forit=1:ns*(ns-1)/2Mlow=tril(Ord,-1);is,js,Mw=find(Mlow);ifisempty(is)break;end,num=1:ns;num(is(1)=js(1);num(js(1)=is(1);Ord=Ord(num,num);Dec=Dec(:,num);endreturn,例1求下图中的一条欧拉巡回。,解:该图有9个顶点、14条边,各顶点的度数均为偶数,是一个欧拉图。在Matlab中输入E=1,2;2,3;1,4;2,4;2,5;3,6;4,5;4,7;5,8;5,6;6,9;6,8;7,8;8,9;%E代表图的边集,它有14行2列,每一行是连接一条边的两个顶点,各边的编号从1到14依次排列。运行eu,cEu=arEuler(E);结果为eu=1(说明该图是欧拉图)。,cEu=1261054791211141383它代表一条欧拉巡回依次经过的边的序列,它所经过的顶点序列依次为123652458698741。
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 安全应急专家聘用合同和协议
- 物业管道井维修合同范本
- 自我安全告知协议书模板
- 法人公司股权转让协议书
- 舞台(搭建)租赁协议书
- 门诊包干协议书模板模板
- 油脂企业转让协议书范本
- 汽车保险维修合同协议书
- 门楼制作合同协议书范本
- 玉米保护性耕作合同范本
- 社会救助政策培训
- 云南七年级下学期期末考试英语试题含答案5篇
- 工艺管理培训课件
- 2025患者十大安全目标
- 2025房屋的室内装修合同模板
- Unit 1 Making friends PartB Let's learn(说课稿)-2024-2025学年人教PEP版(2024)英语三年级上册
- 2025年山西省太原市人大常委会招聘劳务派遣制人员15人历年管理单位笔试遴选500模拟题附带答案详解
- Gexcon 气体爆炸手册
- 卖挂靠公司货车的合同(2篇)
- 金融行业风险评估手册
- TCHSLA 50014-2022《风景园林师人才评价标准》
评论
0/150
提交评论