蚁群算法的python代码
时间: 2023-11-12 08:13:57 浏览: 71
以下是一个基于 Python 的蚁群算法代码示例:
```python
import random
# 邻接矩阵,用于表示各节点之间的距离
matrix = [
[0, 2, 4, 5, 1],
[2, 0, 7, 3, 6],
[4, 7, 0, 8, 1],
[5, 3, 8, 0, 4],
[1, 6, 1, 4, 0]
]
# 蚂蚁数量
ants_count = 10
# 迭代次数
iterations = 50
# 信息素挥发因子
evaporation_rate = 0.5
# 普遍启发因子
alpha = 1
# 前人经验因子
beta = 2
# 信息素变化速率
delta = 1
# 初始化信息素数组
pheromone = [[1 / (len(matrix)**2) for x in range(len(matrix))] for y in range(len(matrix))]
# 开始迭代
for it in range(iterations):
# 初始化蚂蚁位置和路径
ant_paths = [[random.randrange(len(matrix))] for _ in range(ants_count)]
# 让所有蚂蚁都走一遍
for step in range(len(matrix) - 1):
for i, ant in enumerate(ant_paths):
current_node = ant[-1]
# 计算可选节点的概率
probabilities = []
for j in range(len(matrix)):
if j not in ant:
ph = pheromone[current_node][j]**alpha
desirability = (1 / matrix[current_node][j])**beta
probabilities.append(ph * desirability)
else:
probabilities.append(0)
sum_of_probabilities = sum(probabilities)
# 若所有可选节点都被走过,则随机选择一个
if sum_of_probabilities == 0:
ant.append(random.choice([x for x in range(len(matrix)) if x not in ant]))
else:
# 根据概率选择下一个节点
r = random.uniform(0, sum_of_probabilities)
s = 0
for j, probability in enumerate(probabilities):
s += probability
if s >= r:
ant.append(j)
break
# 计算所有路径的距离
distances = []
for ant in ant_paths:
distance = 0
for i in range(len(ant) - 1):
distance += matrix[ant[i]][ant[i+1]]
distances.append(distance)
# 更新信息素
for i in range(len(matrix)):
for j in range(len(matrix)):
if i != j:
# 计算当前节点到下一个节点的信息素变化量
delta_pheromone = 0
for k, ant in enumerate(ant_paths):
if j in ant and ant.index(j) == ant.index(i) + 1:
delta_pheromone += delta / distances[k]
# 信息素挥发+添加当前节点到下一个节点的信息素变化量
pheromone[i][j] = (1 - evaporation_rate) * pheromone[i][j] + delta_pheromone
# 输出最优路径及其距离
optimal_distance = min(distances)
optimal_path = ant_paths[distances.index(optimal_distance)]
print(f"Optimal path: {optimal_path}, distance: {optimal_distance}")
```
该示例代码实现了基本的蚁群算法,用于寻找一个有向带权图中所有路径中的最短路径。在第一行定义了一个有向带权邻接矩阵,表示各节点之间的距离。在后面的参数中,定义了蚂蚁数量、迭代次数、信息素挥发因子、普遍启发因子、前人经验因子和信息素变化速率等参数。程序先初始化信息素数组,然后进行一定次数的迭代,每次迭代都让所有蚂蚁依次走一遍,更新信息素数组,最后输出最优路径及其距离。
阅读全文