最大最小蚁群算法求解TSP商旅问题
算法要点
每条路径上的信息素浓度都有一个最大最小值,最小信息素增加对于更优解探索的可能性,最大信息素浓度保证经验对于蚁群的启发性。
对于蚂蚁的下一次选择使用轮盘赌的方式进行选择,每条路径的权重是根据启发公式进行计算,合适的alpha beta能够加速算法的收敛,这是经验性的参数
蚂蚁的数量一般不宜过多,一般与城市数量差不多就可以了。经过多次迭代可以发现,当前的最优可行解就是信息素最大的那条路径。
挥发系数的确定:在每轮迭代过程中,每一次迭代完毕后,下一次的路径的信息素的浓度会随着时间挥发。smell_new=smell_old*挥发系数+smell_added。在计算的同时要保证 smell_new在[smell_lowbound,smell_upbound]范围内,即信息素的浓度有边界(参见第一条)。
结论:以上条件能够使得算法具有很快的收敛速度,一般对于50个点的TSP问题,在200轮迭代后就能达到最优解,在图中可以看到,TSP的最优可行解是一个圈,不会 产生交叉。
代码:
'''
蚁群算法求解商旅问题
author: sunqi
notice:使用前请先安装ffmpeg库
algrithm: MMAS
'''
from matplotlib import pyplot as plt
from matplotlib.animation import FuncAnimation
import numpy as np
from matplotlib import collections as mc
from matplotlib.ticker import MultipleLocator
point_num = 30 # 商旅问题的点数
rou = 0.05 # 蚁群算法中的蒸发系数
alpha = 0.8 # 有关于信息素的权重系数
beta = 2 # 有关于距离的权重系数
MaxIterTimes = 10000; # 允许的最大迭代次数
Q = 15 # 单个蚂蚁所携带的信息素的总量,用于走完以后更新每条走过的边的信息素 delta=Q/L L:路径长度
anti_num = 50; # 蚂蚁的数量
tao_min = 0.1/point_num
tao_max = 1
iter_count = 0 # 计数器计算迭代次数
def generate_point(num):
'''
产生随机的点x,y坐标 个数num 坐标限制(0~100, 0~100)
'''
# 产生随机数,xy坐标
x, y = 100 * np.random.rand(2, num)
# ax1.scatter(x, y, marker='o')
# ax2.scatter(x, y)
return x, y
def point_matrix(x, y):
'''
处理产生的x,y坐标向量
返回:
point点对Array shape: pointnum,2
distance_matrix : distance from point_i to point_j
'''
distance_matrix = np.zeros((point_num, point_num))
point_mat = np.c_[x, y]
# print(point_mat.shape)
for i in range(point_num):
for<