1、武汉理工大学计算机科学与技术学院能力拓展训练课程设计1学 号: 能力拓展训练题 目 基于蚁群算法解决 tsp 问题学 院 计算机科学与技术学院专 业班 级姓 名指导教师武汉理工大学计算机科学与技术学院能力拓展训练课程设计220112012 学年 第 2 学期目录一.介绍 .- 2 -二 详细设计说明 .- 3 -2.1 模块描述 .- 3 -2.2 性能 .- 3 -2.3 算法 .- 3 -2.4 流程逻辑 .-7-2.5 接口 .- 8 -三 程序 .- 9 -四.结果 - 20 -五.程序设计心得与体会 - 21 -六.参考文献 - 22 -武汉理工大学计算机科学与技术学院能力拓展训练课
2、程设计3基于蚁群算法解决 tsp 问题摘 要:TSP 问题是典型的 NP - hard 组合优化问题 ,蚁群算法是一种求解此类问题的优化算法,通过模拟蚂蚁觅食行为来解决 NP 问题。文章使用蚁群算法求解 TSP 问题,并结合 TSP 问题的特点选择了一种合适的蚁群更新策略。关键词:TSP 问题,蚁群算法,群集智能,信息素一、介绍旅行商问题( Traveling Salesman Problem, 简称 TSP)是一个经典的 NP 难题 ,也是组合优化中研究最多的问题之一,它解决如何找到一条从一个城市出发经过若干个城市后又返回原城市的最短路径。城市管道铺设优化、物流业的车辆调度、制造业中的切割路
3、径优化等,现实生活中的优化问题都可以归结为 TSP 问题进行求解。寻找一种有效的解决该问题的算法,具有重要的现实意义。蚁群算法是DorigoM 等提出的,该算法采用了分布式并行计算机制,易于与其他方法结合,而且具有强的鲁棒性,是求解 TSP 问题的一种理想方法。算武汉理工大学计算机科学与技术学院能力拓展训练课程设计4法的主要思想为:模拟蚂蚁觅食行为。蚂蚁在运行过程中会释放一种特殊的分泌物- 信息素来寻找路径。信息素会随着时间消减,后面的蚂蚁选择信息素多的路径,这样便形成了一个正反馈机制。在整个寻径过程中,虽然单只蚂蚁的选择能力有限,但它们的行为具有非常高的自组织性,相互之间交换路径,最终寻找到
4、最优路径。二、详细设计说明2.1 模块描述本程序共有 void addcity(); void Clear(); void UpdateResult(); void move(); void move2last(); void shucout();void project:initmap();void project:GetAnt();void project:StartSearch() ;void project:UpdateTrial() 。子程序模块和 int main()一个主程序。void shucout() 显示欢迎信息模块 void ant:move2last() 只剩下一个城市
5、没走过时 才调用,直接移 动到最后一个城市void ant:Clear() 清空数据,蚂蚁周游完各个城市后,要重新开始周游各个城市时调用 void ant:addcity(int city) 增加一个城市到走过的城市数组中,并改变没走过的城市数组中的标志 void ant:UpdateResult() 计算周游完城市后,走过的路径长度 void ant:move() 移动到下一个城市 void project:initmap() 初始化 武汉理工大学计算机科学与技术学院能力拓展训练课程设计5void project:GetAnt() 初始化随机种子 void project:StartSear
6、ch() 开始寻找最好的解决方法void project:UpdateTrial() 更新环境信息素 ,每只蚂蚁周游完城市后才更新 2.2性能本程序按原理来说迭代次数越大,程序得出的结果越精确,但当数值超过1000 以后,结果基本不变 。要求城市数量 / 蚂蚁数量 = 1.5 左右 dbMin=100000000.0; 叠迭中的最小路径 长度。2.3 算法本程序是基于蚁群算法求解问题, 设 为城市 , 之间的几何距离,ijdij。设 表示 时刻位于城市 的蚂蚁的个数,蚂蚁2/12)()(jijiij yxd)(tbit总数 , 表示 时刻在 连线上残留的信息量,初始时刻各条路1tbmniijt
7、ij径上的信息量为 ( 为常数)。用参数 表示信息量的保留度,则经过cij)0( 个时 刻后,路径 上的信息量根据下式作调整:nijijij tt)()(mkijij1表示第 只蚂蚁在本次循环中留在路径 上的信息量, 表示本次ij ijij循环所有经过的蚂蚁留在 上的信息量。ij kij当 不 经 过 时 时当 第 只 蚂 蚁 经 过 LkQ定义 。蚂蚁 ( , )在运动过程中, 表示在 时刻蚂ijijd/1kmkijpt蚁 由位置 转移到位置 的概率:kj武汉理工大学计算机科学与技术学院能力拓展训练课程设计6 kijp其 他0kalowdsisji alowedjtk我们用 tabuN_CI
8、TY_COUNT记录蚂蚁 目前已经走过的城市集合,kAllowedCityN_CITY_COUNT表示蚂蚁 下一步允许选择的城市集合,它等于全部的城市集合除去第 只蚂蚁已走过的集合 tabuN_CITY_COUNT。 定义 为第k kL只 蚂蚁在本次循环中走过的路径和。k用蚁群算法解决问题是一个递推过程 ,当 时,将蚂蚁放在各城0t市,设定每条路径上的信息量初值 ,每只蚂蚁根据公式 决定的概率从Cij)0(城市 到城市 。 表示曾经有多少蚂蚁经过路径 ; 说明较近的城市有ij)(tij ),(jiij更大的可能性被选中。 用来控制两者对蚂蚁选择的影响力程度。经过一个循,环后,根据公式; ;计算
9、更新每条路径的信息量 。将所有的)(tij复原,最后求出本次循环的最短路径 。这个过程不断重),21(mktabu kLmn复,直到所有的蚂蚁都选择 同样的路径,或者循 环次数达到预先设定的最高次数。maxNC解决 个城市的 问题 算法设计如下:n初始化:设定 ,循环计数器 ,对每条路径设定初始信息量0t 0NC, 将 只蚂蚁放在 个城市上(为了使问题简化,设定 。Cij)0(ijn nm设定 集合的索引 ,对 从到 ,把第 只蚂蚁放在起始位置, 对tabu1skmk应的设定集合 k重复下面的步骤,直到集合 满为止(这一步将重复 次):tabu1n设定 ;1s武汉理工大学计算机科学与技术学院能
10、力拓展训练课程设计7对 从到 ,根据公式 确定的概率, 选择下一步移 动的目标城市 在时km j间 时,第 只 蚂蚁所在的城市是 ;t )1(stabuik将第 只蚂蚁移到城市 ;kj把 加入到集合 中。j)(stabuk对 从到 :km将第 只蚂蚁从 移动到 ;)(ntk)1(ktabu计算第只蚂蚁所走过的路程和 ,并更新最小路径 ;LkLmin对每条路径 : ),(jikij当 不 经 过 时 时当 第 只 蚂 蚁 经 过 kQ; kijijij对每条路径 根据 计算 ;),( ijijij tnt)()( ntij设定 ;nt设定 ;1NC对每条路径 ,设定 。),(ji0ij如果 ,m
11、ax则清空所有的集合 tbu转到第二步;否则,得出最短的路径。在这儿我们用的是 算法, 这种算法,每当 结束一个循环后,根据公cyleant式 计算。kij武汉理工大学计算机科学与技术学院能力拓展训练课程设计82.4 流程逻辑开始初始化设定 集合,tabu1ss对每只蚂蚁 =kijp其 他0kalowdsisji alowedjtk武汉理工大学计算机科学与技术学院能力拓展训练课程设计9NCmax计算蚂蚁所走过的路程和 kL更新最小路径 k对每条路径计算 ntij设定得出最短路径清空所有的集合 tabu集合 满tabuNYNabca b c武汉理工大学计算机科学与技术学院能力拓展训练课程设计10
12、图 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 #include #include using namespace std; const int N_ANT_COUNT = 34; /蚂蚁数量,一般取值原则为:城市数量 / 蚂蚁数量 =
13、1.5 左右 const int N_CITY_COUNT = 51; /城市数量 int N_IT_COUNT; /= 5000; /迭代次数,就是搜索次数 结束Y武汉理工大学计算机科学与技术学院能力拓展训练课程设计11const double DB_Q=100; /总的信息素 const double DB_ALPHA=1; /信息素重要程度 const double DB_BETA=3; /这个数越大,则蚂蚁往信息素大的地方走的概率就越大 const double DB_ROU=0.5; /环境信息素挥发速度 int besttourN_CITY_COUNT;/最佳路径列表 /获得指定范
14、围内的一个随机数 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; /临时保存信息素,更新环境信息素的时候使用,每只蚂蚁周游完各个城市后开
15、始计算 武汉理工大学计算机科学与技术学院能力拓展训练课程设计12double 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
16、nt AllowedCityN_CITY_COUNT;/没有走过的城市,数组索引对应城市编号 public: double m_dLength; double m_dShortest; 武汉理工大学计算机科学与技术学院能力拓展训练课程设计13int tabuN_CITY_COUNT; /记录走过的城市,里面存的是城市的编号,数组索引表示走的顺序。 public: ant(); void addcity(int city); void Clear(); void UpdateResult(); void move(); void move2last(); void shucout(); /只剩下
17、一个城市没走过时才调用,直接移动到最后一个城市 void ant:move2last() for(int i=0;i=mRate) 武汉理工大学计算机科学与技术学院能力拓展训练课程设计17 j=i; break; /这种情况只有在 temp=0.0 的时候才会出现 if (j = 10000) for (i=0;iantsd.m_dLength) temp=antsd.m_dLength; for (int t=0;tantsj.m_dLength) dbMin=antsj.m_dLength; if (tempN_IT_COUNT;武汉理工大学计算机科学与技术学院能力拓展训练课程设计27/主
18、程序入口 int main() shucout();project TSP; TSP.GetAnt(); TSP.StartSearch(); getchar(); return 0; 四结果武汉理工大学计算机科学与技术学院能力拓展训练课程设计28五心得体会通过对蚁群算法程序设计,不 仅让我巩固了 知识而且还让我了解C了关于蚁群算法的很多知识,着对于我来说,是不小的收获,以前根本就不知道蚁群算法,现在有了基本的了解,感觉自己收获不少。经过这次设计我体会颇多,我加强了对 程序设计这门课程的认识,并C且复习了自己以前学习到的知识,自己的逻辑思考能力也提高不少。这些都使得我对计算机语言的学习有了更深
19、入的认识!总之,通过这次课程设计,我收获颇丰,相信会为自己以后的学 习和工作带来很大的好处。最重要的还是激发了我编程和对算法的兴趣和热情, 让我从一个只懂理论变成了能做一些小型程序。整体地评价这次课程设计,我认为 收获很大,正如上面所说的那样,通 过课程设计,既复习了以前的旧知识,又学到了一些新的知识。像应用程序的设计和创建, 经武汉理工大学计算机科学与技术学院能力拓展训练课程设计29历了平时在课堂和考试中不会出现的难题和考验。而这些问题,又都是课本上很少提到的、更深一层的实践与知识相结合的问题, 这并不是我们平时只靠课本,就可以轻易解决的。所以,锻炼了我们面对难题,学会用已掌握的知识去解决具体问题的能力,进一步培养了独立思考问题和解决问题的能力。六参考文献 谭浩强著 程序设计.北京:清华大学出版社;1999C 谭浩强著 程序 设计题解与上机指导.北京:清 华大学出版社;1999 马良 朱刚 宁爱兵著 蚁群优化算法;2008 蚁群算法贴吧。