【启发式算法】Python实现禁忌搜索算法求解TSP问题

禁忌搜索

算法参数

  • 禁忌表:tabu
  • 禁忌长度:tabulen
  • 特赦值:spe
  • 迭代次数:Times

提醒:在对列表进行操作时,注意python的赋值、浅拷贝、深拷贝

算法效果分析

  1. 禁忌长度越大,邻域搜索时间变短(因为都被禁了),程序运行时间越短,结果的可信度相对较低
  2. 特赦值越大,优于全局最优解的新解容易被特赦(容易被接受),可能会导致陷入局部最优解;而特赦值过小可能会失去接受最优解的机会

算法步骤

  1. 数据初始化:计算距离矩阵;随机得到初始解(起点为0城市);编写距离计算函数;初始化第一代的种群
  2. 禁忌搜索算法的核心:算法迭代Times次,每次使用双重循环遍历所有邻域(即所有可行解),本文采用的策略是顺序遍历除起点以外的所有城市,判断合法性,两两交换。
    2.1. 通过邻域移动(即两两交换策略)得到新解并计算新解的路径距离
    2.2. 如果新解优于全局最优解,且其禁忌长度小于设定的特赦值,则记录交换城市的下标、接收新解并更新全局最优解
    2.3. 如果新解只优于邻域中的最优解,且禁忌长度为0(不在禁忌表中),则记录交换城市的下标、接受新解并更新邻域中的最优解
  3. 邻域遍历完成之后,更新当前解、更新禁忌表、重置两个交换城市的禁忌长度
  4. 直到迭代Times次,算法结束
# -*- coding: utf-8 -*-
import numpy as np
import random
import math
import matplotlib.pyplot as plt
import time
import copy
"""
Desicribe:禁忌搜索解TSP问题
"""
# 原始数据
coordinates = np.array([[565.0, 575.0], [25.0, 185.0], [345.0, 750.0], [945.0, 685.0], [845.0, 655.0],
                        [880.0, 660.0], [25.0, 230.0], [525.0, 1000.0], [580.0, 1175.0], [650.0, 1130.0],
                        [1605.0, 620.0], [1220.0, 580.0], [1465.0, 200.0], [1530.0, 5.0], [845.0, 680.0],
                        [725.0, 370.0], [145.0, 665.0], [415.0, 635.0], [510.0, 875.0], [560.0, 365.0],
                        [300.0, 465.0], [520.0, 585.0], [480.0, 415.0], [835.0, 625.0
  • 1
    点赞
  • 23
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值