总成本的哈密顿路径



我正试图通过一系列所需的总成本或总边长来计算哈密顿路径,即访问图中每个节点一次的路径。Traveling Salesman问题有各种算法可以计算最短路径,但我还没有找到一个按所需总成本计算的解决方案。

因此,我采用了一种适用于少数节点的暴力解决方案,但对于我拥有的50个节点来说,这是不可能计算的。

import itertools
import numpy as np
from numpy import std
dist_matrix = np.array([[0.0,484.5434935135364,632.0078925008858,735.0398352819755,493.16148400859885],[484.5434935135364,0.0,425.69916384832044,525.3371082385308,322.51794796977657],[632.0078925008858,425.69916384832044,0.0,109.91947970385735,143.67555771554203],[735.0398352819755,525.3371082385308,109.91947970385735,0.0,252.8369873480788],[493.16148400859885,322.51794796977657,143.67555771554203,252.8369873480788,0.0]])
size=len(dist_matrix)
tours = []
for tour in itertools.permutations(list(range(0,size))):
distances = [dist_matrix[i][j] for i, j in list(zip(tour, tour[1:]))]
length = sum(distances)
tours.append([tour, distances, length, std(distances)])

注意,我还返回了标准偏差,这样我就可以根据所需的行程长度和最低标准偏差进行过滤(以获得节点之间的相等距离(,例如:

best_tours = [i for i in tours if int(i[2]) in range(1800, 2100) and i[3] < 120]

用例是一个城市游戏,我想为参与者提供一些平等的个性化路线,以避免他们混在一起(Covid-restrictions(。路线的总长度取决于游戏的持续时间,因此需要按总成本进行过滤。

是否有任何算法或解决方案允许这种类型的计算,或者是否有任何可能性提高我的代码的效率,使其在合理的时间内为50个节点工作?

我不知道你描述的这样一个算法。因此,您没有附加暴力解决方案——很多时候,您可以使用几种方法来显著减少计算时间。使用来自分支"的方法;"动态编程";尤其是";记忆化";用于递归算法。

添加了一个伟大的视频链接,演示的概念

您可能想看看:https://github.com/potassco/guide/releases/tag/v2.2.0第6.2章。它是TSP问题的逻辑描述,可以通过像clingo这样的ASP求解器直接求解。

使用这些工具(https://potassco.org/)你可以很容易地将你的目标函数修改为你需要的任何东西,他们非常擅长解决NP完全问题。

最新更新