基本蚁群算法_第1页
基本蚁群算法_第2页
基本蚁群算法_第3页
基本蚁群算法_第4页
基本蚁群算法_第5页
已阅读5页,还剩10页未读 继续免费阅读

下载本文档

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

文档简介

1、蚁群算法浅析摘要:介绍了什么是蚁群算法,蚁群算法的种类,对四种不同的蚁群算法进行了分析对比。详细阐述了蚁群算法的基本原理,将其应用于旅行商问题,有效地解决了问题。通过对旅行商问题C+模拟仿真程序的详细分析,更加深刻地理解与掌握了蚁群算法。关键词:蚁群算法;旅行商问题;信息素;轮盘选择一、引言蚁群算法(Ant Colony Optimization, ACO),是一种用来在图中寻找优化路径的算法。它由Marco Dorigo于1992年在他的博士论文中提出,其灵感来源于蚂蚁在寻找食物过程中发现路径的行为。蚁群算法是一种模拟进化算法,初步的研究表明该算法具有许多优良的性质。蚁群算法成功解决了旅行商

2、问题(Traveling Salesman Problem, TSP):一个商人要到若干城市推销物品,从一个城市出发要到达其他各城市一次而且最多一次最后又回到第一个城市。寻找一条最短路径,使他从起点的城市到达所有城市一遍,最后回到起点的总路程最短。若把每个城市看成是图上的节点,那么旅行商问题就是在N个节点的完全图上寻找一条花费最少的回路。最基本的蚁群算法见第二节。目前典型的蚁群算法有随机蚁群算法、排序蚁群算法和最大最小蚁群算法,其中后两种蚁群算法是对前一种的优化。本文将终点介绍随机蚁群算法。二、基本蚁群算法(一)算法思想各个蚂蚁在没有事先告诉他们食物在什么地方的前提下开始寻找食物。当一只找到食

3、物以后,它会向环境释放一种信息素,信息素多的地方显然经过这里的蚂蚁会多,因而会有更多的蚂蚁聚集过来。假设有两条路从窝通向食物,开始的时候,走这两条路的蚂蚁数量同样多(或者较长的路上蚂蚁多,这也无关紧要)。当蚂蚁沿着一条路到达终点以后会马上返回来,这样,短的路蚂蚁来回一次的时间就短,这也意味着重复的频率就快,因而在单位时间里走过的蚂蚁数目就多,洒下的信息素自然也会多,自然会有更多的蚂蚁被吸引过来,从而洒下更多的信息素。因此,越来越多地蚂蚁聚集到较短的路径上来,最短的路径就找到了。蚁群算法的基本思想如下图表示:图1 等概率选择 图2 最优路径 图3 最优比重(二)算法描述基本蚁群算法的算法简单描述

4、如下:1所有蚂蚁遇到障碍物时按照等概率选择路径,并留下信息素;2随着时间的推移,较短路径的信息素浓度升高;3蚂蚁再次遇到障碍物时,会选择信息素浓度高的路径;4较短路径的信息素浓度继续升高,最终最优路径被选择出来。三、随机蚁群算法(一)算法思想在基本蚁群算法中,蚂蚁会在多条可选择的路径中,自动选择出最短的一条路径。但是,一旦蚁群选择了一条比之前短的路径,就会认为这条路径是最好的,在这条路径上一直走下去。这样的算法存在问题:蚂蚁可能只是找到了局部的最短路径,而忽略了全局最优解。因此,在基本蚁群算法的基础上,需要对蚂蚁选路的方案加以改善:有些蚂蚁并没有象其它蚂蚁一样总重复同样的路,他们会另辟蹊径,也

5、就是它会按照一定的概率不往信息素高的地方。如果令开辟的道路比原来的其他道路更短,那么,渐渐地,更多的蚂蚁被吸引到这条较短的路上来。最后,经过一段时间运行,可能会出现一条最短的路径被大多数蚂蚁重复着,这就是优化的随机蚁群算法。为了实现蚂蚁的“随机”选路,我们需要做以下假设:1范围:蚂蚁观察到的范围是一个方格世界,蚂蚁有一个参数为速度半径,如果半径等于2,那么它能观察到的范围就是2*2个方格世界,并且能移动的距离也在这个范围之内。2环境:环境以一定的速率让信息素消失。3觅食规则:在每只蚂蚁能感知的范围内寻找是否有食物,如果有就直接过去。否则看是否有信息素,并且比较在能感知的范围内哪一点的信息素最多

