微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

根据路径长度增加额外费用

如何解决根据路径长度增加额外费用

我有一个图/网络,显然由一些节点和一些边组成。每条边都有一个权重,或者在这种情况下是一个成本。每条边也有一个距离和一个类型。所以基本上权重/成本是根据边缘的距离以及两种类型边缘的一些其他指标预先计算的。

但是,在我的情况下,我希望每 100 距离左右增加一些额外费用,但仅适用于一种类型的边缘。但我什至不确定是否可以增加额外费用/distance 取决于算法中路径中先前步骤的总和,例如 Dijkstra's ?

我知道我可以将成本分成每个距离单位,从而得到一些估计。问题在于边缘情况,在距离 199 处的成本几乎是在每 100 个距离处添加成本的两倍,即在 100 和 200 处添加成本。

但也许还有其他方法可以解决这个问题?

解决方法

我认为您不能使用 Dijkstra 来实现这一点,因为您会验证不变量,这是正确性所必需的(参见例如 wikipedia)。在每一步中,Dijkstra 都建立在这个不变量的基础上,它或多或少表明,所有“已经找到的路径”都是最优的,即最短的。但是为了表明它在“按边类型和覆盖距离增加额外成本”的情况下不成立,让我们看一个反例:

反对使用 Dijkstra 的反例

假设我们有两种类型的边,第一种类型 (->) 和第二种类型 (=>)。第二种类型在总距离为 10 后额外花费 10。现在,我们取下图,具有以下边

start -1-> u_1 
start -1-> u_2 
start -1-> u_3 
... 
start -1-> u_7 
u_7 -1-> v 
start =7=> v 
v =4=> end

当我们使用 Dijkstra(我跳过所有中间步骤)以 start 作为起始节点和 end 作为目标时,我们将首先检索路径 start=7=>v。这条路径的长度为 7,比长度为 8 的“绕道”start-1->u_1-1->... -1->u_7->v 短。但是,在下一步中,我们必须选择边 v=4=>end,这使得第一条路径共21条(11条原件+10条罚分)。但现在迂回路径变得更短,长度为 12=8+4(无惩罚)。

简而言之,Dijkstra 不适用 - 即使您修改算法以将“已找到的路径”考虑在内以检索下一条边的成本。

替代方案?

也许您可以围绕 Dijkstra 的变体构建您的算法,该变体通常会检索多个(次优)解决方案。首先,您需要扩展 Dijkstra,以便将已经找到的路径考虑在内。 (在 this function 中用 cost = weight(v,u,e,paths[v]) 替换 cost = weight(v,e) 并编写一个合适的函数来根据先前的路径和考虑的边缘计算惩罚)。之后,从原始最优解中移除边并迭代该过程以找到新的替代最短路径。但是,我认为没有简单的方法可以选择要从图中删除的边(除了惩罚类型的边),而且运行时的复杂性可能很糟糕。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。