蚂蚁算法商旅问题Word文档格式.docx
- 文档编号:19821900
- 上传时间:2023-01-10
- 格式:DOCX
- 页数:14
- 大小:20.71KB
蚂蚁算法商旅问题Word文档格式.docx
《蚂蚁算法商旅问题Word文档格式.docx》由会员分享,可在线阅读,更多相关《蚂蚁算法商旅问题Word文档格式.docx(14页珍藏版)》请在冰豆网上搜索。
3.1初始化
本文的混合蚂蚁算法中,有几个重要的参数如下:
最大的循环次数NcMax;
城市的数目N;
蚂蚁的总数M;
信息素总量Q;
程序开始的时候,令时间t=0;
循环次数NcMax=0;
信息素总量Q设置为1000;
并且令M=8只蚂蚁随机的分布在N=10座城市中。
并且每条城市之间的路径有一定的初始信息素浓度。
同时,为了保证一只蚂蚁从一个城市转移到另一个城市的时候,只在一定数量的相对较近的城市中选择,定义了以下两个数据结构:
集合ptabu存放城市i的最近的前K个城市的编号。
数据Sumtabu[i]存放距城市i到与其最近的前K个城市的距离之和。
通过对每个城市i的相邻城市按距离排序,选择前K个城市置于ptabu中,并且根据其距离计算Sumtabu[i]。
10座城市的之间的距离由一个二维数组intdistance[N][N]保存。
具体距离由下边给出(是一对称矩阵,并且同城之间的距离设置为Max):
表一
城市编号
1
2
3
4
5
6
7
8
9
10
Max
15
21
16
17
14
11
30
19
24
20
12
22
18
13
23
27
3.2初始边上的信息素量的设置
在基本的蚂蚁算法中,一般在开始的时候,每条边上的信息素的量是相等的,以便使蚂蚁可以初始时可以完全随机的选择下一次要移动的城市。
但是在优化的蚂蚁算法中,为了使蚂蚁相对的倾向选择较近的城市,本文中算法在初始化时对每个顶点的相邻顶点按路径长短不同设置了不同量的信息素,公式如下:
signaltab=d*Q/Sumtabu[i]*K/N。
3.3信息素的更新
基本蚂蚁算法采用的信息素更新方法,或者只考虑路径长度而不考虑每条边对减小路径长度所做的贡献,或者不考虑路径长度,另外,对所有蚂蚁所走过的路径均更新信息素,这些更新方法均不利于信息素向最优路径上集中。
本算法中,只对部分较短路径更新信息素。
更新方法为:
对所有蚂蚁走过的路径按长度排序,选择前F个较短路径更新路径上的信息素。
3.4程序流程
(1)初始化M个蚂蚁,使其随机的分布在N个城市上;
(2)初始化ptabu函数,sumtabu函数,signaltab函数,状态转移概率的计算函数,信息素的更新函数;
(3)每一蚂蚁所走过的路径并且初值为-1;
(4)记录每个蚂蚁所走的路径的长度和,并且初值为0;
(5)根据状态转移概率公式计算的概率选择城市;
(6)记录蚂蚁所走过的路径;
(7)修改禁忌表指针;
(8)更新每条路径上的信息浓度;
(9)循环计算直到到达设置的循环次数。
4实验数据
本文的处理对象已经在表一中给出。
相关参数的设定如下:
循环次数NcMax=5000;
总城市数N=10;
总蚂蚁数M=8;
相邻最近距离城市数K=5;
同城距离设定MAX=10000;
信息素总量Q=1000;
对参数c分别取0.1~0.9计算最短路径如下表:
表二
参数C
最短路径
0.1
112
0.2
0.3
97
0.4
0.5
0.6
0.7
102
0.8
0.9
126
平均值
106.2
对于表一中所给的城市数据,经过穷举法计算得到最短路径长度为97(出发点均为城市1),由于算法本身的缺陷和循环次数的限制,在9次计算中,得到最优解的次数为4次,正确率为44.44%;
而最终求得的平均值为106.2,与最优解97相比的误差率为9.48%。
因此可以看出经改进的蚂蚁算法在求得最优解上有些力不从心,而最短路径的平均值在可接受的范围之内。
5程序源码
intdistance[N][N]={{MAX,5,8,7,6,15,21,16,9,8},{5,MAX,17,6,14,11,30,21,9,6},
{8,17,MAX,3,19,24,20,19,7,7},{7,6,3,MAX,21,3,17,12,22,10},{6,14,19,21,MAX,9,21,18,8,13},
{15,11,24,3,9,MAX,15,23,16,11},{21,30,20,17,21,15,MAX,22,12,30},{16,21,19,12,18,23,22,MAX,21,27},{9,9,7,22,8,16,12,21,MAX,15},{8,6,7,10,13,11,30,27,15,MAX}};
intptabu[N][N];
intsumtabu[N];
doublesignaltab[N][N];
intPathCity[M][N];
intFindPathLength[M];
/*
*初始化M个蚂蚁,使其随机的分布在N个城市上
*/
voidInitialAnt()
{
intLocateCity=-1;
//初始化
for(inti=0;
i<
M;
i++)
{
LocateCity=rand()%N;
PathCity[i][0]=LocateCity;
}
}
*寻找ptabu函数
voidFindPtabu()
intitem[N][N];
N;
for(intj=0;
j<
j++)
{
item[i][j]=distance[i][j];
}
for(i=0;
ptabu[i][j]=j+1;
*寻找sumtabu函数
voidFindSumtabu()
sumtabu[i]=0;
//求解sumtabu
K;
sumtabu[i]=sumtabu[i]+distance[i][ptabu[i][j]];
*寻找signaltab函数
voidFindSignaltab()
//求解signaltab
if(distance[i][j]==MAX)
{
signaltab[i][j]=0;
}
else
signaltab[i][j]=(double)distance[i][j]*Q/sumtabu[i]*K/N;
*状态转移概率的计算函数//变量m表示所要计算的蚂蚁位于城市m
intComputeProbability(intm)
{
intCityNum=-1;
//最终确定的转移城市
doubleprobability=0;
doublesum=0;
doubleTempProbability=0;
//记录可以转移的城市
intEnableTab[N];
EnableTab[i]=0;
//计算状态转移概率的分母
if(ptabu[m][i]==PathCity[m][j])
break;
if(ptabu[m][i]!
=PathCity[m][j]&
&
N)
EnableTab[j]=1;
sum=sum+pow(signaltab[m][i],a)*pow((double)P/distance[m][i],b);
if(j==N)
intRandCity=rand()%N;
EnableTab[RandCity]=1;
sum=sum+pow(signaltab[m][RandCity],a)*pow((double)P/distance[m][RandCity],b);
//根据公式计算概率并找到最大概率的城市
if(EnableTab[i])
if(sum)
TempProbability=(double)pow(signaltab[m][i],a)*pow((double)P/distance[m][i],b)/sum;
if(TempProbability>
probability)
CityNum=i;
probability=TempProbability;
returnCityNum;
*信息素的更新
voidUpdateSignal()
intPathLength[M];
PathLength[i]=FindPathLength[i];
intLessLengthNum[M];
//记录所有蚂蚁走过的路径前F的蚂蚁
LessLengthNum[i]=i;
//寻找前F的蚂蚁
F;
for(intj=M-1;
j>
0;
j--)
if(PathLength[j]>
PathLength[j-1])
swap(PathLength[j],PathLength[j-1]);
swap(LessLengthNum[j],LessLengthNum[j-1]);
//更新信息素
N-1;
if(PathCity[LessLengthNum[i]][j]!
=-1&
PathCity[LessLengthNum[i]][j+1]!
=-1)
signaltab[PathCity[LessLengthNum[i]][j]][PathCity[LessLengthNum[i]][j+1]]=
(double)c*signaltab[PathCity[LessLengthNum[i]][j]][PathCity[LessLengthNum[i]][j+1]]+
(double)Q/(PathLength[i]*distance[PathCity[LessLengthNum[i]][j]][PathCity[LessLengthNum[i]][j+1]]);
signaltab[PathCity[LessLengthNum[i]][j+1]][PathCity[LessLengthNum[i]][j]]=
(double)c*signaltab[PathCity[LessLengthNum[i]][j+1]][PathCity[LessLengthNum[i]][j]]+
*根据信息素的分布信息,找到近似的最优路径
voidDisplayResult()
intTheBestPath[N];
//记录最优的路径,并初始化为-1
TheBestPath[i]=-1;
intTheLength=0;
intCurrentCity=1;
intCityNum=0;
//记录与每个城市相邻的城市的信息素由大到小的城市号
item[i][j]=j+1;
//对每个城市的信息素进行由大到小的排序
for(intk=0;
k<
k++)
{
for(intj=N-1;
if(signaltab[i][j]>
signaltab[i][j-1])
{
swap(signaltab[i][j],signaltab[i][j-1]);
swap(item[i][j],item[i][j-1]);
}
//寻找最优路径
while(CityNum<
N-1)
TheBestPath[CityNum]=CurrentCity;
intm=0;
while(m<
inti=0;
while(TheBestPath[i]!
if(TheBestPath[i]==item[CurrentCity-1][m])
break;
i++;
if(TheBestPath[i]==-1)
CityNum++;
TheBestPath[CityNum]=item[CurrentCity-1][m];
CurrentCity=item[CurrentCity-1][m];
TheLength=TheLength+distance[TheBestPath[CityNum]-1][TheBestPath[CityNum-1]-1];
m++;
cout<
<
"
TheLengthis:
<
TheLength<
endl;
intmain()
*
*/
InitialAnt();
FindPtabu();
//ptab数组保存与各个蚂蚁最近的K条边
FindSumtabu();
//与各个蚂蚁最近的K条边的路程和
FindSignaltab();
//记录各条边上的信息素的总量
intt=0;
intNc=0;
intNextCity=-1;
//计算概率所得城市
intLocateCity=-1;
//蚂蚁所在的城市
//蚂蚁改进算法开始运行
while(Nc<
NcMax)
{
Nc++;
ints=0;
while(s<
//////////////////////////////////////////////////////////////////////////
//每一蚂蚁所走过的路径并且初值为-1;
for(inti=0;
for(intj=1;
PathCity[i][j]=-1;
//记录每个蚂蚁所走的路径的长度和,并且初值为0;
for(i=0;
FindPathLength[i]=0;
s++;
intk=0;
while(k<
M)
//根据状态转移概率公式计算的概率选择城市
i=0;
while((PathCity[k][i]==-1)&
(i<
N))
i++;
if(i!
=N)
LocateCity=PathCity[k][i];
NextCity=ComputeProbability(LocateCity);
//记录蚂蚁所走过的路径
while((PathCity[k][i]!
=-1)&
{//修改禁忌表指针
PathCity[k][i]=NextCity;
//记录走过的城市
FindPathLength[k]=FindPathLength[k]+distance[LocateCity][NextCity];
//记录走过的路径和
k++;
}}
//更新每条路径上的信息浓度
UpdateSignal();
DisplayResult();
return0;
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 蚂蚁 算法 商旅 问题