近期碰到一个需求,对蚂蚁群算法在公交线路上的优化处理,很长时间做算法的学习了这里做记录和分享。
对蚂蚁算法大家基本都不陌生,不知道的可以百度一下,我只简单的描述一下关键参数。和商旅问题不同,公交线路基本不做线路的闭环,有明确的起点和终点。我们需要做的是对信息启发因子,期望启发式因子,信息素挥发参数,还有信息素的初始化,公交线路的初始化,然后让每只蚂蚁都从起点出发,进行轮盘赌线路选择下一个站点,判断是否达到终点,更新信息素。输出可以正确到达终点的线路,最后根据线路优化方向输出最短路径,换乘次数最少路径,时间最短路径等。
涉及的关键点是轮盘赌现在线路和更新信息素,我给出代码片段:
//轮盘赌选择线路
double probability = -1.0;//转移到下一节点的概率
double sum = 0.0;
double prob = 0.0;
for(int i = 0; i < N; i++)
{
if (1 == allowed[i] && 0 != allDistance[cururentSite][i])
{
sum += antColony->Transition(cururentSite, i);
}
}
q = rand()/(double)RAND_MAX;//轮盘概率
for(int i = 0; i < N; i++)
{
//去掉禁忌表中已走过的节点,从剩下节点中选择最大概率的可行节点
if (1 == allowed[i] && 0 != allDistance[cururentSite][i])
{
prob += antColony->Transition(cururentSite, i)/sum;
cout << "蚂蚁选择" << cururentSite + 1 << "-"<<i + 1 <<"的概率为:" << prob*100 << "%" <<endl;
if (prob >= q)
{
nextSite = i;
probability = prob;
break;
}
}
}
//更新信息素
for(int i = 0; i < N; i++)
{
int row = bestTour[i];
int col = bestTour[i+1];
if(0 != col)
{
info[row][col] = (1.0 - rou) * info[row][col] + rou * (1.0 / globalBestLength);
info[col][row] = info[row][col];
}
}