【问题标题】:1D travelingsalesman with constraint带约束的一维旅行推销员
【发布时间】:2016-01-06 11:23:55
【问题描述】:

我正在研究一种看似非常简单的问题的算法,但我找不到有效的算法。问题如下: 我有一个数字列表(0-50)和一个起始位置,并且必须在最小化总行驶距离的同时访问其中的每一个。有些地点要求我先去另一个地点(所以要访问 29,我必须先在 26 上取点东西)。但是,如果不生成每个选项,我似乎无法弄清楚如何做到这一点。有什么想法吗?

例如我们有以下

startLocation=25;
targetPairs=[[1,5],[7,12],[22,23]]
visitLocations=[4,6,8,2]

这意味着我们必须在 5 之前访问 1、在 12 之前访问 7 和在 23 之前访问 22。我们还必须访问位置 4、6、8 和 2。 开始的一个选择是太 1(距离 24)然后去 4(距离 3 总共 27)然后去 5(距离 1 总共 28)然后我们可以继续到 6(距离 1 总共 29)或全套 (7(30),8(31),12(35),22(45),23(46))。

从逻辑上讲,我们必须访问的地点数量限制为 50 对和 50 个地点。

【问题讨论】:

  • 对更好的名字有什么想法吗?为什么要接近投票?
  • 你能举一些例子吗?而一维意味着所有点都在Ox轴上?
  • 我添加了一个例子来说明我的意思。
  • 所以我们必须访问所有targetPairs 加上visitLocations?
  • 是的,没错。

标签: algorithm scheduling


【解决方案1】:

问题可以通过以下潜在的指数时间算法来解决,如果它是 NP-hard(我怀疑),那么你将无法做得更好(通过 "很多”,我的意思是找到一个具有多项式时间复杂度的算法——很有可能减少指数时间算法的基数)。

基本上,在状态空间中进行最佳优先搜索,其中每个状态包含两件事:当前位置和已访问位置的集合。 (不幸的是,仅仅跟踪已经访问过的城市的数量是不够的。)我们总是从这个状态空间中的每个点到最多以下 2 次移动:

  1. 向左移动到最近的可访问位置
  2. 向右移动到最近的可访问位置

这是因为总是有一个最佳解决方案,在该解决方案中,每个位置在我们第一次移动到或经过它变得可访问时都会被访问。这里的“可访问”是指一个位置的所有前辈(包括前辈的前辈等)都已经被访问过。

所有位置都已被访问过的任何状态都是目标状态。使用最佳优先搜索(可以使用优先级队列实现,或者在这种情况下,只需一个大小为 50 的数组即可),找到的第一个此类状态将对应于最佳解决方案。该算法将花费时间在需要访问的位置数量上呈指数级增长。

可以通过使用 A* 算法来加快搜索速度——也就是说,通过使用一些可接受的启发式方法来确定与给定状态之间的剩余距离的下限。在这里想出一些合理的东西应该是相当容易的——例如设 x 为最左边未访问的位置, y 为最右边,那么如果我们当前的位置 z 在它们之间,则至少需要 min(2(z-x) + y-z, z-x + 2(y-z)) 从 z 访问它们. (如果相反,z 位于所有未访问城市的左侧或右侧,则分别需要至少 y-z 或至少 z-x。)考虑前辈可以大大改善边界。

【讨论】:

  • 你有没有想过如何证明它是 NP 难的?我试过了,但并没有真正到达任何地方。
  • @PeterdeRivaz:不幸的是我不知道......我的“感觉”仅基于(相当不稳定的)概念,因为 TSP 的许多限制都是 NP 难的(例如,欧几里得或直线度量),这可能也是。 :-(
猜你喜欢
  • 2017-01-04
  • 2011-09-08
  • 1970-01-01
  • 2015-04-28
  • 2017-11-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-10-24
相关资源
最近更新 更多