最大最小蚁群算法求解TSP商旅问题


最大最小蚁群算法求解TSP商旅问题


算法要点

  1. 每条路径上的信息素浓度都有一个最大最小值,最小信息素增加对于更优解探索的可能性,最大信息素浓度保证经验对于蚁群的启发性。

  2. 对于蚂蚁的下一次选择使用轮盘赌的方式进行选择,每条路径的权重是根据启发公式进行计算,合适的alpha beta能够加速算法的收敛,这是经验性的参数

  3. 蚂蚁的数量一般不宜过多,一般与城市数量差不多就可以了。经过多次迭代可以发现,当前的最优可行解就是信息素最大的那条路径。

  4. 挥发系数的确定:在每轮迭代过程中,每一次迭代完毕后,下一次的路径的信息素的浓度会随着时间挥发。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<
  • 8
    点赞
  • 57
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值