带有重复节点的旅行推销员&动态权重

时间:2011-03-12 04:37:27

标签: algorithm graph-theory combinatorics traveling-salesman

鉴于城市列表和每个城市之间的飞行成本,我试图找到访问所有这些城市的最便宜的行程。我目前正在使用MATLAB solution找到最便宜的路线,但我现在想修改算法以允许以下内容:

  1. 重复节点 - 应该允许重复节点,因为通过枢纽城市旅行通常会导致更便宜的路线
  2. 动态边缘权重 - 返程/往返航班与两个等效单程航班的成本不同(通常较低)
  3. 目前,我无视航班日期问题,并假设可以从任何城市前往任何其他城市。

    有没有人有任何想法如何解决这个问题?我的第一个想法是使用像GAACO这样的进化优化方法来解决第2点,并根据行程中是否包含返程/往返航班来评估目标函数时调整边权重,但也许其他人有更好的主意。

    (注意:我使用的是MATLAB,但我并不是专门寻找编码解决方案,更多的是关于可以使用哪种算法的高级想法。)


    编辑 - 在考虑了这个之后,允许“重复节点”似乎过于松散了约束。我们可以进一步约束问题,以便尽管可以重复访问节点,但每个有向边只能访问一次。忽略任何不止一次包含同一航班的行程似乎是合理的。

6 个答案:

答案 0 :(得分:5)

我自己没有测试过;但是,我read实施Simulated Annealing来解决TSP(或其变体)可以产生出色的结果。这里的关键点是模拟退火非常易于实现并且需要最少的调整,而近似算法可能需要更长的时间来实现,并且可能更容易出错。 Skiena还有page致力于特定的TSP求解器。

答案 1 :(得分:0)

如果您希望算法产生的解决方案的成本在最佳值的3/2之内,那么您需要Christofides算法。 ACO和GA没有保证成本。

答案 2 :(得分:0)

首先,问题集中的近似城市数量是多少? (最多100个?超过100个?) 我对GA(不是ACO)有相当多的经验,就像墓志铭所说,它有一点赌博方面。对于某些输入,它可能会停留在一个非常低效的解决方案。因此,我过去所做的是使用GA作为第一选项,将答案与某些下限进行比较,如果这似乎是“偏离”,则运行第二种(通常效率较低)算法。 / p>

当然,我使用了很多非标准的术语,所以让我们确保我们同意他们在这种背景下会是什么:

  1. 下限 - 当然,在这种情况下,MST将是下限。
  2. “Way Off” - 如果三角不等式成立,则上限为UB = 2 * MST。在这种情况下,一个很好的“出路”就是2 * UB。
  3. 第二种算法 - 在这种情况下,基于线性规划的方法和Christofides都是不错的选择。

答案 3 :(得分:0)

解决TSP是一个NP难问题,因为它消除了子圈的约束,如果你删除其中任何一个(对于你的枢纽城市),你只是让问题更容易。

但请注意:TSP与关联问题有相似之处,意味着您可以获得无效的行程:

城市:纽约,波士顿,达拉斯,多伦多

路径:

波士顿 - 纽约 纽约 - 波士顿


达拉斯 - 多伦多 多伦多 - 达拉斯

这显然是错误的,因为我们没有穿过所有城市。

子循环消除约束仅用于此目的。包括“枢纽城市”听起来像你需要增加重点,并在通量问题和tsp问题之间进行混合。听起来很难但第一次尝试可能是:消除相对于枢纽城市的子循环限制(并留下所有其他城市)。然后,您可以将为中心城市获得的子循环链接在一起。

祝你好运

答案 4 :(得分:0)

如果您将问题限制为往返(即销售员只能购买往返机票),那么它可以用无向图表示,问题归结为找到minimum spanning tree,可以有效地完成。

在一般情况下,我不知道使用高效算法的聪明方法; GA或类似的可能是一个很好的方式。

答案 5 :(得分:0)

您想要一个接近最优的解决方案,还是想要最佳解决方案?

对于最佳解决方案,仍然有很好的蛮力。由于要求1涉及重复节点,您必须确保搜索广度优先,而不是首先搜索。否则你最终会陷入无限循环。您可以慢慢删除超过当前最小值的所有路由,直到所有路由都耗尽并找到最小路由。