python蚁群算法 路径规划_用python实现蚁群算法

用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();

  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
蚁群算法(Ant Colony Optimization, ACO)是一种启发式算法,它模拟了蚂蚁在搜索食物时的行为,常用于路径规划问题。下面是一个Python蚁群算法路径规划的示例代码: ```python import random import math class Ant: def __init__(self, start, end, graph, alpha, beta): self.start = start self.end = end self.graph = graph self.alpha = alpha self.beta = beta self.path = [start] self.distance = 0 self.visited = [False] * len(graph) self.visited[start] = True def select_next_node(self): pheromone = self.graph[self.path[-1]] probabilities = [0] * len(pheromone) total = 0 for i, p in enumerate(pheromone): if not self.visited[i]: probabilities[i] = pow(p, self.alpha) * pow(1 / self.graph[self.path[-1]][i], self.beta) total += probabilities[i] if total == 0: return random.choice([i for i in range(len(self.graph)) if not self.visited[i]]) r = random.uniform(0, total) upto = 0 for i, p in enumerate(probabilities): if not self.visited[i]: upto += p if upto >= r: return i assert False, "Shouldn't get here" def move_to_next_node(self): next_node = self.select_next_node() self.visited[next_node] = True self.path.append(next_node) self.distance += self.graph[self.path[-2]][next_node] def run(self): while not self.visited[self.end]: self.move_to_next_node() self.distance += self.graph[self.path[-1]][self.start] def ant_colony(graph, start, end, n_ants, n_iterations, alpha, beta, evaporation_rate, initial_pheromone): pheromone = [[initial_pheromone] * len(graph) for _ in range(len(graph))] best_path = None best_distance = float('inf') for iteration in range(n_iterations): ants = [Ant(start, end, graph, alpha, beta) for _ in range(n_ants)] for ant in ants: ant.run() if ant.distance < best_distance: best_path = ant.path best_distance = ant.distance for i, row in enumerate(pheromone): for j in range(len(row)): pheromone[i][j] *= (1 - evaporation_rate) for ant in ants: if j == ant.path[i] or i == ant.path[j]: pheromone[i][j] += evaporation_rate / ant.distance return best_path, best_distance ``` 在这个示例中,`graph`是一个邻接矩阵,表示各个节点之间的距离,`start`和`end`是起点和终点的索引,`n_ants`和`n_iterations`分别表示蚂蚁数量和迭代次数,`alpha`和`beta`是参数,控制着蚂蚁选择下一个节点时的权重,`evaporation_rate`是信息素挥发速率,`initial_pheromone`是初始信息素浓度。 要使用这个算法,可以像这样调用: ```python graph = [[0, 1, 2, 3], [1, 0, 4, 5], [2, 4, 0, 6], [3, 5, 6, 0]] start = 0 end = 3 n_ants = 10 n_iterations = 100 alpha = 1 beta = 1 evaporation_rate = 0.5 initial_pheromone = 1 best_path, best_distance = ant_colony(graph, start, end, n_ants, n_iterations, alpha, beta, evaporation_rate, initial_pheromone) print("Best path:", best_path) print("Best distance:", best_distance) ``` 这个示例中,`graph`表示一个有4个节点的图,`start`是节点0,`end`是节点3,我们希望找到从节点0到节点3的最短路径。运行这段代码会输出最短路径和最短距离。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值