or-tools - 检查分配的元素是否满足 OR-Tools 中的条件
问题描述
我有 100 个元素要分配给 10 个位置。
# the elements list holds 100 variables that signify the assignment to a spot
elements = [model.NewIntVar(1, 10) for i in range(100)]
我的每个元素都有特定的大小。现在我想为每个点建模一个(一组)约束,它说:分配给这个点的所有元素的添加大小位于固定范围内。
因此,如果点 1 分配了元素 1、16 和 64,它们的大小是 1521、1732、1431,而我的范围是 (3000, 6000),那就没问题了。但是如果太多或太大的元素(或太少/太小)被分配到点 1,那就不行了。
类似于以下内容,但不起作用:
for spot in range(10):
sum_ = sum([get_size(e) for e in elements if e == spot]) # if think if e == spot is what fails
model.Add(sum_ >= 3000)
model.Add(sum_ <= 6000)
我怎样才能为这样的东西建模?我已经查看了通道约束,但我无法完全理解它。
解决方案
我认为最好将作业建模为布尔值:
from ortools.sat.python import cp_model
model = cp_model.CpModel()
solver = cp_model.CpSolver()
all_spots = range(10)
all_elems = range(100)
elements = {
(elem, spot): model.NewBoolVar(f"{elem} in spot {spot}")
for elem in all_elems
for spot in all_spots
}
# only one spot for element
for elem in all_elems:
model.Add(sum(elements[elem, spot] for spot in all_spots) == 1)
for spot in all_spots:
# taking the element id as its size
sum_ = sum(elements[elem, spot] * elem for elem in all_elems)
model.Add(sum_ >= 0)
model.Add(sum_ <= 500)
solver.Solve(model)
for (elem, spot), boolean in elements.items():
if solver.Value(boolean):
print(boolean)
看:
推荐阅读
- ios - Firebase 不允许我查看崩溃详细信息
- reactjs - 在反应中找不到产品时处理
- javascript - React Parent to Children 事件处理值传递
- python - Django:“models.py”中的类的 DB-Query
- json - 如何在 SQL Server 中循环遍历 json 数组?
- macos - Siri Kit 是否适用于 mac os 应用程序?
- java - CrudRepository - 如何通过映射键和值查找对象
- python - 如何在乒乓球比赛中预测球的轨迹,用于 AI 桨预测?
- javascript - 它显示输入意外结束为错误,我该怎么办
- python - 为什么 QTimer 在对象中不起作用?python PyQt