我试图找到一个问题的启发式方法,该问题映射到一个带有非负权重边的有向图。然而,每个边缘与两个权重属性相关联,而不是仅一个权重(例如,一个是距离,另一个是显示道路的4G LTE覆盖有多好!)。是dijkstra
,Bellman Ford
或任何其他追求此目标的算法的具体变体?当然,一个天真的解决方法是手动导出单个权重属性作为所有这些属性的组合,但这看起来不太好。
是否可以推广到具有多个属性的案例?
答案 0 :(得分:2)
假设你想同时优化两个标准:距离和吸引力(并说道路吸引力被定义为最具吸引力的边缘的吸引力,尽管你可以想到不同的定义)。 Dijkstra的以下变体可以显示起作用,但我认为它主要用于其中一个标准需要少量值 - 比如吸引力是 1,...,k 对于一些小的修复 k (较小的 i 更好)。
standard pseudocode for Dijsktra's algorithm使用单个优先级队列。而是使用 k 优先级队列。优先级队列 i 将在Dijkstra算法中对应到具有吸引力 i 的节点v∈V的最短路径。
首先初始化每个节点在距离∞的每个队列中(因为,最初, v 的最短路径具有吸引力 i 是无限的)。
在主要的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]
弹出,然后插入Q[j]
以获取j≥i。
可以修改Dijkstra的放松属性的证明,以证明这是有效的。
请注意,您将获得最多 k | V | 结果,根据节点和吸引力,您可以获得具有给定吸引力的节点的最短距离。
示例强>
以评论为例:
所以基本上如果路径的总无覆盖里程数> 10,那么我们会选择另一条路径。
这里,例如,假设里程是整数(或者可以舍入为整数),我们可以创建11个队列:queue i 对应于 i 的最短距离没有覆盖的里程,除了10,相当于10或更高的无覆盖里程。
在算法的某个时刻,假设队列3下面的所有队列都是空的。我们弹出队列3,并更新顶点的邻居:这可能会更新,例如队列4中的某个节点,如果距离弹出节点到另一个节点是1.
算法运行时,它会输出(节点,无覆盖距离)→最短距离的映射。在这里,您可以决定丢弃该对中第二项为10的所有映射。