如何在ortools python中设置约束

Posted

技术标签:

【中文标题】如何在ortools python中设置约束【英文标题】:how to set constraint in ortools python 【发布时间】:2020-07-30 03:08:18 【问题描述】:

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

这是我的数据框:

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

目标是在索引列中找到 num_value 的总和最大的 3 个项目。但是,现在我想为“类型”添加一个约束:在选择的 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】:

您不能使用 >,您需要使用 >=.. 我没有看到“旧”出现在您的最后一个等式中。

【讨论】:

【参考方案2】:

好吧,我们必须用新的变量来标记它们,比如说 df['old'] = np.where(df['type'].isin(['old']),1,0)

然后我们在列出的列上设置一个约束: list_old = df['old'].to_list() 约束_01=[] 对于 len 中的 i(已选择): constrain_01.append(selected[i]*list_old[i]) solver.Add(sum(constrain_01)>=1)## at least 1 表示至少需要选择 1 然后你明智地保留其他部分

【讨论】:

以上是关于如何在ortools python中设置约束的主要内容,如果未能解决你的问题,请参考以下文章

使用ortools时如何获取cpsolver的变量和约束

我们如何在 uitableview 单元格中设置标签约束?

ortools如何添加非线性约束

如何在 Objective C 中的 Xcode 8 中设置约束

如何在 IBDesignable 文件中设置高度约束?

如何在 Sql Server 2008 中设置唯一约束 [重复]