蚁群算法解决旅行商问题 (TSP) - 优化路线,提高效率
本文使用蚁群算法解决旅行商问题 (TSP),旨在找到连接多个城市的最短路线。
算法原理
蚁群算法模拟了蚂蚁在寻找食物时,通过信息素的传递来互相引导,最终找到最短路径的行为。算法流程如下:
- 读取城市坐标信息: 首先,需要读取所有城市的坐标信息,并计算城市之间的距离,构建距离矩阵。
- 设置参数: 设置一些参数,例如蚂蚁数量、信息素重要程度因子、启发函数重要程度因子等,这些参数会影响算法的效率和精度。
- 蚂蚁路径选择: 每个蚂蚁从一个随机城市出发,根据信息素浓度和城市间的距离,选择下一个要访问的城市。
- 路径更新: 蚂蚁完成一次路径遍历后,会根据路径的长度更新路径上的信息素浓度。路径越短,信息素浓度增加越多。
- 信息素更新: 信息素会随着时间挥发,挥发速度由参数控制。
- 迭代: 循环执行步骤 3-5,直到达到最大迭代次数或满足其他终止条件。
实现过程
import numpy as np
import matplotlib.pyplot as plt
import matplotlib
import math
import random
matplotlib.rcParams['font.family'] = 'STSong'
city_name = []
city_condition = []
with open('30城市的坐标.txt', 'r', encoding='UTF-8') as f:
lines = f.readlines()
for line in lines:
line = line.split('
')[0]
line = line.split(',')
city_name.append(line[0])
city_condition.append([float(line[1]), float(line[2])])
city_condition = np.array(city_condition)
# Distance距离矩阵
city_count = len(city_name)
Distance = np.zeros((city_count, city_count))
for i in range(city_count):
for j in range(city_count):
if i != j:
Distance[i][j] = math.sqrt((city_condition[i][0] - city_condition[j][0]) ** 2 + (city_condition[i][1] - city_condition[j][1]) ** 2)
else:
Distance[i][j] = 100000
# 蚂蚁数量
AntCount = 200
# 城市数量
city_count = len(city_name)
# 信息素
alpha = 1
beta = 2
rho = 0.1
iter = 0
MAX_iter = 200
Q = 1
# 初始信息素矩阵
pheromonetable = np.ones((city_count, city_count))
# 候选集列表
candidate = np.zeros((AntCount, city_count)).astype(int)
# path_best存放的是每次迭代后的最优路径
path_best = np.zeros((MAX_iter, city_count))
# 存放每次迭代的最优距离
distance_best = np.zeros(MAX_iter)
# 倒数矩阵
etable = 1.0 / Distance
while iter < MAX_iter:
# first:蚂蚁初始点选择
if AntCount <= city_count:
candidate[:, 0] = np.random.permutation(range(city_count))[:AntCount]
else:
m = AntCount - city_count
n = 2
candidate[:city_count, 0] = np.random.permutation(range(city_count))[:]
while m > city_count:
candidate[city_count * (n - 1):city_count * n, 0] = np.random.permutation(range(city_count))[:]
m = m - city_count
n = n + 1
candidate[city_count * (n - 1):AntCount, 0] = np.random.permutation(range(city_count))[:m]
length = np.zeros(AntCount)
# second:选择下一个城市选择
for i in range(AntCount):
# 移除已经访问的第一个元素
unvisit = list(range(city_count))
visit = candidate[i, 0]
unvisit.remove(visit)
for j in range(1, city_count):
protrans = np.zeros(len(unvisit))
# 下一城市的概率函数
for k in range(len(unvisit)):
protrans[k] = np.power(pheromonetable[visit][unvisit[k]], alpha) * np.power(
etable[visit][unvisit[k]], (alpha + 1))
# 累计概率,轮盘赌选择
cumsumprobtrans = (protrans / sum(protrans)).cumsum()
cumsumprobtrans -= np.random.rand()
k = unvisit[list(cumsumprobtrans > 0).index(True)]
candidate[i, j] = k
unvisit.remove(k)
length[i] += Distance[visit][k]
visit = k
length[i] += Distance[visit][candidate[i, 0]]
# 更新路径等参数
if iter == 0:
distance_best[iter] = length.min()
path_best[iter] = candidate[length.argmin()].copy()
else:
if length.min() > distance_best[iter - 1]:
distance_best[iter] = distance_best[iter - 1]
path_best[iter] = path_best[iter - 1].copy()
else:
distance_best[iter] = length.min()
path_best[iter] = candidate[length.argmin()].copy()
# 信息素的更新
changepheromonetable = np.zeros((city_count, city_count))
for i in range(AntCount):
for j in range(city_count - 1):
changepheromonetable[candidate[i, j]][candidate[i][j + 1]] += Q / length[i]
changepheromonetable[candidate[i, j + 1]][candidate[i, 0]] += Q / length[i]
pheromonetable = (1 - rho) * pheromonetable + changepheromonetable
iter += 1
print('蚁群算法的最优路径', path_best[-1] + 1)
print('迭代', MAX_iter, '次后', '蚁群算法求得最优解', distance_best[-1])
# 路线图绘制
fig = plt.figure()
plt.title('Best roadmap')
x = []
y = []
path = []
for i in range(len(path_best[-1])):
x.append(city_condition[int(path_best[-1][i])][0])
y.append(city_condition[int(path_best[-1][i])][1])
path.append(int(path_best[-1][i]) + 1)
x.append(x[0])
y.append(y[0])
path.append(path[0])
for i in range(len(x)):
plt.annotate(path[i], xy=(x[i], y[i]), xytext=(x[i] + 0.3, y[i] + 0.3))
plt.plot(x, y, '-o')
# 距离迭代图
fig = plt.figure()
plt.title('Distance iteration graph')
plt.plot(range(1, len(distance_best) + 1), distance_best)
plt.xlabel('Number of iterations')
plt.ylabel('Distance value')
plt.show()
实验结果
通过运行代码,可以得到最优路径和距离迭代图,展示了蚁群算法的运行过程和优化效果。
总结
蚁群算法是一种简单有效解决TSP问题的算法,具有较好的全局搜索能力。通过模拟蚂蚁的行为,可以找到连接多个城市的近似最优路径。
进一步优化
- 可以尝试使用不同的参数设置,找到最佳的算法参数。
- 可以使用其他启发式算法与蚁群算法结合,进一步提高算法的效率。
- 可以将蚁群算法应用于实际的物流配送、路线规划等问题,解决实际应用中的问题。
原文地址: https://www.cveoy.top/t/topic/nxTP 著作权归作者所有。请勿转载和采集!