如何在ortools python中设置约束

时间:2020-07-30 03:08:18

标签: python optimization or-tools mixed-integer-programming

我正在尝试向要使用ortools解决的MIP添加约束。

这是我的数据框:

index, type, num_value
a, new, 1
b, new, 2
c, old, 1
d, old, 3
e, new, 2
f, old, 2

目标是在索引列中找到3个项目,其中num_value的总和最大化。但是,现在我想为“类型”添加一个约束:在选择的3个项目中,其中一个必须为“旧”类型。

到目前为止,这是我的代码:

solver = pywraplp.Solver('simple mip', pywraplp.Solver.CBC_MIXED_INTEGER_PROGRAMMING)

index_to_int = {}
int_to_index = {}

cnt = 0
for i in df['index']:
    index_to_int[i] = cnt
    int_to_index[cnt] = i
    cnt += 1

selected = [solver.BoolVar('item'+str(c)) for c in range(cnt)]

solver.Maximize(solver.Sum((i.num_value)*selected[index_to_int[i.index]] for i in df.itertuples()))

solver.Add(solver.Sum(selected)==3)

solver.Add(solver.Sum([df.loc[selected, 'type'])>1)

status = solver.Solve()

我认为“旧”类型的至少1个约束是错误的,因此我没有得到理想的结果。如何使用ortools进行指定?

1 个答案:

答案 0 :(得分:0)

您不能使用>,需要使用> = ..并且我看不到最后一个方程式中出现“旧”字样。