由于本人对各种优化/树算法不是很精通,求助。
问题描述:
假设,给定一个大的排序节点序列,每个节点代表一个整数值 L。L 总是随着每个节点变大,并且没有节点具有相同的 L。
现在的目标是找到节点的最佳组合,其中后续节点的 L 值之间的差异最接近随 L 变化的给定整数值 M(L)。
示例:
所以,一开始我会有 L = 50 和 M = 100。接下来的节点有 L = 70,140,159,240,310。
首先,159 的值似乎最接近 L+M = 150,因此选择它作为正确的值。 然而,在下一步中,仍然给出 M=100,我们注意到 L+M = 259,这与 240 相去甚远。 如果我们现在返回并选择 L=140 的节点,然后是 240,则 M 值和 L 差异之间的整体匹配更强。即使在途中出现错误,该算法也应该能够找到最佳路径。
一些附加信息:
1) 起始节点不一定是最佳组合/路径的一部分,但如果需要,可以先开发一种算法,选择最佳起始候选者。
2) 节点的最佳组合遵循排序顺序而不是“跳回”-> 所以 1,3,5,7 是可能的,但不是 1,3,5,2,7。
3) 最后,所选节点的L值之间的差异在均方意义上应该最接近M值
非常感谢您的帮助!
最佳答案
如果我正确理解你的问题,你可以使用 Dijktras 算法:
https://en.wikipedia.org/wiki/Dijkstra%27s_algorithm
http://www.mathworks.com/matlabcentral/fileexchange/20025-dijkstra-s-minimum-cost-path-algorithm
为此,您必须了解每个节点的邻居并创建一个邻接矩阵。通过我在上面发布的 Dijktras 算法的实现,您可以指定边权重。您可以以访问节点的 L + M 的方式指定边缘权重。因此,对于每个节点组合,您都有新节点的 L + M。这样,算法应该找到节点之间的最佳路径。 要获得所有边组合,您可以使用 Matlabs 图形函数:
http://se.mathworks.com/help/matlab/ref/graph.html
如果我正确理解你的问题,你需要一个无向图。 您可以使用以下命令访问所有边缘 G.创建图形后的边缘。
我知道这不是完美的答案,但我希望它对您有所帮助!
P.S. 请注意,Djikstras 算法只能处理正边权重。
关于通过节点找到最佳组合或路径的算法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37879693/