之前笔者曾经简要介绍过模拟退火算法求解 TSP 问题的代码示例:
模拟退火算法求解 TSP 问题的代码示例
本文以 TSP 问题为例,通过具体代码,说明禁忌搜索算法的迭代过程。
禁忌搜索算法流程图
TSP 问题的代码示例
关于 TSP 问题的介绍从略,算法模块的代码(algorithm.py)如下,注释中已说明算法的迭代过程:
from datetime import datetime
from typing import Tuple, List, Set
import random
import pandas as pd
class TabuSearch(object):
"""
禁忌搜索
"""
def __init__(self, num_point: int, mat_dist: List[List[float]],
num_iter: int = 100, len_tabu: int = 10, size_neighbour: int = 50):
"""
禁忌搜索,数据初始化
:param num_point: TSP 节点数量
:param mat_dist: 距离矩阵
:param num_iter: 迭代次数
:param len_tabu: 禁忌表长度
:param size_neighbour: 邻域搜索的次数
"""
# 问题参数
self.num_point = num_point
self.mat_dist = mat_dist
# 算法参数
self.num_iter = num_iter
self.len_tabu = len_tabu
self.size_neighbour = size_neighbour
# 结果
self.route_opt, self.distance_opt = [], None # 最优路径、最优路径距离
self.route_res, self.distance_res = [], None # 结果路径、结果路径距离
def run(self):
"""
算法运行
:return: 无
"""
dts = datetime.now()
random.seed(1024)
# 初始解
route = self._init_solution()
obj = self._get_distance(route=route)
self.route_opt, self.distance_opt = route, obj
print("初始解: {}".format(self.route_opt))
print("初始解的路径距离: {}".format(self.distance_opt), '\n')
# 禁忌表
list_tabu = []
# loop 1: 迭代次数 NG
for i in range(self.num_iter