我正在尝试为映射到具有非负权重边的有向图的问题找到启发式方法。然而,每条边都与两个权重属性相关联,而不仅仅是一个权重(例如,一个是距离,另一个是显示道路的 4G LTE 覆盖范围有多好!)。dijkstra
、或任何其他算法是否有任何特定的变体来Bellman Ford
实现这一目标?当然,一个简单的解决方法是手动将单个权重属性作为所有这些属性的组合,但这看起来并不好。
它可以推广到具有多个属性的情况吗?
我正在尝试为映射到具有非负权重边的有向图的问题找到启发式方法。然而,每条边都与两个权重属性相关联,而不仅仅是一个权重(例如,一个是距离,另一个是显示道路的 4G LTE 覆盖范围有多好!)。dijkstra
、或任何其他算法是否有任何特定的变体来Bellman Ford
实现这一目标?当然,一个简单的解决方法是手动将单个权重属性作为所有这些属性的组合,但这看起来并不好。
它可以推广到具有多个属性的情况吗?
假设您要同时优化两个标准:距离和吸引力(并且说路径吸引力被定义为最吸引人的边缘的吸引力,尽管您可以考虑不同的定义)。可以证明 Dijkstra 的以下变体有效,但我认为它主要在其中一个标准采用少量值的情况下很有用 - 比如说吸引力是1,...,对于一些小的固定k(较小的i更好)。
Dijsktra 算法的标准伪代码使用单个优先级队列。而是使用k优先级队列。在 Dijkstra 算法中,优先级队列i将对应于具有吸引力i的节点v ∈ V的最短路径。
首先初始化每个节点都在距离为∞的每个队列中(因为最初,具有吸引力i的到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
并从那里继续。
请注意,当您更新时,您会从 queue 中弹出Q[i]
,然后插入到Q[j]
for j ≥ i。
可以修改 Dijkstra 松弛属性的证明来证明这是可行的。
请注意,您将获得最多k |V| 结果,根据节点和吸引力,您可以与具有给定吸引力的节点的最短距离。
例子
从评论中举个例子:
因此,基本上,如果一条路径的总无覆盖英里数 > 10,那么我们会选择另一条路径。
在这里,例如,假设英里是整数(或可以四舍五入为整数),我们可以创建 11 个队列:队列i对应于最短距离,其中i没有覆盖英里,除了 10,它对应于 10 或更高无覆盖里程。
在算法的某个时刻,假设队列 3 下方的所有队列都是空的。我们弹出队列 3,并更新顶点的邻居:这可能会更新,例如队列 4 中的某个节点,如果从弹出节点到另一个节点的距离是 1。
当算法运行时,它输出(node, no-coverage-distance) → shortest distance 的映射。在这里,您可以决定放弃对中第二项为 10 的所有映射。