一、禁忌搜索算法
采用邻域选优的搜索方法,为了逃离局部最优解,算法必须能够接受劣解,也就是每一次得到的解不一定优于原来的解。但是,一旦接受了劣解,算法迭代即可能陷入循环。为了避免循环,算法将最近接受的一些移动放在禁忌表中,在以后的迭代中加以禁止。即只有不再禁忌表中的较好解(可能比当前解差)才能接受作为下一代迭代的初始解。随着迭代的进行,禁忌表不断更新,经过一定的迭代次数后,最早进入禁忌表的移动就从禁忌表中解禁退出。
二、Python实现
import matplotlib.pyplot as plt
import random
import time
Fee_data = [[0,382,352,800,666],
[382,0,892,158,235],
[253,780,0,678,111],
[862,123,768,0,255],
[666,1080,123,255,0]]
city_count = len(Fee_data[0]) # 城市数
origin = 1 # 起点、终点城市
remain_cities = [i for i in range(city_count)]
remain_cities.remove(origin) # 迭代过程中变动的城市
remian_count = city_count - 1
def route_mile_cost(route):
"""
:param route:运行路线
"""
mile_cost = 0.0
mile_cost += Fee_data[origin-1][route[0]-1]
for i in range(remian_count-1):
mile_cost += Fee_data[route[i]-1][route[i+1]-1]
mile_cost += Fee_data[route[-1]-1][origin-1]
return mile_cost
def random_initial_route(remain_cities):
"""
随机生成初始路径
"""
initial_route = remain_cities[:]
random.shuffle(initial_route)
mile_cost = route_mile_cost
return initial_route,mile_cost
improve_count = 20 # 改良次数
def improve_circle(remain_cities):
"""
改良圈算法生成初始路径
"""
initial_route = remain_cities[:]
random.shuffle(initial_route)
cost0 = route_mile_cost(initial_route)
route = [1] + initial_route + [1]
label = list(i for i in range(1,len(remain_cities)))
j = 0
while j < improve_count:
new_route = route[:]
index0, index1 = rand

本文介绍了禁忌搜索算法的概念,以及如何用Python实现该算法,包括随机初始路径、改良圈算法、贪心算法和禁忌表的应用,通过示例展示了算法在求解最优化问题上的过程和结果。
4091

被折叠的 条评论
为什么被折叠?



