智能优化算法求解旅行商问题常用的三种邻域算子(附Python程序)

1. 旅行商问题

旅行商问题(Traveling Salesman Problem,TSP)是数学和计算机科学领域中的一个经典问题,它属于组合优化中的NP难问题。经典的TSP可以描述为一个商品推销员要从一个城市出发,经过所有其他城市各一次后,再回到出发地,如何选择行进路线以使得总的行程最短。从图论的角度来看,该问题实质是在一个带权完全无向图中,找一个权值最小的Hamilton回路。

如上图所示可以认为是一个最短回路,在TSP中最短回路有两个特点:(1)相邻点相连;(2)没有交叉线。

2.解的表示

旅行商问题的求解过程中,解的编码表示方式是关键之一,因为它直接关系到算法如何进行优化和搜索。在TSP求解中解的编码的表示形式包括:二进制表示、路径表示、邻接表示、序数表示和矩阵表示等,但最常用的是路径表示方法,这里讲一下路径表示法。

路径表示是最直观的一种编码方式。在这种方式中,一个解被编码为一个包含所有城市编号的序列,这个序列指明了访问城市的次序。例如,对于一个含有7个城市的TSP问题,如果路径为5-2-3-6-4-1,则相应的路径编码为(5,2,3,6,1)。意思就是用数据的下标来对数据位置进行标记。

3.三种邻域搜索算子原理

大多数智能优化算法求解TSP都是通过邻域搜索方式进行离散表示的,同时邻域搜索方式是提高寻优效率和解的质量的关键环节。接下来,介绍一下论文中常用的三种邻域算子。

3.1 交换算子

交换算子(Swap)是指给定一个城市序列数组,从数组中随机选一个数为第一个城市,然后再选另一个点为第二个城市,最后将这两个城市进行位置交换,如下图所示,将3和5进行交换:

3.2 插入算子

插入算子(Insertion)是从数组中选择两个城市点,将第一个城市插入到第二个城市的前面或后面,如下图所示,将3插入到5后面:

3.3 反转算子

反转算子(Reversion)是指随机选一个城市为起点,再选另一个城市为终点,将从起点到终点的数组片段进行逆序排列,以此来通过两条边来消除交叉路线,如下图所示,3和5之间城市逆序排列:

总结一下:其实最好用的是反转算子、其次是插入算子、最后是交换算子。

4. 三种邻域搜索算子Python实现

4.1 交换算子实现

def Swap(route):
    n = len(route)
    i, j = sample(range(n), 2)  # 在 [0,n) 产生 2个不相等的随机整数 i,j
    route1 = route.copy()
    route1[i], route1[j] = route[j], route[i]
    return route1

4.2 插入算子实现

def Insertion(route):
    """把第二个索引数字插到第一个索引后边"""
    n = len(route)
    i, j = sample(range(n), 2)
    # s = min([i, j])
    # k = max([i, j])
    gap = route[j]
    data = np.delete(route, [j])
    route1 = np.insert(data, i, gap)  # 是将gap插入到data列表中第s+1索引上
    return route1

4.3 反转算子

def Reversion(route):
    """随机选两个索引下标,把两个索引之间(含两个索引)的数组反转"""
    n = len(route)
    route1 = route.copy()
    i, j = sample(range(n), 2)
    s = min([i, j])
    k = max([i, j])
    gap = route[s:k+1]
    gap1 = gap[::-1]  # 片段反转
    route1[s:k+1] = gap1
    return route1

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值