




已阅读5页,还剩3页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
蚁群算法解决TSP问题一、论述1、算法来源蚁群算法的基本原理来源于自然界蚂蚁觅食的最短路径原理,根据昆虫学家的观察,发现自然界的蚂蚁虽然视觉不发达,但它可以在没有任何提示的情况下找到从食物源到巢穴的最短路径,并且能在环境发生变化(如原有路径上有了障碍物)后,自适应地搜索新的最佳路径。2、单个蚂蚁寻找路径正反馈:单个的蚂蚁为了避免自己迷路,它在爬行时,同时也会释放一种特殊的分泌物信息素(Pheromone),而且它也能觉察到一定范围内的其它蚂蚁所分泌的信息素,并由此影响它自己的行为。当一条路上的信息素越来越多(当然,随着时间的推移会逐渐减弱),后来的蚂蚁选择这条路径的概率也就越来越大,从而进一步增加了该路径的信息素浓度,这种选择过程称为蚂蚁的自催化过程。多样性:同时为了保证蚂蚁在觅食的时候不至走进死胡同而无限循环,蚂蚁在寻找路径的过程中,需要有一定的随机性,虽然在觅食的过程中会根据信息素的浓度去觅食,但是有时候也有判断不准,环境影响等其他很多种情况,还有最终要的一点就是当前信息素浓度大的路径并不一定是最短的路径,需要不断的去修正,多样性保证了系统的创新能力。正是这两点小心翼翼的巧妙结合才使得蚁群的智能行为涌现出来。3、具体实现需要解决的两个首要问题(1)如何实现单个蚂蚁寻路的过程(2)如何实现信息素浓度的更新二、具体实现代码如下所示:cpp view plain copy 在CODE上查看代码片派生到我的代码片#include #include #include #include #include #include #include #include using namespace std; /* int CityPos102= 87,7,91,38,83,46,71,44,64,60,68,58,83,69, 87,76,74,78,71,71 ; /10个城市的坐标*/ unsigned seed=(unsigned)time(0);/原型:void srand(unsigned seed); /30个城市的坐标 int CityPos302=87,7,91,38,83,46,71,44,64,60,68,58,83,69,87,76,74,78,71,71,58,69,54,62,51,67,37,84,41,94,2,99,7,64,22,60,25,62,18,54,4,50,13,40,18,40,24,42,25,38,41,26,45,21,44,35,58,35,62,32; #define CITY_NUM 30 /城市数量 #define ANT_NUM 30 /蚁群数量 #define TMAC 1000 /迭代最大次数 #define ROU 0.5 /误差大小 #define ALPHA 1 / 信息素重要程度的参数 #define BETA 4 / 启发式因子重要程度的参数 #define Q 100 /信息素残留参数 const int maxn = 100; double dismaxnmaxn; /距离 double infomaxnmaxn; /信息素矩阵 double ECITY_NUMCITY_NUM; /启发因子矩阵 int visCITY_NUMCITY_NUM; double Bestlength; double ansCITY_NUM; const double mmax = 10e9; /返回指定范围内的随机整数 int rnd(int nLow,int nUpper) return nLow+(nUpper-nLow)*rand()/(RAND_MAX+1); /返回指定范围内的随机浮点数 double rnd(double dbLow,double dbUpper) double dbTemp=rand()/(double)RAND_MAX+1.0); return dbLow+dbTemp*(dbUpper-dbLow); /返回浮点数四舍五入取整后的浮点数 double ROUND(double dbA) return (double)(int)(dbA+0.5); struct Ant int PathCITY_NUM; /蚂蚁走的路径 double length; /路径总长度 int visCITY_NUM; /走过城市标记 int cur_cityno; /当前城市 int moved_cnt; /已走的数量 /初始化 void Init() memset(vis, 0, sizeof(vis); length = 0; cur_cityno = rnd(0, CITY_NUM);/随机选择一个出发城市 Path0 = cur_cityno; viscur_cityno = 1; moved_cnt = 1; /printf(Init %d n, cur_cityno); /选择下一个城市 /返回值 为城市编号 int chooseNextCity() int nSelectedCity=-1; /返回结果,先暂时把其设置为-1 /计算当前城市和没去过的城市之间的信息素总和 double dbTotal=0.0; double probCITY_NUM; /保存各个城市被选中的概率 for(int i = 0; i 0.0) /总的信息素值大于0 dbTemp = rnd(0.0, dbTotal); for (int i = 0; i CITY_NUM; i+) if (!visi) dbTemp -= probi; if (dbTemp 0.0) nSelectedCity = i; break; /如果城市间的信息素非常小 ( 小到比double能够表示的最小的数字还要小 ) /出现这种情况,就把第一个没去过的城市作为返回结果 if (nSelectedCity = -1) for (int i=0; iCITY_NUM; i+) if (!visi) /城市没去过 nSelectedCity=i; break; return nSelectedCity; /蚂蚁在城市间移动 void Move() int nCityno = chooseNextCity();/选择下一个城市 Pathmoved_cnt = nCityno;/保存蚂蚁走的路径 visnCityno = 1;/把这个城市设置成已经去过 cur_cityno = nCityno; /更新已走路径长度 length += disPathmoved_cnt-1Pathmoved_cnt; moved_cnt+; /蚂蚁进行搜索一次 void Search() Init(); /如果蚂蚁去过的城市数量小于城市数量,就继续移动 while(moved_cnt CITY_NUM) Move(); length += disPathCITY_NUM-1Path0; ; struct TSP Ant antsANT_NUM; /定义一群蚂蚁 Ant ant_best; /保存最好结果的蚂蚁 void Init() /初始化为最大值 ant_best.length = mmax; puts(al dis); /计算两两城市间距离 for (int i = 0; i CITY_NUM; i+) for (int j = 0; j CITY_NUM; j+) double temp1=CityPosj0-CityPosi0; double temp2=CityPosj1-CityPosi1; disij = sqrt(temp1*temp1+temp2*temp2); /初始化环境信息素 puts(init info); for (int i=0; iCITY_NUM; i+) for (int j=0; jCITY_NUM; j+) infoij=1.0; /更新信息素,当前每条路上的信息素等于过去保留的信息素 /加上每个蚂蚁这次走过去剩下的信息素 void Updateinfo() /puts(update info); double tmpinfoCITY_NUMCITY_NUM; memset(tmpinfo, 0, sizeof(tmpinfo); int m = 0; int n = 0; /遍历每只蚂蚁 for (int i = 0; i ANT_NUM; i+) /puts(*); / for (int j = 0; j CITY_NUM; j+) / printf(%d , antsi.Pathj); / /puts(); for (int j = 1; j CITY_NUM; j+) m = antsi.Pathj; n = antsi.Pathj-1; /printf(%d %dn, m, n); tmpinfonm = tmpinfonm+Q/antsi.length; tmpinfomn = tmpinfonm; /最后城市和开始城市之间的信息素 n = antsi.Path0; tmpinfonm = tmpinfonm+Q/antsi.length; tmpinfomn = tmpinfonm; /更新环境信息素 for (int i = 0; i CITY_NUM; i+) for (int j = 0; j CITY_NUM; j+) /最新的环境信息素 = 留存的信息素 + 新留下的信息素 infoij = infoij*ROU + tmpinfoij; /寻找路径,迭代TMAC次 void Search() for (int i = 0; i TMAC; i+) printf(current iteration times %dn, i); for (int j = 0; j ANT_NUM; j+) antsj.Search(); /保存最佳结果 for (int j = 0; j antsj.length) ant_best = /ntsj; /更新环境信息素 Updateinfo(); printf(current minimum length %lfn, ant_best.length); ; int main() /freopen(output.txt, w, stdout); srand(seed); TSP tsp; /初始化蚁群 tsp.Init(); /开始查找 tsp.Search(); puts(The Minimum length route is :n); for (int i = 0; i CITY_NUM; i+) if (i != 0 & i % 20 = 0) puts(); printf(%d , tsp.ant_best.Pathi); return 0; 运算结果(1)选择老师所给10个城市的数据,结果如下所示,经过50次迭代就能得到最优解,而且算法相当稳定,多次尝试都是50次就能得到最优解,相比于遗传算法的500次迭代在时间上有了很大的改进。(2)选择老师所给的30个城市的数据,经过1000次迭代过程能得到一个非常较优的解,结果稳定在425左右,与最优解424.非常接近,并且偶
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2025年咸阳亨通电力(集团)有限公司招聘(4人)模拟试卷及完整答案详解一套
- 2025年电阻传感器项目申请报告
- 2025甘肃张掖市幼儿园选调卫生保健人员1人模拟试卷及答案详解(夺冠系列)
- 项目款项结算责任声明书3篇范文
- 2025年特殊教育服务项目申请报告
- 产品质量问题原因分析与解决方案工具
- 2025年甘肃省民航航空发展有限公司职业经理人选聘模拟试卷及答案详解(易错题)
- 2025年上半年龙泉市公开选调公务员及选聘事业单位工作人员14模拟试卷及答案详解一套
- 信任守护服务品质承诺书6篇
- 2025蓝海新材料(通州湾)有限责任公司春季高校毕业生招聘45人模拟试卷附答案详解(黄金题型)
- 《公路技术状况评定》课件-任务六:公路技术状况指数MQI
- Unit 3 Amazing animals Section A What pets do you know 说课(教学设计)-2024-2025学年人教PEP版(2024)英语三年级上册
- 中级财务会计知到课后答案智慧树章节测试答案2025年春云南财经大学
- 2025青海省建筑安全员B证考试题库及答案
- 现代纺织物清洁技术培训汇报教程
- 《铁路技术管理规程》(普速铁路部分)
- 临床检验基础知到智慧树章节测试课后答案2024年秋上海健康医学院
- 铸牢中华民族共同体意识心得感悟7篇
- 《中国海洋大学》课件
- 神话故事民间故事《后羿射日》绘本课件
- “雄鹰杯”全国小动物医师技能大赛考试题库(660题)
评论
0/150
提交评论