假设我有一个数字列表= [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之间的差异最小化
答案 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求解器。
解决方案如下:
矩阵内的值为a(i)/ b(j)。每行对应一个a(i),并且正好有一个匹配的b(j)。
更多详细信息是here。