禁忌搜索算法(tabu search)及Python实现

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

 一、禁忌搜索算法

        采用邻域选优的搜索方法,为了逃离局部最优解,算法必须能够接受劣解,也就是每一次得到的解不一定优于原来的解。但是,一旦接受了劣解,算法迭代即可能陷入循环。为了避免循环,算法将最近接受的一些移动放在禁忌表中,在以后的迭代中加以禁止。即只有不再禁忌表中的较好解(可能比当前解差)才能接受作为下一代迭代的初始解。随着迭代的进行,禁忌表不断更新,经过一定的迭代次数后,最早进入禁忌表的移动就从禁忌表中解禁退出。

二、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
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

oyoli

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值