算法可以找到最佳组合或通过节点的路径



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

问题描述:

假设,每个节点代表一个整数值l。现在的目标是找到节点的最佳组合,其中随后的节点的L值之间的差异最接近给定的整数值m(l),该数值m(l)随着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)节点的最佳组合是按照排序的序列遵循的,而不是"跳回" -> SO 1,3,5,7是可能的,但不是1,3,5,2,7。
3)最后,所选节点的L值之间的差异应在平方平方的意义上最接近M值

每个帮助都非常感谢!

如果我正确理解您的问题,则可以使用Dijktras算法:

https://en.wikipedia.org/wiki/dijkstra's_algorithm

http://www.mathworks.com/matlabcentral/fileexchange/20025-dijkstra-s-minimum-cost-cost-path-algorithm

为此,您必须了解每个节点的邻居并创建一个邻接矩阵。通过在上方发布的Dijktras算法的实现,您可以指定边缘权重。您可以以访问节点的l的l的方式指定边缘重量。因此,对于每个节点组合,您都具有新的节点 M的l。以这种方式,算法应找到节点之间的最佳路径。要获取所有边缘组合,您可以使用MATLABS图形函数:

http://se.mathworks.com/help/matlab/ref/ref/graph.html

如果我正确理解您的问题,则需要一个无向图。您可以使用命令访问所有边缘创建图形后的G.Edges。

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

p.s。只需注意,Djikstras算法只能处理正边缘。

假设我们得到了一个数字m和n数字列表,l [1],...,l [n],我们想找到至少q的子序列在后面的数字中,相对于m,将平方错误的总和(SSE)最小化,其中k位置列表x [1],...,x [k]相对于mP>

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

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

(我在此处介绍了参数Q和相关的约束,因为没有它,始终存在一个恰好达到最小SSE的长度的子序列 - 而且我猜想这么短的序列对您没有帮助。)

可以在 o(qn^2)时间和o(qn)空间中解决此问题。

将F(i,j)定义为在以下约束下可实现的平方错误总和:

  1. 选择位置I处的数字,并且是最右边的位置。(在这里,i = 0表示没有选择职位。)
  2. 我们要求至少选择这些第一个I编号的J(而不是Q)。

还将g(i,j)定义为所有0&lt; = k&lt; = i的最小值(k,j)。因此,g(n,q)将是在整个原始问题上可以达到的平方错误的最小总和。为了高效(O(1))G(i,j)的计算,请注意

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,则必须通过将ITH位置附加到某些解决方案y中,以选择至少J-1位置,并且最右边的位置在左侧我的 - 即最右边的位置是K,对于某些K&Lt;我。该解决方案的总SSE到(i,j)子问题是Y的SSE,以及(l [x [i]] -l [x [x [k]] -m)-m)^2-的固定项。 - 因此,为了最大程度地减少总SSE,足以最大程度地减少Y的SSE。但是我们可以计算最低:它是G(K,J-1)。

因为这适用于任何0&lt; = k&lt;i,尝试所有此类k的值就足够了,并采用给出最低总SSE的值:

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),这是整个问题的最小平方错误总和。通过f(i,j)和g(i,j)的记忆值,计算f(i,j)的所有必需值的时间为o(qn^2),因为最多有(n 1)*(q 1)输入参数(i,j)的可能不同组合,计算f(i,j)的特定值最多需要(n 1)循环的迭代,以选择k的值,每种迭代的值其中需要o(1)时间在递归子电话之外。存储F(i,j)的解决方案值最多需要(n 1)*(q 1),或O(qn),空间,以及G(i,j)。如上所述,可以在O(1)计算所有需要的f(x,y)值的时间中计算g(i,j),因此可以在同一时间复杂性中计算g(n,q)。

为了实际重建与此最小SSE相对应的解决方案,您可以以相反顺序浏览F(i,j)的计算值,每次寻找k值的值,该值在复发中实现最小值(通常,可能有许多这样的值的值,将i设置为k的值,然后继续延续到i = 0。这是一种标准的动态编程技术。

我现在以当前的实现来回答自己的帖子,以构建我的帖子和加载图像。不幸的是,该代码没有做应该做的事情。想象一下下图中的L,M和Q。使用calcf和calcg函数,我计算了f(i 1,j 1)的f和g矩阵是从g(i,J)。最佳组合的SSE应为g(n 1,q 1),但结果是错误的。如果有人发现这个错误,那将不胜感激。

工作空间中给定问题的

g和f矩阵。G和F是通过Calcg(L,N,Q,M)计算G(N,Q)创建的。

calcf和calcg函数

最新更新