我有下一个情况,我需要找到最佳的优化来解决问题。
我图 G
举一个例子,让图表看起来像这样
问题是需要在几个顶点之间找到最短路径中的权重(只是让它称之为SP
)并将它们全部添加。
我的意思是如果a - b
之间的最短路径为a -> c -> d
,则SP
将为x0 + x1 + x2
所以我的一系列问题看起来像这样:
所以天真的解决方案是每次在每一组之间找到SP
SP(a,g) + SP(a,h) + SP(e,f) + ... = result
所以这是优化任务开始的时候,我已经实现了两项改进,但我需要最好的优化(如果可能的话),让我看看我已经做了什么:
例子。如果SP
a - g
之间w
为SP
我保存,如果我再次询问a - g
或g - a
之间SP
的值是多少已经知道结果
a - g
并保存例如
如果我要求在a -> c -> d -> j -> g
之间找到SP。让我们假设这两个顶点之间的最短路径为SP
,因此x0 + x1 + x2 + x3
将是
a - g
所以我可以保存a
,但我也可以保存找到的所有后续路径的SP。
例如j
和a -> c -> d -> j
之间的最短路径为c and j
或c -> d -> j
之间的路径为SP
这里是所有SP(a,c) = x0
SP(a,d) = x0 + x1
SP(a,j) = x0 + + x1 + x2
SP(c,d) = x1
SP(c,j) = x1 + x2
SP(c,g) = x1 + x2 + x3
SP(d,j) = x2
SP(d,g) = x2 + x3
SP(j,g) = x3
个创建者
For counter = 0 To ExcelSheetLength Step 1
row.Cells(1) = exWb.Sheets("Tabelle1").Cells(counter, 0)
row.Cells(2) = exWb.Sheets("Tabelle1").Cells(counter, 1)
row.Cells(3) = exWb.Sheets("Tabelle1").Cells(counter, 2)
Set row = tbl.Rows.Add(BeforeRow:=tbl.Rows(2))
'set the table column values here with the row.cells 1-3
Next counter
我保存每一个结果。
所以现在这最后一次改进已经节省了很多时间,但似乎不够,因为节点的数量和发现的SP的集合相当大。
所以我可以使用任何建议或任何特定的算法来改善这些问题(我希望已经足够明确,如果没有解释任何细节请写评论)?
答案 0 :(得分:1)
您可以使用Dijustra搜索一个节点和所有其他节点之间的最短路径,并使用哈希表缓存所有最短路径的长度。
然后,对于给定的一组节点,您可以从哈希表中快速提取路径长度。
答案 1 :(得分:1)
如果要计算多对,请考虑Floyd-Warshall;它将为您提供从任何点到任何其他点的最短路径距离(以O(n ^ 3)运行时为代价)。