添加约束以检查是否存在满足比率的对组合?

Adding constrain to check if there exist a combination of pairs such that it statisfy a ratio?

假设我有一组 x0, ..., x14 中的一组项目,每个项目都包含自己的值 v0, ..., v14

我正在尝试最多 8 个项目,以便我获得最大值。

我能够得到以下最大化问题

max v0*x0 + ... + v14*x14
s.t.
x0 + ... + x14 <= 8
0 <= x0 <= 1
.
.
0 <= x14 <= 1
 

但是,我需要添加另一个约束条件,即对于所选项目,我应该能够将它们配对,使它们的比率小于 2。

即可以说选择的项目是 x0, x1, x3, x4, x8, x9, x10, x11 的最大值,他们也会有这样的配对配置,

(v0 * x0)/(v1 * x1)  <= 2, 
(v3 * x3)/(v9 * x9)  <= 2,
(v4 * x4)/(v11 * x11)<= 2,
(v8 * x8)/(v10 * x10)<= 2,

关于如何制定上述约束集的任何想法?

因此您可以预先计算有效对及其值(2 个元素的总和)

所以最多有 14 * 13 / 2 个潜在的有序对,更不用说有效的对了。

您需要 select 4 对,但要遵守以下约束:一旦对 selected,任何包含相同元素的对都不能 selected。这是对 14 个子集对的一个简单的至多一个约束。

for all item in items:
  sum(bool_pair for all bool_pair involving item) <= 1

您可以使用 CP-SAT 或线性求解器包装器来解决此问题。