【发布时间】: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