【发布时间】:2022-01-22 23:34:09
【问题描述】:
我试图在加权多向图中找到一条最短路径(最便宜),其中顶点是城市,边是城市之间的路线,权重是价格。
每条路线/边缘由 3 家公司之一拥有。公司拥有的所有边缘的价格相同。因此,公司“A”拥有的所有边的价格都是 X。
因此,如果最终路径经过 A 公司的 2 条路线和 B 公司的 1 条路线,则最终价格为 2PriceofA + 1PriceOfB。此外,优势的权重就是关联公司的价格。
到目前为止,这是一个正常的情况,但是,以下额外的规则让我很难:
第 3 家公司“C”无论在最终路径中有多少条路线,都应用其价格 ONCE,但其价格通常高于之前的公司。因此,C 的路线最适合较长的路径,而 A 和 B 最适合较短的路径。
这是我到目前为止所做的(以及为什么它不起作用):
我正在使用 Dijkstra 来获得最便宜的路径,并且我只是将每个边的权重设置为公司的价格。即使是 C。
然后,如果算法访问 C 拥有的节点,它将 C 拥有的所有其他边的权重设置为 0。否则算法照常继续。
问题在于 Dijkstras 算法总是优先考虑直接的最佳选择,并且由于公司 A 和 B 的价格低于 C,所以它会尽量避开 C。有时这会导致算法认为最短的路径/最便宜,但实际上如果一开始就选择 C,可能会便宜得多。
在这种情况下,我怎样才能获得真正最便宜的路径?
我应该改用另一种算法吗?如果有,是哪一个?
【问题讨论】:
-
如果你使用 Dijkstra,C 边应该在你访问过 xA 或 xB 之后出现,无论 A 或 B 的倍数使它们大于 C。然后包括C的路径优先向前移动并被检查。或者如果它从未被检查过,这意味着 A 或 B 的倍数仍然小于一个 C。或者我错过了什么?
-
"那么如果算法访问 C 拥有的一个节点,它会将 C 拥有的所有其他边的权重设置为 0。" 如果 C 拥有的边未被选中,您是否重置权重? IE。如果发现另一条路径没有经过该边缘?
-
我将尝试改写 user1984 和 AloisChisten 已经指出的内容:Dijkstra 在这种情况下工作正常,但重置 C 边缘不是正确的方法。相反,除了跟踪到目前为止的路径长度之外,您还需要跟踪它是否越过 C 边缘。如果你愿意,我可以用 Python 画出它
-
你说edges归公司所有,那么“一个node归C所有”是什么意思呢?如果你走一条像 CAC 这样的三边路径,你只需要支付一个 C 还是两个?如果有,那么我看不到问题所在。要么支付 C,要么不支付,因此运行 Dijkstra 两次,一次没有 C-edge,一次免费使用 C-edge(但将 C-cost 添加到总数中)。
标签: algorithm shortest-path dijkstra