//随机选择一个出发城市
m_nCurCityNo=rnd(0,N_CITY_COUNT);
//把出发城市保存入路径数组中 m_nPath[0]=m_nCurCityNo;
//标识出发城市为已经去过了 m_nAllowedCity[m_nCurCityNo]=0;
//已经去过的城市数量设置为1 m_nMovedCityCount=1; }
//选择下一个城市 //返回值 为城市编号 int CAnt::ChooseNextCity() {
int nSelectedCity=-1; //返回结果,先暂时把其设置为-1
//============================================================================== //计算当前城市和没去过的城市之间的信息素总和
double dbTotal=0.0;
double prob[N_CITY_COUNT]; //保存各个城市被选中的概率
for (int i=0;i if (m_nAllowedCity[i] == 1) //城市没去过 { prob[i]=pow(g_Trial[m_nCurCityNo][i],ALPHA)*pow(1.0/g_Distance[m_nCurCityNo][i],BETA); //该城市和当前城市间的信息素 dbTotal=dbTotal+prob[i]; //累加信息素,得到总和 } else //如果城市去过了,则其被选中的概率值为0 { prob[i]=0.0; } } //============================================================================== //进行轮盘选择 double dbTemp=0.0; if (dbTotal > 0.0) //总的信息素值大于0 { dbTemp=rnd(0.0,dbTotal); //取一个随机数 for (int i=0;i if (m_nAllowedCity[i] == 1) //城市没去过 { dbTemp=dbTemp-prob[i]; //这个操作相当于转动轮盘,如果对轮盘选择不熟悉,仔细考虑一下 if (dbTemp < 0.0) //轮盘停止转动,记下城市编号,直接跳出循环 { nSelectedCity=i; break; } } } } //============================================================================== //如果城市间的信息素非常小 ( 小到比double能够表示的最小的数字还要小 ) //那么由于浮点运算的误差原因,上面计算的概率总和可能为0 //会出现经过上述操作,没有城市被选择出来 //出现这种情况,就把第一个没去过的城市作为返回结果 //题外话:刚开始看的时候,下面这段代码困惑了我很长时间,想不通为何要有这段代码,后来才搞清楚。 if (nSelectedCity == -1) { for (int i=0;i if (m_nAllowedCity[i] == 1) //城市没去过 { nSelectedCity=i; break; } } } //============================================================================== //返回结果,就是城市的编号 return nSelectedCity; } //蚂蚁在城市间移动 void CAnt::Move() { int nCityNo=ChooseNextCity(); //选择下一个城市 m_nPath[m_nMovedCityCount]=nCityNo; //保存蚂蚁走的路径 m_nAllowedCity[nCityNo]=0;//把这个城市设置成已经去过了 m_nCurCityNo=nCityNo; //改变当前所在城市为选择的城市 m_nMovedCityCount++; //已经去过的城市数量加1 } //蚂蚁进行搜索一次 void CAnt::Search() { Init(); //蚂蚁搜索前,先初始化
相关推荐: