本文使用蚁群算法解决旅行商问题 (TSP),旨在找到连接多个城市的最短路线。

算法原理

蚁群算法模拟了蚂蚁在寻找食物时,通过信息素的传递来互相引导,最终找到最短路径的行为。算法流程如下:

  1. 读取城市坐标信息: 首先,需要读取所有城市的坐标信息,并计算城市之间的距离,构建距离矩阵。
  2. 设置参数: 设置一些参数,例如蚂蚁数量、信息素重要程度因子、启发函数重要程度因子等,这些参数会影响算法的效率和精度。
  3. 蚂蚁路径选择: 每个蚂蚁从一个随机城市出发,根据信息素浓度和城市间的距离,选择下一个要访问的城市。
  4. 路径更新: 蚂蚁完成一次路径遍历后,会根据路径的长度更新路径上的信息素浓度。路径越短,信息素浓度增加越多。
  5. 信息素更新: 信息素会随着时间挥发,挥发速度由参数控制。
  6. 迭代: 循环执行步骤 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问题的算法,具有较好的全局搜索能力。通过模拟蚂蚁的行为,可以找到连接多个城市的近似最优路径。

进一步优化

  • 可以尝试使用不同的参数设置,找到最佳的算法参数。
  • 可以使用其他启发式算法与蚁群算法结合,进一步提高算法的效率。
  • 可以将蚁群算法应用于实际的物流配送、路线规划等问题,解决实际应用中的问题。
蚁群算法解决旅行商问题 (TSP) - 优化路线,提高效率

原文地址: https://www.cveoy.top/t/topic/nxTP 著作权归作者所有。请勿转载和采集!

免费AI点我,无需注册和登录