C# 在图中找到最安全的路线,但防止最快路线的旅行时间翻倍?

C# 在图中找到最安全的路线,但防止最快路线的旅行时间翻倍?,c#,algorithm,dijkstra,traveling-salesman,C#,Algorithm,Dijkstra,Traveling Salesman,我的大学项目是为我居住的城市设计一个路线规划器,计算街道之间的最短路线。(旅行推销员) 在C#中,我使用图表存储所有街道。目前,我可以使用Dijkstra算法在加权图中找到两条街道之间的最短路径,第一部分完成:) 我的下一个任务是,计算最安全的路线。每条街道都有一个交通事故百分比(例如,根据道路交通事故历史,发生车祸的概率为0.4%)。我需要计算最安全的路线,但要解决的问题是,用户是否希望以最安全的路线出行,但与最快的路线相比,他们的出行时间不会增加一倍 有谁能告诉我他们认为做这件事最好的方法是

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

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

我的下一个任务是,计算最安全的路线。每条街道都有一个交通事故百分比(例如,根据道路交通事故历史,发生车祸的概率为0.4%)。我需要计算最安全的路线,但要解决的问题是,用户是否希望以最安全的路线出行,但与最快的路线相比,他们的出行时间不会增加一倍

有谁能告诉我他们认为做这件事最好的方法是什么

我想到的一种方法是,在到达目的地之前,选择最后一条访问过的街道,删除该节点并计算一条没有该节点的路线,然后对10条路线这样做,然后选择一条累积碰撞百分比最低的路线,然而,这听起来也是最糟糕的方法

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


非常感谢大家

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

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

如果可以在部分路线上应用距离限制,则这不一定是问题。也就是说,如果到任何中间节点的路由长度超过从起点到该节点的最短路由的两倍,则不接受该路由。我知道这与您所说的不完全一样,因为您要求仅将路由长度限制到最终节点,但这可能仍有助于您思考总体解决方案。不管它值多少钱,它也可能更现实

记住正确地组合碰撞概率,你不能把它加起来。如果我们假设旅程在第一次撞车时停止,那么你会将撞车概率计算为1号路撞车概率加上(1号路不撞车概率*2号路撞车概率)加上(安全到达3号路的概率*3号路撞车概率)等(如果这很明显,请抱歉)


根据您的评论,我将进一步解释概率(您最好查看的是概率,而不是赔率)

如果你想要一个全面的安全措施,允许在碰撞后继续,那么它会变得更复杂。 如果在发生碰撞时停止,则只需计算一次碰撞的概率。 因此,如果:

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

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

。。。 您不会在n-1道路上撞车(如上所述,总共1次),但会在n道路上撞车(概率pn)

这样你就不会遇到在1号和2号公路上50%的撞车概率加起来不等于100%的总概率的情况,而且你也不会得到比这更大的概率

事实上,很多交通事故都发生在交叉路口,而发生交通事故的概率取决于你是左转还是右转——因此,(事实上)发生交通事故的概率不仅仅取决于交叉路口之间道路的安全系数,还取决于路线如何组合它们


概率应根据用途进行加权(查找条件概率)因此,如果在一条很少使用的道路上发生了20起车祸,可能需要对其进行建模,将其作为一条在同一时间段内发生50起车祸的繁忙道路,具有更高的车祸概率。

您能否使用
车祸百分比
来调整Dijkstra算法的权重?我的意思是一些修改,比如把percantage乘以重量,得到新的重量。嗯,我想那会有用的。假设两个节点之间的最快路径距离为200。假设最安全路线之间的距离为300,但碰撞百分比为0.6%,300*0.6将使其距离为180,使其成为首选节点。这对我来说是有意义的,如果这就是你所想到的,那么一条碰撞率为0%的街道最终的距离为0?即使它的距离权重是50000000?这样想:如果你只考虑距离,你就有权重d1,d2,d3。。。如果你只考虑克拉斯拉特,你会有c1,c2,c3。。。第一种情况:最小距离获胜,第二种情况:最小撞车者获胜。然后,如果你把这两条街道混合在一起,你希望a)如果两条街道的距离相等,较小的crashrate获胜;b)如果两条街道的crashrate相等,则较短的crashrate获胜,对吗?对于所有的“中间”,你必须在两者之间找到一个最佳值。此外,在顶部,你有一个整体“不超过2*最短”。。。所以你可能想为此介绍一个小组。从a到B的最短路线不是旅行推销员。最短的路线,击中所有站,让你们回到你们开始的地方是旅行推销员。最短的路线很容易;旅行推销员很难。谢谢你,我对把百分比加起来有点困惑,原来每次访问一个新的节点时只需要除以10