【问题标题】: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将数字 (x1, x2, x3, ...) 分配给列表 (a1, a2, a3, ...) 中的每个元素,以便 a1/x1 类似于 a2/x2 等等
【发布时间】:2019-06-13 14:53:00
【问题描述】:

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

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

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

【问题讨论】:

  • 您希望您的 x 值为(正)整数吗?还是实数(浮点数)也可以接受?
  • 您可以将x1 设置为1,然后其他x 值应自动从基本计算得出。
  • 对不起,我忘了说数字有一些限制(x1,x2,x3...)。他们必须从可用号码列表中挑选出来。请查看编辑
  • 可接受浮点数
  • xs 可以多次使用吗?您在 cmets 中添加了越来越多的信息。请改为编辑您的问题。另外,平均最小距离是多少?从商数集中,您可以检索最小值或平均值。但不能同时进行。

标签: algorithm constraint-programming minimization


【解决方案1】:

开发数学模型通常会有所帮助。例如

   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

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

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

【讨论】:

    猜你喜欢
    • 2011-12-20
    • 2015-06-04
    • 2020-07-09
    • 2012-12-02
    • 2023-01-09
    • 1970-01-01
    • 1970-01-01
    • 2018-09-24
    • 1970-01-01
    相关资源
    最近更新 更多