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

问题描述

假设我在集合 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 个潜在的有序对,有效的少得多。

您需要选择 4 对,约束条件是一旦选择了一对,任何涉及相同元素的对都不能被选择。这是对 14 个对的子集的简单至多一个约束。

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

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