我试图想出一个ruby算法来找到具有最高值(顶点之和)的定义极限(边缘之和)内的最佳最短路径。
起点也是结束点。
例如找到最大值为20且总值最高的路径。
这个问题似乎是一个难题,很难找到最佳解决方案。
是否有改进的dijkstra算法?我尝试使用贪心算法,但它没有给我一个最佳解决方案。并且通过在所有poosible路径上使用bruteforce可以工作,但是如果节点数量增加则需要很长时间。
想知道我是否可以使用任何算法组合来改进我的解决方案?
感谢。
答案 0 :(得分:0)
您可以找到an example of Djikstra's algorithm here。我要做的是添加一个变量来计算最短路径中的顶点数,并评估最短路径是否有太多顶点,或者确定最短路径甚至是时是否太长。 / p>
答案 1 :(得分:0)
问题实际上是NP难,你可以证明这会减少Hamiltonian path problem这个问题。基本上给出了汉密尔顿路径问题的输入(我们可以使用无向图),如果按照以下步骤,您可以为您描述的问题创建输入:
构建新图表
创建一个与接收哈密尔顿路径问题相同的新图,但是给每个顶点和边权重1。
为您的问题创建输入
将刚刚在上一步中创建的图表传递给您的问题,并将其限制为等于无穷大。
现在请注意,由于限制限制是边缘权重之和的上限,因此问题给出的结果是相对于顶点数最长的路径。这意味着您可以将顶点添加为posible,但仍然会限制限制。
路径中有多少个顶点确定了它的总值(路径中的顶点数),因为所有顶点的权重都是1。因此,结果路径是图中最长的路径。通过这种洞察,我们可以验证此路径是否是哈密尔顿路径,只需检查路径的长度。如果路径长度为N,其中N是图中节点的数量,则存在哈密顿路径,否则不存在。
要解决此问题,您可以使用类似于Bellman-Ford的方法进行一些修改。首先创建一个矩阵A [i,j],其中存储所有以j结尾的最高总值路径并具有长度(边数)i。这是关键,你不能只存储这条路径中的一条,因为在下一步中你需要检查所有这些以放松,这里是实现变为非多项式的地方。步骤i中的松弛技术迭代A [i-1,u]中的所有存储路径,并尝试改进A [i,v]中的值,以保存实际执行该路径的新路径(必须检查> =当试图改善A [i,v]以获得所有路径时),当然这种放松考虑了限制限制。如果您使用全局最大值和全局路径并在每个放松过程中更新它,那么您将以整个图形的最高值路径结束。