我正在寻找Dijkstra的算法实现,它也考虑了遍历的节点数。
我的意思是,典型的Dijkstra算法,在计算从节点A到节点B的最短路径时,会考虑连接节点的边的权重。我想在此插入另一个参数。我希望算法能够对遍历的节点数量赋予一些权重。
因此,在某些值下,从A到B计算的最短路径可能不一定是最短路径,而是遍历节点数最少的路径。
对此有何想法?
干杯,
RD
编辑:
我很抱歉。我应该更好地解释一下。所以,让我们说,从最短的路线
(A,B)是A - > C - > D - > E - > F - > B共计10个单位
但我希望算法能够提出路线A - > M - > N - >; B共计12个单位
所以,我想要的是能够给节点数量增加一些权重,而不仅仅是连接节点的距离。
答案 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可以表示为距离。