对于二元蚁群算法,它的信息素更新策略,和tsp蚂蚁是有区别的——编程的时候就体现出来了。
最常用的:“轮盘法”,究竟如何描述的?
其次,在知道信息素的情况下,如何用“轮盘法”进行解的选择:0还是1,下一个城市究竟是0~144中的哪一个?
在书上的程序中,采用的选择方法在实验中效果不怎么好;从网上借鉴的一个程序,效果反倒不错。
对于tsp问题,首先计算每个城市的入选概率,由于并不是每个城市都是可选的(走过的城市,不能再遍历),所以,每次选择,都需要计算;然后,随机一个[0, 概率之和] 之间的数值,从第一个城市开始比较:找到第一个大于这个概率的数值,就选中这个城市。代码如下:
- int ant::ChooseNextCity()
- {
- //Update the probability of path selection
- //select a path from tabu[m_iCityCount-1] to next
- int i;
- int j=10000;
- double temp=0;
- int curCity=tabu[m_iCityCount-1];
- for (i=0;i<iCityCount;i++)
- {
- if((AllowedCity[i]==1))
- {
- temp+=pow((1.0/Map.distance[curCity][i]),beta)*pow((Map.m_dTrial[curCity][i]),alpha);
- }
- }
- double sel=0;
- for (i=0;i<iCityCount;i++)
- {
- if((AllowedCity[i]==1))
- {
- prob[i]=pow((1.0/Map.distance[curCity][i]),beta)*pow((Map.m_dTrial[curCity][i]),alpha)/temp;
- sel+=prob[i];
- }
- else
- prob[i]=0;
- }
- double mRate=rnd(0,sel);
- double mSelect=0;
- for ( i=0;i<iCityCount;i++)
- {
- if((AllowedCity[i]==1))
- mSelect+=prob[i] ;
- if (mSelect>=mRate) {j=i;break;}
- }
- if (j==10000)
- {
- temp=-1;
- for (i=0;i<iCityCount;i++)
- {
- if((AllowedCity[i]==1))
- if (temp /* */)
- {
- temp=pow((1.0/Map.distance[curCity][i]),beta)*pow((Map.m_dTrial[curCity][i]),alpha);
- j=i;
- }
- }
- }
- return j;
- }
返回城市编号。