基于蚁群算法解决旅行商问题_第1页
基于蚁群算法解决旅行商问题_第2页
基于蚁群算法解决旅行商问题_第3页
基于蚁群算法解决旅行商问题_第4页
基于蚁群算法解决旅行商问题_第5页
已阅读5页,还剩24页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、学 号: 能力拓展训练题 目基于蚁群算法解决tsp问题学 院计算机科学与技术学院专 业班 级姓 名指导教师20112012学年 第2学期目录一.介绍- 2 -二 详细设计说明- 3 -2.1模块描述- 3 -2.2性能- 3 -2.3算法- 3 -2.4流程逻辑-7-2.5接口- 8 -三 程序- 9 -四.结果- 20 -五.程序设计心得与体会- 21 -六.参考文献- 22 -基于蚁群算法解决tsp问题摘 要:tsp问题是典型的np - hard组合优化问题,蚁群算法是一种求解此类问题的优化算法,通过模拟蚂蚁觅食行为来解决np问题。文章使用蚁群算法求解tsp问题,并结合tsp问题的特点选择

2、了一种合适的蚁群更新策略。关键词:tsp问题,蚁群算法,群集智能,信息素一、介绍 旅行商问题( traveling salesman problem, 简称tsp)是一个经典的np难题,也是组合优化中研究最多的问题之一,它解决如何找到一条从一个城市出发经过若干个城市后又返回原城市的最短路径。城市管道铺设优化、物流业的车辆调度、制造业中的切割路径优化等,现实生活中的优化问题都可以归结为tsp问题进行求解。寻找一种有效的解决该问题的算法,具有重要的现实意义。蚁群算法是dorigom等提出的,该算法采用了分布式并行计算机制,易于与其他方法结合,而且具有强的鲁棒性,是求解tsp问题的一种理想方法。算法

3、的主要思想为:模拟蚂蚁觅食行为。蚂蚁在运行过程中会释放一种特殊的分泌物- 信息素来寻找路径。信息素会随着时间消减,后面的蚂蚁选择信息素多的路径,这样便形成了一个正反馈机制。在整个寻径过程中,虽然单只蚂蚁的选择能力有限,但它们的行为具有非常高的自组织性,相互之间交换路径,最终寻找到最优路径。二、详细设计说明2.1模块描述本程序共有void addcity(); void clear(); void updateresult(); void move(); void move2last(); void shucout();void project:initmap();void project:ge

4、tant();void project:startsearch() ;void project:updatetrial() 。子程序模块和int main()一个主程序。void shucout()显示欢迎信息模块 void ant:move2last() 只剩下一个城市没走过时才调用,直接移动到最后一个城市void ant:clear() 清空数据,蚂蚁周游完各个城市后,要重新开始周游各个城市时调用 void ant:addcity(int city) 增加一个城市到走过的城市数组中,并改变没走过的城市数组中的标志 void ant:updateresult() 计算周游完城市后,走过的路径

5、长度 void ant:move() 移动到下一个城市 void project:initmap() 初始化 void project:getant() 初始化随机种子 void project:startsearch() 开始寻找最好的解决方法void project:updatetrial() 更新环境信息素 ,每只蚂蚁周游完城市后才更新 2.2性能本程序按原理来说迭代次数越大,程序得出的结果越精确,但当数值超过1000以后,结果基本不变。要求城市数量 / 蚂蚁数量 = 1.5左右 dbmin=100000000.0; 叠迭中的最小路径长度。2.3算法本程序是基于蚁群算法求解问题,设为城市

6、,之间的几何距离,。设 表示时刻位于城市的蚂蚁的个数,蚂蚁总数,表示时刻在 连线上残留的信息量,初始时刻各条路径上的信息量为(为常数)。用参数表示信息量的保留度,则经过个时刻后,路径 上的信息量根据下式作调整: 表示第只蚂蚁在本次循环中留在路径 上的信息量,表示本次循环所有经过的蚂蚁留在 上的信息量。 定义。蚂蚁(,)在运动过程中,表示在时刻蚂蚁由位置转移到位置的概率: 我们用tabun_city_count记录蚂蚁目前已经走过的城市集合,allowedcityn_city_count表示蚂蚁下一步允许选择的城市集合,它等于全部的城市集合除去第只蚂蚁已走过的集合tabun_city_count

