问题背景
经典的旅行商(TSP)问题,一个旅行商人要从家出发分别到周围N座城市售卖货物,每座城市经过一次,且每座城市都要去一次。已知家和城市在地图上的坐标,求一条遍历的最短路径。
解决思路
这是经典的汉密尔顿回路最优解问题,作者采用如下图所示的方法来求解:
算例分析
现在有以下30个点,坐标对应于图上:
现要求画出一条遍历所有点的线路使得总路径最短。
解决方法
先将所有点按照录入顺序依次连接,观察:
我们可以发现有很多“X”型的交叉点,十分影响长度,因此利用上述图片的方法主要处理掉图中的交叉点,从而达到优化。
去除交叉点的方式为将交叉点切片中的序列顺序颠倒,比如在“1 2 3 4 5 6 7 8 9 10…”中“2 3”和“6 7”两条线出现交叉,那么将序列改为“1 2 6 5 4 3 7 8 9 10”,这样仅仅优化了“2 3”和“6 7”中的长度,并未改变其它长度。这样再对所有的两段线组合进行遍历优化,以此为一次哈密尔顿循环,重复上述循环有限次,既可以得到一个相对最优解。最后得到的结果为:
代码
使用Python代码如下:
import xlrd
import math
import matplotlib.pyplot as plt
import numpy as np
import random
workbook=xlrd.open_workbook(r'test.xlsx') #定义相应的点链和其对应的参数
sheet1=workbook.sheet_by_index(0)
positionXList=[]
positionYList=[]
position=[]
for i in range(0,30):
x=sheet1.cell(i,0).value
y=sheet1.cell<