具有方向约束的旅行推销员

时间:2016-08-28 20:19:30

标签: python numpy linear-algebra graph-algorithm traveling-salesman

我试图按路径顺序排列3D坐标数组。样本:

points = np.array([[ 0.81127451,  0.22794118,  0.52009804],
                   [ 0.62986425,  0.4546003 ,  0.12971342],
                   [ 0.50666667,  0.41137255,  0.65215686],
                   [ 0.79526144,  0.58186275,  0.04738562],
                   [ 0.55163399,  0.49803922,  0.24117647],
                   [ 0.47385621,  0.64084967,  0.10653595]])

这些点是随机顺序,但总是有一条通过它们的路径。我使用LKH solver(Helsgaun 2009)找到了适应旅行商问题(TSP)的路径。它涉及两个修改:

  • 在原点处或附近添加一个点。这在我到目前为止所处理的每个实例中找到了最佳起点。这是我的想法,我没有其他依据。
  • 从每个点添加距离为零的点。这使得求解器找到到路径另一端的路径。这个想法来自this SO question

请注意,TSP不涉及位置,只涉及节点之间的距离。因此,求解器确实知道' (或关心)我在3D工作。我只是像这样制作一个距离矩阵:

import numpy as np
from scipy.spatial.distance import pdist, squareform

# Add a point near the origin.
points = np.vstack([[[0.25, 0, 0.5]], points])
dists = squareform(pdist(points, 'euclidean'))

# Normalize to int16s because the solver likes it.
d = 32767 * dists / np.sqrt(3)
d = d.astype(np.int16)

# Add a point that is zero units from every other point.
row, col = d.shape
d = np.insert(d, row, 0, axis=0)
d = np.insert(d, col, 0, axis=1)

我把它传递给my fork of pytsp,它将它传递给LKH求解器。一切都很好......除非路径穿过自己。 TSP解决方案不能有闭环,所以我总是在右边显示开环:

Travelling salesman paths

请注意,这是我的情况的类似2D版本。另请注意,即使沿着“直线”,这些点也不完全对齐。位。

所以我的问题是:我怎样才能帮助求解者尽可能保留路径的方向?我有两个结构不合理的想法,但到目前为止还无法实现任何东西:

  • 使用其他指标而不是L2。但我不认为这可行,因为在一个特定的交叉点,“错误”并没有什么不同之处。点。它的错误取决于前一点。我们还不知道前一点是什么(这是我们想要弄清楚的)。所以我认为这不好。
  • 评估每组三个点的局部共线性(例如,使用每个三元组的行列式)。调制本地3D斜率' (不确定我的意思)这个共线性系数。给每个点指定另一个表示此局部对齐的维度。现在规范将反映出局部对齐,并且(希望)粗略的共线事物将会加入。

我已将这些文件放在Dropbox上:

感谢您的阅读;任何想法都赞赏。

参考

ķ。 Helsgaun,一般用于Lin-Kernighan TSP启发式的k-opt子手机。数学规划计算,2009,doi: 10.1007/s12532-009-0004-6

1 个答案:

答案 0 :(得分:1)

根据pytsp的文档判断,距离矩阵不必是对称的。这意味着您可以修改L2规范,将首选方向的信息合并到该矩阵中。假设您对某些点(i,j)有一个首选方向,那么对于这些​​点中的每一点,您可以将dists[i,j]除以(1+a)并将dists[j,i]乘以(1+a)使这个方向更有利。这意味着如果您的算法确定找到全局最优,那么您可以通过a足够大来强制它满足您的首选方向。

另外,我不确定在距离矩阵取自3D数据的解决方案中不可能有闭环。在我看来,“没有闭环”#39;是(二维不等式的)特定于2D的结果。