7、。 定义为第只蚂蚁在本次循环中走过的路径和。 用蚁群算法解决问题是一个递推过程 ,当时,将蚂蚁放在各城市,设定每条路径上的信息量初值,每只蚂蚁根据公式决定的概率从城市到城市。表示曾经有多少蚂蚁经过路径;说明较近的城市有更大的可能性被选中。用来控制两者对蚂蚁选择的影响力程度。经过一个循环后,根据公式;计算更新每条路径的信息量。将所有的复原,最后求出本次循环的最短路径。这个过程不断重复,直到所有的蚂蚁都选择同样的路径,或者循环次数达到预先设定的最高次数。解决个城市的问题算法设计如下:初始化:设定,循环计数器,对每条路径设定初始信息量,将只蚂蚁放在个城市上(为了使问题简化,设定。设定集合的索引,对从

8、到,把第只蚂蚁放在起始位置,对应的设定集合重复下面的步骤,直到集合满为止(这一步将重复次):设定;对从到,根据公式确定的概率,选择下一步移动的目标城市在时间时,第只蚂蚁所在的城市是;将第只蚂蚁移到城市;把加入到集合中。对从到:将第只蚂蚁从移动到;计算第只蚂蚁所走过的路程和,并更新最小路径;对每条路径:; 对每条路径根据计算;设定;设定;对每条路径,设定。如果,则清空所有的集合转到第二步;否则,得出最短的路径。在这儿我们用的是算法,这种算法,每当结束一个循环后,根据公式 计算。2.4流程逻辑开始初始化设定集合,对每只蚂蚁=计算蚂蚁所走过的路程和更新最小路径对每条路径计算设定acbacbny清空所

9、有的集合得出最短路径n集合满y结束图12.5接口程序中的子函数:void addcity(int city); void clear(); void updateresult(); void move(); void move2last(); void shucout();void updatetrial(); void initmap(); void getant(); void startsearch(); 三程序#include <iostream>#include <math.h> #include <time.h> using namespace

10、std; const int n_ant_count = 34; /蚂蚁数量,一般取值原则为:城市数量 / 蚂蚁数量 = 1.5左右 const int n_city_count = 51; /城市数量 int n_it_count; /= 5000; /迭代次数,就是搜索次数 const double db_q=100; /总的信息素 const double db_alpha=1; /信息素重要程度 const double db_beta=3; /这个数越大,则蚂蚁往信息素大的地方走的概率就越大 const double db_rou=0.5; /环境信息素挥发速度 int bestto

11、urn_city_count;/最佳路径列表 /获得指定范围内的一个随机数 double rnd(int low,double uper) double p=(rand()/(double)rand_max)*(uper)-(low)+(low); return (p); ; /获得指定上限范围内的一个随机数 int rnd(int uper) return (rand()%uper); ; /tsp地图信息,包含了信息素,城市距离,和信息素变化矩阵 class ginfo public: double m_ddelttrialn_city_countn_city_count; /临时保存信息

12、素,更新环境信息素的时候使用,每只蚂蚁周游完各个城市后开始计算 double m_dtrialn_city_countn_city_count; /城市间的信息素,就是环境信息素 double distancen_city_countn_city_count; /城市间距离 ; ginfo map; /定义蚂蚁类 class ant private: int choosenextcity(); /选择下一个城市 double probn_city_count; /临时变量数组,选择下一个城市的时候,保存各个城市被选中的概率值 int m_ncitycount; /记录蚂蚁已经走过的城市数目 i

13、nt allowedcityn_city_count;/没有走过的城市,数组索引对应城市编号 public: double m_dlength; double m_dshortest; int tabun_city_count; /记录走过的城市,里面存的是城市的编号,数组索引表示走的顺序。 public: ant(); void addcity(int city); void clear(); void updateresult(); void move(); void move2last(); void shucout(); /只剩下一个城市没走过时才调用,直接移动到最后一个城市 void

14、 ant:move2last() for(int i=0;i<n_city_count;i+) if (allowedcityi=1) addcity(i); break; /清空数据,蚂蚁周游完各个城市后,要重新开始周游各个城市时调用 void ant:clear() m_dlength=0; for(int i=0; i<n_city_count;i+) probi=0; allowedcityi=1; i=tabun_city_count-1; /用最后一个城市作为出发城市 m_ncitycount=0; addcity(i); /初始化 ant:ant() m_dlengt

15、h=m_dshortest=0; m_ncitycount=0; for(int i=0;i<n_city_count;i+) allowedcityi=1; probi=0; /增加一个城市到走过的城市数组中,并改变没走过的城市数组中的标志 void ant:addcity(int city) /add city to tabu; tabum_ncitycount=city; m_ncitycount+; allowedcitycity=0; int ant:choosenextcity() /更新概率的路径选择 /选择一条路径,从 tabum_ncitycount-1到下一个 int

16、 j=10000; double temp=0.0; int curcity=tabum_ncitycount-1; /当前走到那个城市了 /先计算当前城市和没有走过的城市,两两之间的信息素的总和 for (int i=0;i<n_city_count;i+) if (allowedcityi = 1) temp=temp+pow(1.0/map.distancecurcityi),db_beta)*pow(map.m_dtrialcurcityi),db_alpha); /计算没有走过的城市被选中的概率 double sel=0; for (i=0;i<n_city_count;

17、i+) if (allowedcityi = 1) probi=pow(1.0/map.distancecurcityi),db_beta)*pow(map.m_dtrialcurcityi),db_alpha)/temp; sel+=probi; else probi=0; /下面的操作实际上就是遗传算法中的轮盘选择 double mrate=rnd(0,sel); double mselect=0; for ( i=0;i<n_city_count;i+) if (allowedcityi = 1) mselect+=probi ; if (mselect>=mrate) j=