6、,那么它朝哪个方向走的概率就大。这就意味着每只蚂蚁多会以小概率犯错误,从而并不是往信息素最多的点移动。4避障规则:如果蚂蚁要移动的方向有障碍物挡住,它会随机的选择另一个方向,并且有信息素指引的话,它会按照觅食的规则行为。 5播撒信息素规则:每只蚂蚁在找到食物后撒发的信息素。自然想到一个问题:开始时环境没有信息素,蚂蚁为什么会相对有效的找到食物呢?这个问题用蚂蚁的移动规则同样可以解释。首先,它要能尽量保持某种惯性,这样使得蚂蚁尽量向前方移动(开始,这个前方是随机固定的一个方向),而不是原地无谓的打转或者震动;其次,蚂蚁要有一定的随机性,虽然有了固定的方向,但它也不能像粒子一样直线运动下去,而是有

7、一个随机的干扰。这样就使得蚂蚁运动起来具有了一定的目的性,尽量保持原来的方向,但又有新的试探,这就解释了为什么单个蚂蚁在复杂的诸如迷宫的地图中仍然能找到隐蔽得很好的食物。(二)算法描述随机蚁群算法的算法描述如下:算法输入:城市数量N,两两城市间的距离,所有路径的信息素浓度算法输出:蚂蚁走过的路径长度1设置全部城市都没有去过,走过的路径长度为0;2随机选择一个出发的城市;3i = 14while(i < N)4 根据可选择路径的信息素浓度,计算出各自选中的概率;5 根据不同选择的概率,使用轮盘选择算法,得到选择的下一个城市;6 将所在城市标记为不可选择;7end8计算走过路径的长度;用随机

8、蚁群算法解决旅行商问题,实际上是多次使用蚁群算法,不断更新最短路径的过程。由此,我们容易得到旅行商问题的算法描述:算法输入:所有城市的X、Y坐标,蚂蚁数量n,迭代次数K算法输出:旅行商的最短路径1计算两两城市间的距离,初始化所有路径信息素为0;2for i = 1 : K3 for j = 1 : n4 第j只蚂蚁搜索一遍;5 if 走过的路径小于最短路径6 更新最短路径;7 更新走过路径的信息素;8 end9end四、改进的随机蚁群算法(一)排序蚁群算法与随机蚁群算法不同的是,当蚂蚁遇到障碍物选择路径时,根据不同路径上信息素的浓度,通过计算可能达到最优解的概率算法,将路径进行排序,选择最好的

9、路径作为下一个通往的城市。(二)最大最小蚁群算法与随机蚁群算法和排序蚁群算法都不同的是,当蚂蚁遇到障碍物选择路径时,使用贪心策略,优先选择达到下一个城市最短的城市,即得到局部最优解。这样以来,更多的信息素将在较短的路径聚集,使算法更快地得到全局最短路径。五、算法比较本文介绍了四种蚁群算法,其中第一种比较简单,描述了最基本的蚁群算法思想。但是,它忽略了更优路径存在的可能性,没有考虑到更普遍的情况。因此,该算法只适用于小规模,无特殊情况的问题。后三种蚁群算法属于实际中典型的蚁群算法,对不同情况的考虑比较全面,因此应用比较广泛。三者的差别主要在于蚂蚁对不同路径的选择上,其中,随机蚁群算法首先根据不同

10、路径上信息素的浓度,计算出选择各条路径的概率,而后使用轮盘算法选择一条路径,适用于规模不太大的场合;排序蚁群算法则根据选择各条路径的概率,对路径进行优先排序,选择最好的路径作为下一个通往的城市,这样做增加了空间复杂度,有效改善了时间复杂度,适用于规模较大的场合;最大最小蚁群算法则是采用贪心策略,优先选择达到下一个城市最短的城市,先得到局部最优解,再通过聚类效应得到全局最短路径,适合对时间和空间要求都较高的场合。参考文献: 1. 丁洋. 蚁群优化算法分析. 论文期刊. 2012.5.2. 蚁群优化算法. 附录: 1预编译所需头文件 Stdafx.h#pragma once/ Stdafx.h :

