【问题标题】:Find safest route in graph but prevent doubling the travel time of the fastest route?在图中找到最安全的路线,但防止最快路线的旅行时间加倍?
【发布时间】:2017-03-10 14:40:13
【问题描述】:

我的大学项目是设计我居住的城市的路线规划器,计算街道之间的最短路线。 (旅行推销员)

在 C# 中,我使用图表来存储所有街道。目前我可以使用 Dijkstra 算法在加权图中找到两条街道之间的最短路线,第一部分完成:)

我的下一个任务是计算最安全的路线。每条街道上都有一个碰撞百分比(例如,根据道路碰撞历史,发生车祸的几率为 0.4%)。我需要计算最安全的路线但是解决用户是否想尽可能走最安全的路线的问题,但与最快路线相比,他们的旅行时间不会翻倍。

谁能告诉我他们认为最好的方法是什么?

我想出的一种方法是在到达最终目的地之前走最后一条街道,删除该节点并计算一条没有该节点的路线,然后对 10 条路线执行此操作并选择累积崩溃百分比最低的一条,然而,这听起来也是最糟糕的做法。

你们能给我什么数学/逻辑/算法?用户应该输入什么?比如他们愿意慢多少的门槛? C#、java、伪代码

非常感谢大家

【问题讨论】:

  • 你可以使用crash percentage 来调整 Dijkstra 算法的权重吗?我的意思是一些修改,例如将百分比乘以重量以获得新的重量。
  • 嗯,我想这会奏效。假设两个节点之间最快的路线距离为 200。假设最安全路线之间的距离为 300,但是崩溃百分比为 0.6%,300*0.6 将使其距离为 180,使其成为首选节点。如果这就是你想出的,那对我来说很有意义
  • 那么一条崩溃率为 0% 的街道会以 0 距离结束?即使它的距离权重是50000000?
  • 这样想:如果你只考虑距离,你有权重 d1、d2、d3 ...如果你只考虑崩溃率,你会有 c1、c2、c3 ... 第一种情况:最小距离获胜,第二种情况:最小崩溃率获胜。然后,如果您将两者混合,您希望 a)如果两条街道的距离相等,则较小的崩溃率获胜,并且 b)如果两条街道的崩溃率相等,则较短的一条获胜,对吗?对于所有“介于两者之间”的人,您必须找到两者之间的最佳值。再加上你的整体“不超过 2*shortest”......所以你可能想为此引入一个面板。
  • 从 A 到 B 的最短路线不是旅行推销员。到达所有站点并让您回到起点的最短路线是旅行推销员。最短路线很容易;旅行推销员很难。

标签: c# algorithm dijkstra traveling-salesman


【解决方案1】:

您可以从运行正常的 Dijkstra 算法开始,这样您就知道最快的路线是什么,这样您就知道何时最安全的路线超出了这个成本。

然后您可以将安全性作为主要成本函数再次运行它,但还可以计算距离以排除某些路线。起初我认为这可以像普通的 Dijkstra 算法一样完成,但是通过为每个节点存储一个有序列表(前一个节点、成本和安全值)。问题在于距离和安全性显然是独立的(实际上存在某种相关性,但我们不知道如何建模)。这是一个问题,因为您需要防止在路线的早期错误地导致您在路线后期拒绝选项。

如果您可以在部分路线上应用距离限制,这将不是问题。也就是说,如果到任何中间节点的路径长于从起点到该节点的最短路径的两倍,则您不接受该路径。我知道这与您所说的不完全一样,因为您询问了仅将路由长度限制到最终节点,但也许它仍然可以帮助您考虑整体解决方案。对于它的价值,它也可能更现实。

请记住正确组合崩溃概率,您不能只是将其相加。如果我们假设旅程在第一次撞车时停止,那么您将计算撞车的概率为道路 1 上的撞车概率加上(在道路 1 上不撞车的概率 * 在道路 2 上撞车的概率)加上(得到的概率)安全前往 3 号公路 * 在 3 号公路上发生碰撞的可能性)等(如果这很明显,请见谅)。


鉴于您的评论,我将进一步解释概率(这是概率而不是您最好查找的几率)

如果您想要一个允许在碰撞后继续进行的整体安全措施,那么它会变得更加复杂。 如果你在发生崩溃时停下来,那么它的问题就是计算恰好发生一次崩溃的概率。 因此,如果出现以下情况,路线就会崩溃:

你在第一条路上撞车(概率 p1)或

您不会在第一条道路上撞车(概率 1-p1),但您确实会在第二条道路上撞车(概率 p2)。或

... 您不会在 n-1 道路上撞车(如上所示总共 1 个),但您确实在 n 道路上撞车(概率 pn)

这样一来,您就不会遇到 1 号和 2 号道路上 50% 的碰撞几率加起来不等于 100% 的总体几率的情况——而且您也永远不会得到更高的几率。

实际上,很多车祸发生在路口,并且根据您是左转还是右转,发生车祸的概率会有所不同 - 因此概率(实际上)不仅仅取决于路口之间道路的安全系数路口以及路线如何组合它们。

应根据使用情况对概率进行加权(查找条件概率),因此,如果在一条很少使用的道路上发生 20 起事故,可能需要建模,则与同时有 50 起事故的繁忙道路相比,其事故概率更高期间。

【讨论】:

  • 谢谢你,实际上我对增加百分比感到有些困惑,最初每次访问一个新节点时只除以 10 并将其添加到运行总数中,但我假设这根本不现实。我会看看计算赔率
  • @squish:假设你在每个角落掷骰子,如果你得到一个 1,你就会崩溃。如果有 6 个角,则您没有 6 * 1 / 6 = 100% 的崩溃几率。你有 1 - (1 - 1 / 6) ^ 6 的几率崩溃。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-07-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-06-02
相关资源
最近更新 更多