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

时间:2019-06-13 14:53:00

标签: algorithm constraint-programming minimization

假设我有一个数字列表= [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之间的差异最小化

1 个答案:

答案 0 :(得分:0)

通常有助于建立数学模型。例如

让我们

spl_autoload_register(function($class){
    require_once dirname(__FILE__) . DIRECTORY_SEPARATOR . $class . '.php';
});

try {
    $c = new EconomicCalendar('https://api.example.com/ec?token={MY_TOKEN}');
    $economic_calendar = $c->get_e_list(); 
} catch (Exception $e) {
    exit($e->getMessage());
}

成为数据。

介绍变量(由模型确定)

   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  

这是一个非线性模型。 MINLP(混合整数非线性规划)求解器很容易获得。您还可以选择一个可以线性化的目标:

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

可以将其重新构造为MIP(混合整数编程)模型。有许多可用的MIP求解器。

解决方案如下:

enter image description here

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

更多详细信息是here