11、 标准系统包含文件的包含文件,/ 或是常用但不常更改的项目特定的包含文件#include <iostream>#include <tchar.h>#include <math.h>#include <time.h>2算法参数头文件 Common.h#pragma onceconst int N_CITY_COUNT=51; /城市数量const int N_ANT_COUNT=34; /蚂蚁数量const int N_IT_COUNT=50; /迭代次数/蚁群算法参数const double ALPHA=1.0;const double BETA

12、=2.0;const double ROU=0.5; /信息素传递参数const double DBQ=100.0; /总的信息素const double DB_MAX=10e9; /最大标志数extern double g_TrialN_CITY_COUNTN_CITY_COUNT; /两两城市间信息素extern double g_DistanceN_CITY_COUNTN_CITY_COUNT; /两两城市间距离extern int rnd(int nLow,int nUpper); /返回随机整数extern double rnd(double dbLow,double dbUpper

13、);/返回随机浮点数extern double ROUND(double dbA);/浮点数四舍五入extern double x_AryN_CITY_COUNT;extern double y_AryN_CITY_COUNT;3蚂蚁类头文件 Ant.h#pragma once#include "Common.h"/蚂蚁类class CAntpublic:CAnt();CAnt();int m_nPathN_CITY_COUNT; /蚂蚁走的路径double m_dbPathLength; /蚂蚁走过的路径长度int m_nAllowedCityN_CITY_COUNT;

14、/没去过的城市int m_nCurCityNo; /当前所在城市编号int m_nMovedCityCount; /已经去过的城市数量int ChooseNextCity(); /选择下一个城市void Init(); /初始化void Move(); /蚂蚁在城市间移动void Search(); /搜索路径void CalPathLength(); /计算蚂蚁走过的路径长度;4旅行商类头文件 Stdafx.h#pragma once#include "Common.h"#include "Ant.h"/旅行商类class CTsppublic:CTs

15、p();CTsp();CAnt m_cAntAryN_ANT_COUNT;CAnt m_cBestAnt; /保存结果void InitData(); /初始化数据void Search(); /开始搜索void UpdateTrial();/更新环境信息素;5预编译所需文件 Stdafx.cpp/ stdafx.cpp : 只包括标准包含文件的源文件/ City.pch 将成为预编译头/ stdafx.obj 将包含预编译类型信息#include "Stdafx.h"6数据及全局函数文件Common.cpp#include "stdafx.h"#inc

16、lude "common.h"double g_TrialN_CITY_COUNTN_CITY_COUNT; /两两城市间信息素double g_DistanceN_CITY_COUNTN_CITY_COUNT; /两两城市间距离/城市坐标数据double x_AryN_CITY_COUNT=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,5

17、6,30;double y_AryN_CITY_COUNT=52,49,64,26,30,47,63,62,33,21,41,32,25,42,16,41,23,33,13,58,42,57,57,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;/返回指定范围内的随机整数int rnd(int nLow,int nUpper)return nLow+(nUpper-nLow)*rand()/(RAND_MAX+1);/返回指定范围内的随机浮点数double rnd(double

18、 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);7蚂蚁类定义文件Ant.cpp#include "Stdafx.h"#include "Ant.h"CAnt:CAnt()CAnt:CAnt()/搜索一次void CAnt:Search()/初始出发点Init();

19、/所有城市走一遍while(m_nMovedCityCount < N_CITY_COUNT)Move();/计算走过路径长度CalPathLength();void CAnt:Init()for (int i=0;i<N_CITY_COUNT;i+)m_nAllowedCityi=1; /设置全部城市为没有去过m_nPathi=0; /蚂蚁走的路径全部设置为0/蚂蚁走过的路径长度设置为0m_dbPathLength=0.0; /随机选择一个出发城市m_nCurCityNo=rnd(0,N_CITY_COUNT);/设置出发城市m_nPath0=m_nCurCityNo;/标识出发

20、城市为已经去过了m_nAllowedCitym_nCurCityNo=0; /已经去过的城市数量设置为1m_nMovedCityCount=1; /选择下一个城市,返回值为城市编号int CAnt:ChooseNextCity()int nSelectedCity=-1; /返回结果,先暂时把其设置为-1/计算当前城市和没去过的城市之间的信息素总和double dbTotal=0.0;double probN_CITY_COUNT; /保存城市被选中的概率for (int i=0;i<N_CITY_COUNT;i+)if (m_nAllowedCityi = 1) /城市没去过/该城市被

