【问题标题】:Suggest an algorithm (graph - possibly NP-Complete)建议一个算法(图 - 可能是 NP-Complete)
【发布时间】:2012-08-14 02:46:18
【问题描述】:

有一个城镇网络,由各种整数长度的道路连接。

一位旅行者希望开车从一个城镇到另一个城镇。但是,他不想最小化行驶的距离;相反,他希望尽量减少旅途中的汽油费用。汽油可以在任何城市购买,但是每个城市以不同的(整数)价格供应汽油(因此为什么最短的路线不一定是最便宜的)。 1 个单位的汽油使他能够行驶 1 个单位的距离。 他的车只能在油箱里装这么多汽油,他可以选择在他所经过的每个城市购买多少单位的汽油。找出最低的汽油成本。

有人知道可以用来解决这个问题的有效算法吗?即使是这类问题的名称也会很有用,这样我就可以自己研究了!显然,它与最短路径问题并不完全相同。任何其他提示表示赞赏!

编辑-我遇到的实际问题表明将有

【问题讨论】:

  • 我觉得有点像背包问题。让我们看看其他人怎么说。
  • 我可以建议您将标题更改为“旅行推销员变体”之类的。目前的标题有点不伦不类。
  • 这既不是背包问题也不是旅行商问题:他想从 A 到 B,而不是到处。这是一个特定的图形问题,没有名字 afaik。
  • 我认为这实际上是两个问题的变体的组合。每个问题都会以某种方式影响另一个问题。
  • 同意niomaster和dough,不过,这个标题不如它可能的具体

标签: algorithm networking graph minimum np-complete


【解决方案1】:

您也可以将其表述为整数线性规划 (ILP) 问题。优点是这个任务有许多现成的求解器,复杂性不会像罐子大小的彼得斯解决方案那样快速增长。

在这个特定问题中的变量将是在任何一个城镇购买的汽油量、沿途任何城镇的汽车油箱量以及实际使用的道路。 约束条件必须保证汽车在每条道路上消耗必要的燃料,并且在任何城镇的燃料量不低于 0 或超过 MAX 个单位,并且道路构成从 A 到 B 的路径。 目标是购买燃料的总成本。

整个事情可能看起来很可怕(ILP 公式经常这样做),但这并不意味着它无法在合理的时间内解决。

【讨论】:

    【解决方案2】:

    这可以使用遗传算法进行适当优化。遗传算法在一些复杂的问题上击败了人类: http://en.wikipedia.org/wiki/Genetic_algorithm

    遗传算法的要点是:

    1. 提出候选解决方案的排名函数
    2. 想出一组独特的候选解决方案。初始化它 有一些随机产生的可能性。也许 10 或 100 或 1000...
    3. 从池中复制一个候选解并以某种方式对其进行扰动 - 添加一个城镇,删除一个城镇,添加两个城镇,等等。这可能会改善 或使事情变得更糟-您的排名功能将帮助您分辨。哪一个 你选一个?通常,你会选择最好的,但偶尔, 你故意选择一个不是为了避免卡在一个 局部最优。
    4. 新解决方案是否已经排名?如果是,请将其丢弃并转到
      1. 如果没有,请继续...
    5. 将受干扰的候选者添加回池中,并在其新计算的排名下
    6. 继续这样做(从 #3 开始重复),直到您觉得自己已经完成了足够长的时间
    7. 最后,选择排名最高的答案。它可能不是 最佳,但应该还不错。

    【讨论】:

      【解决方案3】:

      如果您愿意增加图表的大小,可以直接使用Djikstra's algorithm 解决此问题。

      假设您的油箱可以容纳 0 到 9 个单位的汽油。

      这个想法是将每个城镇分成 10 个节点,城镇 t 的节点 x 表示在城镇 t,油箱中有 x 个单位的汽油。

      然后,您可以在此展开图上构建零成本边以表示不同城镇之间的旅行(在此过程中用尽汽油,因此如果距离为 3,您将从 8 级节点转到 5 级节点),并且更多的边表示在每个城镇用一单位汽油加满油箱(费用取决于城镇)。

      然后应用 Djikstra 应该给出从开始到结束成本最低的路径。

      【讨论】:

      • 聪明 - 我喜欢这个!虽然如果你有一个大坦克,它确实会使图表更大!
      【解决方案4】:

      我会试试这个:

      1. 找到从起点到终点的最短路径。 Dijkstra 的算法适用于此。
      2. 找出这条路线的最低汽油成本。我不知道有什么现成的算法可以解决这个问题,但除非沿途有许多城市,否则即使穷举搜索也不应该在计算上不可行。
      3. 寻找下一条最短路线...

      定义精确的停止标准有点困难,最好是在新测试路线的最低成本大于已测试路线的最低成本时停止。

      所以,使用 2 种算法,一种用于问题的每个部分。

      【讨论】:

      • 这也是一个有效的解决方案,但不幸的是,速度很慢。
      • 我认为一旦最低成本再次开始增加,您就不能停止,例如,最便宜的路线可能是最长的,而第二便宜的可能是最短的......为了确保拥有最便宜的,您必须检查每条路线:/
      【解决方案5】:

      我认为您可以通过动态编程来解决这个问题。对于每个节点,您保存一组汽油成本元组和使用该汽油的路径长度,其中包含最佳解决方案。您循环遍历所有节点的每一步,如果有一个节点可以去,并且已经有解决方案,那么您循环遍历所有节点,您可以使用解决方案去。您选择最低成本,但请注意:您必须考虑当前节点中的汽油成本。阵列中所有高于当前节点成本的成本,都可以在当前节点购买。请注意,应该重新计算已经有解决方案的节点,因为您可以从那里去的节点可能会改变。您从结束节点开始,将解决方案设置为一个空数组(或一个成本和长度为 0 的条目)。最终的解决方案是在开始时采取解决方案并将每个成本*长度相加。

      【讨论】:

      • 我不太明白它是如何工作的,但明天我不那么累了再看看!
      【解决方案6】:

      我认为问题是:汽油是否有可能使潜在的旅行商问题在计算上更可行?如果不是,则没有有效的非逼近算法。

      当然,您可以为边缘情况找到有效的解决方案,并且在汽油条件下可能会有更多的边缘情况,例如,总是先考虑这个城市,因为汽油太便宜了。

      【讨论】:

      • 实际上同意@niomaster,比我最初想象的更远离旅行推销员问题
      • 但总的来说,旅行商问题通过将所有汽油价格设置为相同的值并让汽车的油箱足够大以完成整个旅程而无需额外加油,就可以轻松解决这个问题,因此这个问题通常是 NP 难的。
      • +1 用于使用坦克大小来降低计算复杂性 :) 但是,额外的区别是他不想访问所有城市
      • 抱歉,看来我误读了问题陈述。
      猜你喜欢
      • 2014-01-27
      • 2014-01-27
      • 2020-10-16
      • 2011-03-08
      • 2012-11-30
      • 1970-01-01
      • 1970-01-01
      • 2011-04-18
      • 2012-01-06
      相关资源
      最近更新 更多