通过优化将一组数字转换为另一组数字的算法

时间:2016-11-11 09:56:03

标签: algorithm mathematical-optimization

我们需要将一组整数A转换为另一组整数B,以使B元素的平方和等于某个给定值{{ 1}}。

由于可能存在多个这样的变换,我们需要找到MA的相应元素之间差异的平方和最小的变换。

输入:

  • 一组非负整数B = {a 1 2 3 ... a n }
  • 非负整数A

输出:

  • 一组数字M = {b 1 ,b 2 ,b 3 ... b n },这样:
    • sum i = 1-> n [b i ^ 2] = B
    • sum i = 1-> n [(a i -b i )^ 2] = M被最小化。
  • 最低金额S

2 个答案:

答案 0 :(得分:4)

一点数学。

总和(a i - b i 2 = Sum ( a i 2 - 2 a i b i + b i 2 )= 总和 a i 2 - 2 Sum a i b i + Sum b i 2

第一个词是不变的;最后一个是M(也是常数),所以你正在寻求最大化

总和 a i b i

限制 Sum b i 2 = M.

换句话说,您需要一个垂直于矢量A = {a i }的超平面,与半球 sqrt (M)的超球面相切。这种超平面穿过法线与球体相交的点。这一点是 fA 与| fA | = sqrt (M):

f = sqrt (M)/ sqrt Sum a i 2

您的问题的解决方案是

b i = a i * sqrt (M)/ sqrt Sum a i 2

答案 1 :(得分:2)

编辑:到目前为止的答案,包括下面的答案,将A映射到一组实数而不是整数。据我所知,没有一般的解决方法,因为有许多M的值,没有满足约束的整数向量。例如:M = 2.没有整数向量,其平方和为2.即使M是平方和,它也是一定数量的平方和,所以即使M = 4也没有解,如果A有3个或更多非零组件。因此,没有一般的映射能够满足所述的问题。

这是允许B成为实数矢量的版本:

@ user58697的答案非常优雅。对于我们这些不太习惯用超几何思考的人来说,这可能是更直观的重述:

将A和B视为向量。然后以相同的方式开始:sum(a i - b i 2 = sum(a i 2 ) - 2sum(a i b i )+ sum(b i 2

第一项是矢量A的平方,正如最后一项是矢量B平方的幅度一样。两者都是不变的,所以只有中期可以改变。这意味着我们想要最大化总和(a i b i ),这正是A和B(https://en.wikipedia.org/wiki/Dot_product)的点积。当两个向量之间的角度为0时,两个向量的点积最大化,也就是说当它们是同向时(即它们指向相同的方向)。

这意味着A和B的单位矢量形式必须相同。那是: 一个<子> I / | A | = b i / | B |。解决这个问题b i :b i = a i * | B | / | A |

但是| B |只是sqrt(M),A是sqrt(sum(a i 2 ))。所以,就像在user58697的版本中一样:

b i = a i * sqrt(M)/ sqrt(sum(a i 2 ) )