假设你有一个无向图G =(V,E)和两个顶点s,t在V中,s不等于t。 E中的每个边缘e都有长度和利润。
问题是: 如何在s-t之间找到路径P =(s,a1,a2,...,t),使路径的总长度尽可能小,利润最大。 有了Dijkstra,我可以找到第一个约束,但我怎么能确定第二个?
你可以做回溯但是,有没有更快的算法?欢迎任何帮助。
编辑: 首先找到最短路径的值x,然后找到所有的路径 具有相同长度x的路径,找到具有最大利润的路径。
答案 0 :(得分:2)
不是在Dijkstra算法中为每个候选路径存储单个值,而是存储(总长度,总利润)的元组。如果总长度较短,或总长度相同但总利润较高,则考虑松弛步骤中的路径较短。
答案 1 :(得分:0)
基本上你正在做的是你有两个数组分别维持长度和利润。 您可以创建另一个数组,它将长度与边缘的利润进行比较。 因此数组将存储所有边缘的比率=长度/利润,并且使用此定量数组,您可以使用Djikshtra的算法。 对于Djikshtra的算法,使用V set作为顶点和数组比率。使用这个运行Djikshtra的算法。您将获得所需的答案
答案 2 :(得分:0)
这似乎是multi-objective optimization的一个例子。
解决此类问题的一种方法是为lambda创建一个新变量L
。
但首先,让我们处理利润问题:您的边缘长度为l
,利润为p
。重新定义所有p
,使p'=max(p)-p
。现在,您的最大盈利边缘的值为零(可能的最低值),而您的最低盈利边缘的值为max(p)
(可能的最高值)。您现在可以找到最低成本路径。
将边缘的权重定义为l*L+p'*(1-L)
,现在从0到1变化L
。根据长度或利润是否更重要,不同的路径将是最佳的。简而言之,这些路径构成了帕累托最优集。对于L
的特定值,每个解决方案路径都优于所有其他路径。对于那个L
,没有办法增加利润而不增加长度,或者减少长度而不减少利润。
请注意,选择L
的适当值来生成此集合可能不是直截了当的:例如,如果利润数远大于长度数,则大多数集合将以{{1将利润值缩放到与长度值相当的水平。这些L
值可能非常小。
Ooop,看到你的编辑:"首先找到最短路径的值x,然后在具有相同长度x的所有路径的集合上找到一个具有最大利润的路径。"在这种情况下,Nick's answer是可行的方法。