如何在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中设置约束的主要内容,如果未能解决你的问题,请参考以下文章