18、i; break; /这种情况只有在temp=0.0的时候才会出现 if (j = 10000) for (i=0;i<n_city_count;i+) if (allowedcityi = 1) j=i; break; return j; /计算周游完城市后,走过的路径长度 void ant:updateresult() / 修正旅行距离for(int i=0;i<n_city_count-1;i+) m_dlength+=map.distancetabuitabui+1; m_dlength+=map.distancetabun_city_count-1tabu0; /最后城市

19、和开始城市间的距离 /移动到下一个城市 void ant:move() /the ant move to next town and add town id to tabu. int n=choosenextcity(); addcity(n); class project public: double m_dlength; ant antsn_ant_count; public: project(); void updatetrial(); void initmap(); void getant(); void startsearch(); ;/更新环境信息素 /这里采用的是 ant-cyc

20、le 模式,即每只蚂蚁周游完城市后才更新 void project:updatetrial() /calculate the changes of trial information int m=0; int n=0; for(int i=0;i<n_ant_count;i+) /计算每只蚂蚁在两两城市间留下的信息素,蚂蚁走过的路径越短,留下的信息素数值越大 for (int j=0;j<n_city_count-1;j+) /计算两两城市间的信息素 m=antsi.tabuj; n =antsi.tabuj+1; map.m_ddelttrialmn+=db_q/antsi.m_

21、dlength; map.m_ddelttrialnm+=db_q/antsi.m_dlength; /最后城市到开始城市间的信息素 m=antsi.tabun_city_count-1; n =antsi.tabu0; map.m_ddelttrialmn+=db_q/antsi.m_dlength; map.m_ddelttrialnm+=db_q/antsi.m_dlength; /最新的环境信息素 = 消失掉的信息素 + 新留下的信息素 for (int a=0;a<n_city_count;a+) for (int j=0;j<n_city_count;j+) map.m

