您好,欢迎访问三七文档
当前位置:首页 > 商业/管理/HR > 市场营销 > 最短路径问题实验报告
徐州工程学院管理学院实验报告实验课程名称:最短路径问题实验地点:南主楼七楼机房经济管理实验中心2015年5月至2015年6月1实验报告实验项目:B15201302实验学时:8学时实验日期:2015/5---2015/6实验要求:通过对求最短路径方法的梳理,运用其中一种方法解决一个实际问题实验内容:案例分析最短路径几种算法的比较蚁群算法蚁群算法的基本原理可大致描述如下。蚂蚁属于群居昆虫,个体行为极其简单,而群体行为却相当复杂。相互协作的一群蚂蚁很容易找到从蚁穴到食物源的最短路径,而单个蚂蚁则不能。人们通过大量的研究发现,蚂蚁之所以可以做到这一点,是因为蚂蚁个体之间是通过在其所经过的路径上留下一种可称之为信息素的物质来进行信息传递。蚂蚁可以嗅到这种信息素,而且可以根据信息素的浓度来指导自己对前进方向的选择。同时,该信息素会随着时间的推移逐渐挥发掉,于是路径的长短及该路径上通过的蚂蚁的多少就对残余信息素的强度产生影响。反过来信息素的强弱又指导着其它蚂蚁的行动方向。因此,某一路径上走过的蚂蚁越多,则后来者选择该路径的概率就越大。这就构成了蚂蚁群体行为表现出的一种信息正反馈现象。蚂蚁个体之间就是通过这种信息交流达到快速找到食物源或蚁穴的。蚁群算法就是受这种行为启发,以人工蚂蚁模拟真实蚂蚁行为来求解组合优化问题,到目前为止,人们已经用它成功地解决了TSP、JSP等许多组合优化问题。用基本蚁群算法(基于Antquantity模型)求解最短路径问题的过程就是:将m只蚂蚁放到起点s处,每只蚂蚁将根据一定的概率选择下一个与此交叉点直接相邻的交叉点。蚂蚁k从s点出发,按照选择策略,从与s相关联的边的集合中,选择一条边。然后,按照一定的方式更新这条边上的信息素浓度。接着再从这条边的另一节点T开始,从与T相关联的边的集合中,选择另一条边。以此类推,直到搜索到终点D。于是,蚂蚁k得到一个从s到D的解。直到所有的m只蚂蚁都搜索完毕后,得到m个解(包括重复的)。继续迭代直到满足停止条件,停止条件为最大迭代次数。在所求得的所有解中,值最小的解为所求的全局最优解,即最短路径的长度。遗传算法遗传算法抽象于生物体的进化过程,是一种通过全面模拟自然选择和遗传机制,形成具有“生成+检验”特征的搜索算法.遗传算法以编码空间代替问题的参数空间,以适应度函数为评价依据,以编码群体为进化基础,以对群体中个体位串的遗传操作实现选择和遗传机制,建立起一个迭代过程。在这一过程中,通过随机重组编码位串中重要的基因,使新一代的位串集合优于老一代的位串集合,群体的个体不断进化,逐渐接近最优解,最终达到求解问题的目的。遗传算法的运行过程为一个典型的迭代过程,其必须完成的工作内容和基本步骤如下:(1)选择编码策略,把参数集合x和域转换为位串结构空间S;(2)定义适应值函数()fx;2(3)确定遗传策略,包括选择群体大小n,选择、交叉、变异方法,以及确定交叉概率cP、变异概率mP等遗传参数;(4)随机初始化生成群体P;(5)计算群体中个体位串解码后的适应值()fx;(6)按照遗传策略,运用选择、交叉和变异算子作用于群体,形成下一代群体;(7)判断群体性能是否满足某一指标,或者已完成预定迭代次数,不满足则返回步骤6,或者修改遗传策略再返回步骤6。通过比较遗传算法属于智能算法能切合实际的解决选址问题。因此下面对遗传算法进行详细说明、应用。Floyd算法Floyd算法主要用于计算所有节点对之间的最短路Floyd算法是通过权矩阵计算来实现的一种方法,其主要思想是从代表任意两个节点iV到jV距离的带权邻接矩阵(0)D开始,首先计算(1)D,即计算iV到jV经过一次经转的所有可能路径,经过比较后选出最短路,代替(0)D中对应的路径,迭代列出距离矩阵(1)D,(1)D中各元素表示通过一次迭代后网络中任意两点间最短路,也即网络中任意两点之间直接到达或只经过一个中间点时的最短路.在此基础上依次计算(2)(3)()(),,,kkDDDD中对应的元素表示任意两点间不经过中间点或最多允许经过21k个中间点时的最短路。当(1)()kkDD时,表明得到的带权邻接矩阵()kD就反映了所有顶点对之间的最短距离信息,成为最短距离矩阵.其算法(记为算法1)如下:第一步,作初始距离矩阵(0)(0)()ijDd,其中:(0),,(,1,2,3,),ijijWijdijnij相邻对,,不相邻或无路时;第二步,构造迭代矩阵()(0)()kijDd,其中:()(1)(1)min|kkkijirridddr=1,2,,n;第三步,若(1)()kkDD,迭代终止.否则,返回第二步。对Floyd算法进行分析,不难发现在不含负回路的网络中存在以下问题:(1)在计算两点iV和jV之间最短路时,每次都要计算n次加法,且插入的中间节点rV很明显不能使路长变短,降低了计算效[1]率;(2)若要找出点iV、jV间的最短路,则要回头去查是如何计算出()kijV的,不妨设()(1)(1)kkkijilljddd,同样再去查(1)kild、(1)kljd是如何算出的,…,一直查到(0)D中的元素为止,才能找出所求最短路.显然上述寻找最短路径的方法不直观、比较繁琐.基于这两点不足,本文在不含负回路的网络中对Floyd算法进行了优化,不仅简化了计算量,而且使得在寻找最短路径时更简洁方便。既然原始的Floyd算法存在一些问题,则本文对Floyd算法进行优化具体思路如下:对于问题(1),构造迭代矩阵()()()kkijDd,计算两点iV和jV之间最短路时,对待插入的节点rV先进行路长比较,如果(1)(1)kkirijdd或(1)(1)kkriijdd,则说明插入节点rV后,点3iV经过节点rV到达点jV的路长不会比原来的短,于是不用再计(1)1kkirrjdd,进入下一个节点的搜索。对于问题(2),构造一个序号矩阵()()kkijAa,(0,1,)k,记录算法第二步中第k次迭代插入节点的情况.优化后的Floyd算法(记为算法2)如下:第一步,作初始距离矩阵(0)(0)()ijDd和序号矩阵(0)0)()ijAa(,其中:(0),,(,1,2,3,),ijijWijdijnij相邻对,,不相邻或无路时,(0)0,,,1,2,,,ijijaijnij相邻时,(),不相邻或无路,此时距离矩阵(0)D中的元素(0)ijd表示任意两点iV、jV不经过其它节点的路长。第二步,构造迭代矩阵()()()kkijDd和序号矩阵(0))()kijAa(。①对于迭代矩阵()kD的元素()kijd:r从1到n,且,rij时,如果(1)(1)kkirijdd或(1)(1)kkriijdd,说明插入点rV后路长(1)kijd不会变短,此时无须计算(1)1kkirrjdd。否则()(1)(1)(1)min,kkkkijijirrjdddd。②相应地,序号矩阵()kA的各元素变化为:若()(1)(1)kkkijilljddd,且(1)(1)kkirrjdd,则记下点lV,并在序号矩阵中()kA对应的元素)kija(变为:()(1)(1),,kkkijillljaaVa。表明经过该次迭代后从节点iV出发到节点jV的最短路长经过节点lV路长变短.否则,()(1)kkijijaa。第三步,若(1)()kKDD,迭代终止.否则,返回第二步。针对以上算法本文用改进后的Floyd算法利用Matlab编程对实例进行试验。实例已知网络如图1所示,计算所有节点之间的最短路。图14由图可以得到个点间的距离矩阵:5123412345013012520410230vvvvvvvvvv列如求节点1v到节点5v之间的最短路径和最短距离可用Matlab编程Floyd算法代码如下:function[D,R]=floyd(a)n=size(a,1);D=afori=1:nforj=1:nR(i,j)=j;endendRfork=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);endendendkDREnd可求得节点1v到节点5v之间的最短路径为1245vvvv最短距离为5。5参考文献[1]林华珍,周根贵.求解最短路问题的一种优化矩阵算法[J].长江大学学报:自然科学版(理工卷),20074(4):14-166实验总结采用优化的Floyd算法,由于在计算路长之前先进行了比较,那些不和节点对直接相连的插入点、不能使路长变短以及和节点对直接相连的插入点的路长比节点对路长还要长的节点,在计算的过程中没有参与计算,因此,大大减少了计算量,且在最短路计算的同时使用序号矩阵记下使路径变短的节点,这样使得在寻找最短路径时更简单、方便、直接.因此,优化的Floyd算法计算量小,寻找最短路径时直观并切实有效。
本文标题:最短路径问题实验报告
链接地址:https://www.777doc.com/doc-2319027 .html