按总成本计算的哈密顿路径

问题描述

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

因此,我采用了适用于少数节点的蛮力解决方案,但无法计算我拥有的 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,109.91947970385735,143.67555771554203],[735.0398352819755,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 限制)。路线的总长度取决于游戏的持续时间,因此需要按总成本过滤。

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

解决方法

我不知道你描述的这种算法。 因此,您没有附加您的蛮力解决方案 - 很多时候您可以使用多种方法来显着减少计算时间。使用分支“动态编程”的方法,特别是递归算法的“记忆”。

Added a link for a great video that demonstrates the concept

,

您可能想看看: https://github.com/potassco/guide/releases/tag/v2.2.0 章节:6.2。 它是 TSP 问题的逻辑描述,可以直接由 ASP 求解器(如 clingo)解决。

使用这些工具 (https://potassco.org/),您可以轻松地将目标函数修改为您需要的任何内容,并且它们非常擅长解决 NP 完全问题。