22、_dtrialaj=(db_rou*map.m_dtrialaj+map.m_ddelttrialaj ); map.m_ddelttrialaj=0; /初始化 void project:initmap() for(int i=0;i<n_city_count;i+) for (int j=0;j<n_city_count;j+) map.m_dtrialij=1; map.m_ddelttrialij=0; project:project() /initial map initmap(); m_dlength=10e9; struct city int num; int x;

23、int y; ccn_city_count; /城市坐标数据来自国际通用的数据 eil51.tsp int x_ary51= 37,49,52,20,40,21,17,31,52,51, 42,31,5,12,36,52,27,17,13,57, 62,42,16,8,7,27,30,43,58,58, 37,38,46,61,62,63,32,45,59,5, 10,21,5,30,39,32,25,25,48,56, 30 ; int y_ary51= 52,49,64,26,30,47,63,62,33,21, 41,32,25,42,16,41,23,33,13,58, 42,57,5

24、7,52,38,68,48,67,48,27, 69,46,10,33,63,69,22,35,15,6, 17,10,64,15,10,39,32,55,28,37, 40 ; for (int i=0;i<n_city_count;i+) cci.x=x_aryi; cci.y=y_aryi; cci.num=i; /计算两两城市间距离,需要进行四舍五入取整 /eil51.tsp的最短路径426,是按四舍五入取整后的距离算出来的。 for(int b=0;b<n_city_count;b+) for (int j=0;j<n_city_count;j+) map.dist

25、ancebj=(int)(sqrt(pow(ccb.x-ccj.x),2)+pow(ccb.y-ccj.y),2)+0.5); void project:getant() /初始化随机种子 srand(unsigned)time(null); /为每只蚂蚁随机分配一个出发城市 int city=0; for (int i=0;i<n_ant_count;i+) city=rnd(n_city_count); antsi.addcity(city); void project:startsearch() /begin to find best solution int max=0;/eve

26、ry ant tours times double temp; int temptourn_city_count; double dbmin=0.0; while (max < n_it_count) dbmin=100000000.0; /本次叠迭中的最小路径长度 for(int j=0;j<n_ant_count;j+) for (int i=0;i<n_city_count-1;i+) antsj.move(); for(int c=0;c<n_ant_count;c+) antsc.move2last(); antsc.updateresult(); /计算路径

27、总长度 /find out the best solution of the step and put it into temp temp=ants0.m_dlength; for (int t=0;t<n_city_count;t+) temptourt=ants0.tabut; for(int d=0;d<n_ant_count;d+) if (temp>antsd.m_dlength) temp=antsd.m_dlength; for (int t=0;t<n_city_count;t+) temptourt=antsd.tabut; if (dbmin>

28、antsj.m_dlength) dbmin=antsj.m_dlength; if (temp<m_dlength) m_dlength=temp; for (int t=0;t<n_city_count;t+) besttourt=temptourt; printf("%d : %.0fn",max,m_dlength); updatetrial(); /全部蚂蚁遍历各个城市后,更新环境信息素 for(int e=0;e<n_ant_count;e+) /再搜索一次 antse.clear(); max+; printf("the short

29、est toure is : %fn",m_dlength); for (int t=0;t<n_city_count;t+) printf(" %d ",besttourt); void shucout()cout<<"*本程序是利用蚁群算法求解tsp问题,即最旅游城市中的最段距离和行走路线*"<<endl<<endl<<endl<<endl<<endl<<endl<<endl;cout<<"51个城市x轴坐标为:&qu

30、ot;<<endl;cout<<"37,49,52,20,40,21,17,31,52,51, "<<endl;cout<<"42,31,5,12,36,52,27,17,13,57, "<<endl;cout<<"62,42,16,8,7,27,30,43,58,58, "<<endl;cout<<"37,38,46,61,62,63,32,45,59,5,"<<endl;cout<<"10,21,5,30,39,32,25,25,48,56, "<<endl;cout<<"30 "<<endl;cout<<"城市y轴坐标为:"<<endl;cout<<"52,49,64,26,30,47,63,62,33,21"<<endl;cout<<"41,32,

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论