21、选中的概率=该城市和当前城市间的信息素总量*(1/距离)2probi=pow(g_Trialm_nCurCityNoi,ALPHA)*pow(1.0/g_Distancem_nCurCityNoi,BETA);dbTotal=dbTotal+probi; /累加信息素,得到总和elseprobi=0.0;/轮盘选择double dbTemp=0.0;if (dbTotal > 0.0) /总的信息素值大于0dbTemp=rnd(0.0,dbTotal); /取一个随机数for (int i=0;i<N_CITY_COUNT;i+)if (m_nAllowedCityi = 1) /

22、城市没去过dbTemp=dbTemp-probi; /转动轮盘if (dbTemp < 0.0) /轮盘停止转动,记下城市编号,直接跳出循环nSelectedCity=i;break;/如果城市间的信息素非常小,由于浮点运算的误差原因,可能没有城市被选择出来/出现这种情况,就把第一个没去过的城市作为返回结果if (nSelectedCity = -1)for (int i=0;i<N_CITY_COUNT;i+)if (m_nAllowedCityi = 1) /城市没去过nSelectedCity=i;break;/返回结果return nSelectedCity;void CA

23、nt:Move()int nCityNo=ChooseNextCity(); /选择下一个城市m_nPathm_nMovedCityCount=nCityNo; /记录蚂蚁走的路径m_nAllowedCitynCityNo=0;/标记城市已经去过m_nCurCityNo=nCityNo; /记录当前所在城市编号m_nMovedCityCount+; /去过的城市数量加一/计算蚂蚁走过的路径长度void CAnt:CalPathLength()m_dbPathLength=0.0;int m=0;int n=0;/计算走过路径的长度和for (int i=1;i<N_CITY_COUNT;

24、i+)m=m_nPathi;n=m_nPathi-1;m_dbPathLength=m_dbPathLength+g_Distancemn;/加上从最后城市返回出发城市的距离n=m_nPath0;m_dbPathLength=m_dbPathLength+g_Distancemn;8旅行商类定义文件Tsp.cpp#include "Stdafx.h"#include "Tsp.h"CTsp:CTsp()m_cBestAnt.m_dbPathLength=DB_MAX;CTsp:CTsp()/初始化数据void CTsp:InitData() /先把最佳结

25、果的路径设置成最大m_cBestAnt.m_dbPathLength=DB_MAX; /计算两两城市间距离double dbTemp=0.0;for (int i=0;i<N_CITY_COUNT;i+)for (int j=0;j<N_CITY_COUNT;j+)dbTemp=(x_Aryi-x_Aryj)*(x_Aryi-x_Aryj)+(y_Aryi-y_Aryj)*(y_Aryi-y_Aryj);dbTemp=pow(dbTemp,0.5);g_Distanceij=ROUND(dbTemp);/初始化环境信息素为0for (int i=0;i<N_CITY_COUN

26、T;i+)for (int j=0;j<N_CITY_COUNT;j+)g_Trialij=0.0;/更新环境信息素void CTsp:UpdateTrial()/临时保存信息素double dbTempAryN_CITY_COUNTN_CITY_COUNT;memset(dbTempAry,0,sizeof(dbTempAry); /先全部设置为0/计算新增加的信息素,保存到临时数组里int m=0;int n=0;for (int i=0;i<N_ANT_COUNT;i+) /计算每只蚂蚁留下的信息素for (int j=1;j<N_CITY_COUNT;j+)m=m_c

27、AntAryi.m_nPathj;n=m_cAntAryi.m_nPathj-1;dbTempArynm=dbTempArynm+DBQ/m_cAntAryi.m_dbPathLength;dbTempArymn=dbTempArynm;/最后城市和开始城市之间的信息素n=m_cAntAryi.m_nPath0;dbTempArynm=dbTempArynm+DBQ/m_cAntAryi.m_dbPathLength;dbTempArymn=dbTempArynm;/更新环境信息素for (int i=0;i<N_CITY_COUNT;i+)for (int j=0;j<N_CITY_COUNT;j+)g_Trialij=g_Trialij*ROU+dbTempAryij; /最新的环境信息素 = 留

温馨提示

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

评论

0/150

提交评论