我试图找到一个问题的启发式,它被映射到一个有向图,比如非负权边。然而,每条边缘都与相关--两个权重属性,而不是一个权重(例如,一个是距离,另一个是显示道路4G LTE覆盖范围有多好!)。是否有任何特定的变异dijkstra
,Bellman Ford
,或任何其他算法追求这一目标?当然,简单的解决方法是手动将单个权重属性作为所有这些属性的组合,但这看起来并不好。
它能推广到多个性质的情况下吗?
发布于 2016-02-16 09:39:08
假设你想同时优化两个标准:距离和吸引力(假设路径吸引力被定义为最吸引人的边缘的吸引力,尽管你可以想出不同的定义)。下面的Dijkstra的变化可以证明是有效的,但我认为它主要是有用的,当其中一个标准需要少量的值-例如吸引力为1,.,k对于一些小的固定k(较小的i更好)。
Dijsktra算法的标准伪码使用单个优先级队列。相反,使用k优先级队列。优先级队列i将在Dijkstra算法中对应于具有吸引力I的节点v∈V的最短路径。
首先初始化每个节点位于距离为∞的每个队列中(因为,最初,具有吸引力的v的最短路径是无限的)。
在主Dijkstra循环中,它说
while Q is not empty
将其更改为
while there is an i for which Q[i] is not empty
Q = Q[i] for the lowest such i
然后从那里继续。
请注意,当您更新时,您将弹出队列Q[i]
,并为j≥i插入到Q[j]
中。
可以修改Dijkstra的松弛性质的证明,以证明这是可行的。
请注意,您将获得最多k_个结果,作为每个节点和吸引度,你可以有最短的距离到具有给定吸引度的节点。
示例
以评论中的一个例子:
因此,基本上,如果一条路径有超过10英里的无覆盖里程,那么我们就选择另一条路径。
在这里,假设英里是整数(或者可以四舍五入为整数),我们可以创建11个队列:队列i对应于与i无覆盖英里的最短距离,除了10英里,后者对应于10或更高的无覆盖里程。
在算法的某个点,假设所有队列在队列3下面都是空的。我们弹出队列3,并更新顶点的邻居:如果从弹出节点到另一个节点的距离为1,这可能会更新队列4中的某个节点。
当算法运行时,它输出(节点,无覆盖距离)→最短距离的映射.在这里,您可以决定放弃对中的第二项为10的所有映射。
https://stackoverflow.com/questions/35438749
复制