遍历最小节点数的最短路径算法

时间:2012-04-03 15:45:41

标签: graph shortest-path dijkstra

我正在寻找Dijkstra的算法实现,它也考虑了遍历的节点数。

我的意思是,典型的Dijkstra算法,在计算从节点A到节点B的最短路径时,会考虑连接节点的边的权重。我想在此插入另一个参数。我希望算法能够对遍历的节点数量赋予一些权重。

因此,在某些值下,从A到B计算的最短路径可能不一定是最短路径,而是遍历节点数最少的路径。

对此有何想法?

干杯,
RD

编辑:
我很抱歉。我应该更好地解释一下。所以,让我们说,从最短的路线 (A,B)是A - > C - > D - > E - > F - > B共计10个单位
但我希望算法能够提出路线A - > M - > N - >; B共计12个单位 所以,我想要的是能够给节点数量增加一些权重,而不仅仅是连接节点的距离。

4 个答案:

答案 0 :(得分:6)

让我演示为所有边添加一个常量值可以改变哪条路线“最短”(边缘总重量最小)。

这是原始图表(三角形):

A-------B
 \  5  /
2 \   / 2
   \ /
    C

从A到B的最短路径是通过C.现在将常数2添加到所有边。最短路径变为从A直接到B的单步(由于我们为使用额外边缘而引入的“惩罚”)。

请注意,使用的边数(不包括您开始的节点)与访问的节点数相同。

答案 1 :(得分:2)

你可以这样做的方法是调整边的权重,使其始终为1,这样你就可以遍历5个节点,并且你已经超过了" 5"。此时算法将是相同的,优化遍历的节点数而不是行进的距离。

如果你想要某种混合,你需要确定遍历节点和距离的重要性。计算中使用的权重应如下所示:

weight = node_importance * 1 + (1 - node_importance) * distance

其中node_importance是一个百分比,用于衡量距离是多少因素以及最小节点遍历的重要程度。虽然您可能需要将距离标准化为平均值1。

答案 2 :(得分:1)

我会在这里走出困境,但你尝试过A *算法吗?我可能已经理解你的问题是错误的,但似乎A *将是你想要做的一个很好的起点。

查看:http://en.wikipedia.org/wiki/A * _ search_algorithm

也有一些伪代码可以帮助你:)

答案 3 :(得分:1)

如果我正确地理解了这个问题,那么最好的比喻就是用来找到最佳网络路径。

在网络通信中,不仅可以选择路径,因为它最短但有许多跳数(节点),因此可能会因节点连接而导致失真,干扰和噪声。

因此,最佳路径计算包含最小化变量函数,如距离和跳数(节点)一样。

你必须推导出一个可以将距离和节点数与质量联系起来的函数方程。

所以就像假设一样 1 hop count change = 5 unit distance(这意味着5unit distace或1个节点更改的影响相同)

所以为了减少损失,你可以在线性方程中使用它 minimize(distance + hopcount);
其中hopcount可以表示为距离。