将数字 (x1, x2, x3, ...) 分配给列表 (a1, a2, a3, ...) 中的每个元素,以便 a1/x1 类似于 a2/x2 等等

Allocating numbers (x1, x2, x3, ...) to each element in a list (a1, a2, a3, ...) so that a1/x1 is similar to a2/x2 and so on

假设我有一个数字列表 = [3, 10, 20, 1, ...] 如何为列表中的每个元素分配一个数字 (x1, x2, x3, x4, ...),以便 3/x1 ~= 10/x2 ~= 20/x3 ~= 1/x4 = . .. ?

编辑:数字有一些限制(x1、x2、x3...)。它们必须从可用数字列表中挑选(也可以是浮点数)。 问题是元素的数量不一样。有更多的 X 元素。 X可以赋值多次。

目标是最小化 3/x1、10/x2、20/x3、1/x4 之间的差异

它通常有助于开发数学模型。例如

   a(i)>=0  i=1,..,m
   b(j)>0   j=1,..,n with n > m

是数据。

引入变量(由模型决定)

   c      =  common number for all expressions to be close to
   x(i,j) =  1 if a(i) is assigned to b(j)
             0 otherwise  

那么我们可以这样写:

min sum((i,j), (x(i,j)*(a(i)/b(j) - c))^2 )
subject to
    sum(j, x(i,j)) = 1   for all i  (each a(i) is assigned to exactly one b(j))
    x(i,j) in {0,1}
    c free

这是一个 non-linear 模型。 MINLP(混合整数 Non-linear 编程)求解器很容易获得。也可以选择一个可以线性化的objective:

min sum((i,j), abs(x(i,j)*(a(i)/b(j) - y(i,j))) )
subject to
    y(i,j) = x(i,j)*c
    sum(j, x(i,j)) = 1   for all i
    x(i,j) in {0,1}
    c free

这可以重新表述为 MIP(混合整数规划)模型。有许多可用的 MIP 求解器。

解决方案可能如下所示:

矩阵内的值为a(i)/b(j)。每一行对应一个a(i),并且恰好有一个匹配的b(j)。

更多详情here