【问题标题】:Algorithm to find best combination or path through nodes通过节点找到最佳组合或路径的算法
【发布时间】:2016-06-17 10:48:42
【问题描述】:

由于我对各种优化/树算法不是很精通,我正在寻求帮助。

问题描述:

假设,给定一个大序列的排序节点,每个节点代表一个整数值 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值

非常感谢每一个帮助!

【问题讨论】:

  • 您的条件(3)对于传达您正在尝试做的事情很有用,这似乎是:从n个节点的序列中,选择k个节点位置x_1的子序列(允许间隙), ..., x_k 使得 1
  • 您好,您在从文本中提取重要信息方面做得非常好,谢谢。你写的一切都是准确的。我还注意到算法的问题,然后减少了节点的数量。我所能做的就是估计应该考虑的节点数量。但是,这只是正确节点数的(相对较好的)近似值。因此,一个额外的约束可能是考虑这个值,例如将节点数限制为大于最小值。
  • 好,这正是我的建议,我的回答解决了问题:)

标签: algorithm matlab tree combinations


【解决方案1】:

如果我正确理解您的问题,您可以使用 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.Edges。

我知道这不是完美的答案,但我希望它有所帮助!

P.S. 请注意,Djikstras 算法只能处理正边权重。

【讨论】:

  • 谢谢,非常感谢您的帮助!目前,我正在遵循 j_random_hacker 解决方案的路线,这似乎与 Dijkstra 算法 (?) 非常相似,但可能仍会考虑您的提示。有趣的是,虽然与优化算法几乎没有任何关系,但我曾经计算过 Floyd Warshall 算法来完成一项微不足道的任务,但不知何故想不出这个问题的应用程序。
【解决方案2】:

假设给定一个数字 M 和一个由 n 个数字组成的列表 L[1], ..., L[n],并且我们想要找到至少 q 个后一个数字的子序列,以使总和最小化关于 M 的平方误差 (SSE),其中关于 M 的 k 个位置 x[1], ..., x[k] 的列表的 SSE 由下式给出

SSE(M, x[1], ..., x[k]) = sum((L[x[i]]-L[x[i-1]]-M)^2) over all 2 <= i <= k,

将 0 或 1 个位置列表的 SSE 定义为 0。

(我在这里引入参数 q 和对子序列长度的相关约束,因为没有它,总是存在一个长度正好为 2 的子序列,它实现了最小可能的 SSE——我猜这么短的序列对你没有帮助。)

这个问题可以用dynamic programmingO(qn^2)时间和O(qn)空间解决。

将 f(i, j) 定义为在以下约束条件下可实现的最小误差平方和:

  1. 位置 i 的数字被选中,并且是最右边的选中位置。 (这里,i = 0 意味着没有选择任何位置。)
  2. 我们要求前 i 个数字中至少有 j 个(而不是 q)被选中。

还将 g(i, j) 定义为 f(k, j) 在所有 0

g(i>0, j>0) = min(g(i-1, j), f(i, j))
g(0, 0) = 0
g(0, j>0) = infinity

要计算 f(i, j),请注意,如果 i > 0,那么任何解都必须通过将第 i 个位置附加到某个至少选择 j-1 个位置且其最右侧选定位置在左侧的解 Y 上来形成of i - 即其最右边的选定位置是 k,对于某些 k

由于这适用于任何 0

f(i>=j, j>=2) = min of (g(k, j-1) + (L[x[i]]-L[x[k]]-M)^2) over all 0 <= k < i
f(i>=j, j<2) = 0        # If we only need 0 or 1 position, SSE is 0
f(i, j>i) = infinity    # Can't choose > i positions if the rightmost chosen position is i

通过上述递归和基本情况,我们可以计算 g(n, q),即整个问题的最小可能误差平方和。通过memoising values of f(i, j) and g(i, j),计算所有需要的 f(i, j) 值的时间是 O(qn^2),因为输入参数最多有 (n+1)*(q+1) 个可能的不同组合( i, j),并且计算 f(i, j) 的特定值需要选择 k 值的循环最多 (n+1) 次迭代,每次迭代在递归子调用之外花费 O(1) 时间。存储 f(i, j) 的解值最多需要 (n+1)*(q+1) 或 O(qn) 空间,对于 g(i, j) 也是如此。如上所述,当所有需要的 f(x,y) 值都已计算完毕时,g(i,j) 可以在 O(1) 时间内计算出来,因此 g(n,q) 可以以相同的时间复杂度计算。

要实际重构与此最小 SSE 对应的解,您可以以相反的顺序追溯 f(i, j) 的计算值,每次寻找在递归中达到最小值的 k 值 (通常可能有许多这样的 k) 值,将 i 设置为这个 k 值,并继续直到 i=0。这是一种标准的动态规划技术。

【讨论】:

  • 非常感谢您的回答。因此,虽然我正在研究该解决方案并且仍在理解它的过程中,但该解决方案似乎假设 M 是一个常数。但是,如帖子中所述,L 值之间的差异应该“最接近在 L 上变化的给定整数值 M(L)”。因此,对于每个节点或值,M 是不同的,并且与开始相比,最后很可能是值的两倍或一半。但是,随后的 M 值非常接近,例如从 100 变为 102 或 98。
  • 看了之后觉得这不是问题,因为均方误差只加到前面的误差上,M可以根据L[x[i]]和L[ x[k]]。另外,据我了解,这个算法要求向量的起始值和终止值是最优组合的一部分?
  • 我确实假设 M 是恒定的,但幸运的是,将其改为每对相邻所选位置的终点(或起点,甚至两个点)的函数并不完全损害算法。
  • 它不需要选择开始或结束位置。可能你有这个想法(至少在最后)是因为我谈到了通过 f(i, j) 进行追溯,而我应该说通过 g(i, j) 进行追溯。
  • 我终于找到了实施它的时间,结果出乎意料地好。然而,我改变了 // f(i>=j, j>=2) = min of (g(k, j-1) + (L[x[i]]-L[x[k]]-M) ^2) over all 0
【解决方案3】:

我现在用我当前的实现来回答我自己的帖子,以便构建我的帖子并加载图像。不幸的是,代码没有做它应该做的事情。想象一下 L、M 和 q,如下图所示。使用 calcf 和 calcg 函数我计算了 F 和 G 矩阵,其中 F(i+1,j+1) 是计算和存储的 f(i,j) 和 G(i+1,j+1) 从 g(i ,j)。最优组合的SSE应该是G(N+1,q+1),但是结果是错误的。如果有人发现错误,那将不胜感激。

G and F Matrix of given problem in the workspace. G and F are created by calculating g(N,q) via calcg(L,N,q,M).

calcf and calcg functions

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-11-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多