用python实现蚁群算法
由于学python不久,写的程序比较冗杂,借鉴了很多网上程序之后写的,有不足之处希望指出,谢谢。
#!/usr/bin/python
import time;
import random;
a=1;
b=2;
n=5
i=0;
aa=1;
j=1;
xigema=0.3;
zuiduanlujing=[0]*n;#最短路径矩阵
zdl=100000.0;#最短路径距离
arf=0.003;#距离影响因子,也是信息素初始矩阵
beta=0.007;#信息素影响因子
M=int(input("请输入蚂蚁数量:"));#M为蚂蚁数量
n=input("请输入城市数量:");
n=int(n) ; # 城市数量
c=[[0,0] for j in range(n)]; # n个城市的坐标
for i in range(n):
print("请输入第",i+1);
heng=int(input("城市的横坐标:"));
print("请输入第",i+1,);
zong=int(input("城市的纵坐标:"));
c[i][0]=heng;
c[i][1]=zong;
cc=int(input("请输入迭代次数;"));#循环次数
d=[[0]*n for j in range(n)];#d矩阵为两城市间距离
xinx=[[0]*n for j in range(n)];#xinx为启发函数,也是信息素初始函数
xxs=[[0]*n for j in range(n)];#信息素初始函数
xx=0.0;
yy=0.0;
dd=0.0;
for i in range(n):
for j in range(n):
xx=c[i][0]-c[j][0];
xx=xx**2;
yy=c[i][1]-c[j][1];
yy=yy**2;
dd=(xx+yy)**0.5;
d[i][j]=dd;
for i in range(n):#信息素初始值赋值为距离函数的倒数
for j in range(n):
if d[i][j]==0:
xinx[i][j]=0;
else:
xinx[i][j]=1/d[i][j];
xxs=xinx;
for ij in range(cc):#主循环,循环模拟次数
kexs=n-1;
kx=[0]*n;#剩余可选择城市根据矩阵
m=[[0]*n for i in range(M)];#m为每只蚂蚁走过的路径
sy=[[0]*n for i in range(M)];#sy矩阵为蚂蚁剩余可走路径,0表示未走过,1表示走过
for i in range(M):
m[i][0]=random.randint(1,n);
ssy=m[i][0]-1;
ssy=int(ssy);
sy[i][ssy]=1;
#print("m",m);
p=n;#辅助p为剩余城市数量
for i in range(n):
if sy[0][i]==1:
p=p-1;
kqd=[[0]*2 for i in range(p)];#概率以及对应城市
gail=[[0]*p];#剩余城市概率
zx=0.0#剩余总信息素
k=0;
pz=0.0;
sj=0.0;
zx=0;
w=0;#循环第到第几次
for w in range(n-1):
for i in range(M):
k=0;pz=0;
kqd=[[0]*2 for j in range(p)];#分类下个城市距离矩阵
for j in range(n):
if sy[i][j]==0:
kqd[k][0]=j+1;
k=k+1;
#print(kqd,m);
for j in range(p):
pz=pz+((xinx[(kqd[j][0]-1)][m[i][w]-1]**arf)*(xxs[(kqd[j][0]-1)][m[i][w]-1]**beta));
#print("pingjun",kqd[j][0]-1,m[0][i]-1,pz);
for j in range(p):
kqd[j][1]=((xinx[(kqd[j][0]-1)][m[i][w]-1]**arf)*(xxs[(kqd[j][0]-1)][m[i][w]-1]**beta))/pz;
for j in range(p-1):
kqd[j+1][1]=kqd[j][1]+kqd[j+1][1];
sj=random.random();
for j in range(p):
if sj<=kqd[j][1]:
zx=kqd[j][0];
#print(kqd,zx);
xf=n-p; #下一次放的地方为
m[i][xf]=zx;
sy[i][zx-1]=1;
#print(m,sy,aa);
p=p-1;
julib=[0.0]*M;#M只蚂蚁走过的总距离
for ii in range(M):
for jj in range(n-1):
julib[ii]=julib[ii]+d[m[ii][jj]-1][m[ii][jj+1]-1];
dj=0;#定义第几条路径最短
for ii in range(M-1):
if julib[dj]>=julib[ii+1]:
dj=ii+1;
if zdl>julib[dj]:
zuiduanlujing=m[dj];
zdl=julib[dj];
zeng=[[0]*n for j in range(n)];#信息素增加中间矩阵
zengjj=[[0]*n for j in range(n)];#信息素增加矩阵
for i in range(M):
for j in range(n-1):
zeng[m[i][j]-1][m[i][j+1]-1]=xinx[m[i][j]-1][m[i][j+1]-1];
zeng[m[i][j+1]-1][m[i][j]-1]=xinx[m[i][j+1]-1][m[i][j]-1];
for i in range(n):
for j in range(n):
zengjj[i][j]=zeng[i][j]+zengjj[i][j];
for i in range(n):
for j in range(n):
zengjj[i][j]=xigema*zengjj[i][j];
for i in range(n):
for j in range(n):
xxs[i][j]=xxs[i][j]+zengjj[i][j];
for i in range(n):#约束信息素区间
for j in range(n):
if xxs[i][j]<=0.05:
xxs[i][j]=0.06;
if xxs[i][j]>=10:
xxs[i][j]=10;
zdlj=zuiduanlujing;
print("经过",cc,"次迭代后,最短距离为:",zdl,"\n路径为",zuiduanlujing);
time.sleep(5)
input();