我目前正在使用 google OR-tools CP-SAT 求解器来解决规划问题。我使用 IntVars 作为日期的表示。所有这些 IntVar 都在字典中。我有一些可以正常工作的约束,但我想强制求解器使大约 2/3 的 Intvars 低于 400。
我尝试使用 BoolVars 解决问题,但没有成功,我运行了出于如何将 2/3 的值强制低于 400 的想法。
有人能想到解决方案吗?
可以使用 Google OR-Tools CP-SAT 求解器来强制大约 2/3 的 IntVar 值低于 400。以下是一种可能的方法:
- 创建布尔变量: 为字典中的每个 IntVar 创建一个布尔变量。当相应的 IntVar 小于 400 时,此布尔变量将为 true,否则为 false。
from ortools.sat.python import cp_model
model = cp_model.CpModel()
# your existing code to create IntVars dictionary
# Create boolean variables for each IntVar
bool_vars = {}
for key, int_var in int_vars.items():
bool_vars[key] = model.NewBoolVar(f'{key}_below_400')
model.Add(int_var < 400).OnlyEnforceIf(bool_vars[key])
model.Add(int_var >= 400).OnlyEnforceIf(bool_vars[key].Not())
- 计算目标数量: 计算字典中 IntVar 总数的 2/3。
target_count = int(len(int_vars) * (2 / 3))
- 添加约束: 添加约束以确保 true 布尔变量的数量大约等于目标数量。
model.Add(sum(bool_vars.values()) >= target_count)
此约束确保至少有
target_count
个 IntVar 小于 400。可能希望添加另一个约束来限制大于 400 的变量的数量,以使分布更接近 2/3:
model.Add(sum(bool_vars.values()) <= target_count + 1)
此约束确保最多有
target_count + 1
个 IntVar 小于 400。
完整代码示例:
from ortools.sat.python import cp_model
# Create a model
model = cp_model.CpModel()
# Sample data for IntVars
int_vars = {
f'var_{i}': model.NewIntVar(0, 1000, f'var_{i}') for i in range(10)
}
# Create boolean variables for each IntVar
bool_vars = {}
for key, int_var in int_vars.items():
bool_vars[key] = model.NewBoolVar(f'{key}_below_400')
model.Add(int_var < 400).OnlyEnforceIf(bool_vars[key])
model.Add(int_var >= 400).OnlyEnforceIf(bool_vars[key].Not())
# Calculate the target count
target_count = int(len(int_vars) * (2 / 3))
# Add constraints for the number of True boolean variables
model.Add(sum(bool_vars.values()) >= target_count)
model.Add(sum(bool_vars.values()) <= target_count + 1)
# Create a solver and solve the model
solver = cp_model.CpSolver()
status = solver.Solve(model)
# Print the solution
if status == cp_model.OPTIMAL or status == cp_model.FEASIBLE:
for key, int_var in int_vars.items():
print(f'{key}: {solver.Value(int_var)}')
else:
print('No solution found.')
此代码将打印一个解决方案(如果找到),其中大约 2/3 的 IntVar 值小于 400。请注意,由于“大约”的要求,实际比率可能并非始终完全为 2/3,但它将尽可能接近约束条件。
标签:python,solver,or-tools,cp-sat From: 78292545