我正在尝试使用适用于Python 3.7的Google OR构建整数LP模型。而且我不知道如何创建析取约束。假设有{x1,x2,x3,x4,x5,...}变量,我想在一种情况下分解几种条件: x1 + x2 = 2 | x2 + x3 = 2 | x3 + x4 = 2 因此,要满足x2 + x3 = 2的条件就足够了。
据我了解,这是可能的,称为析取条件。对于OR Tools,我发现了some explanation,但它是针对C ++的,看起来已经过时了。 也有tutorial by google,但是它是用于CP而不是LP任务的,所以我不知道如何在我的情况下使用它(我没有建模,只是求解器)
我的任务是在轮班工作中定义晚餐时间(比如说2小时),并尽量减少重叠。对于变量,0代表晚餐,1代表工作时间。因此,这是我现在所得到的内容的简化版本:
...
solver = pywraplp.Solver('SolveIntegerProblem', pywraplp.Solver.CBC_MIXED_INTEGER_PROGRAMMING)
objective = solver.Objective()
for e in employees:
for d in days:
# setting up a constraint that during workday employee should have a dinner time for 2 hours
dinner_constraint = solver.Constraint(-solver.infinity(), e.end_hour - e.start_hour - 1) # force to spend at least 2 hours for dinner
for h in range(e.start_hour, e.end_hour):
variables[(e, d, h)] = solver.IntVar(0.0, 1.0, 'mhr_{}_{}_{}'.format(e, d, h))
objective.SetCoefficient(variables[(e, d, h)], 1)
dinner_constraint.SetCoefficient(variables[(e, d, h)], 1)
for h in range(e.start_hour, e.end_hour - 1): # e.end_hour - 1 due to dinner is 2 hours
dinner_sub_constraint = solver.Constraint(2)
dinner_sub_constraint.SetCoefficient(variables[(e, d, h)], 1)
dinner_sub_constraint.SetCoefficient(variables[(e, d, h + 1)], 1)
# here I want to disjunct dinner_sub_constraint for each iteration in one constraint
objective.SetMaximization()
result_status = solver.Solve()
...
因此,我只想分解Dinner_sub_constraint的所有内容并将其设置为单个约束。
这可能是一种怪异的方法,但是我不知道如何连续提供两个小时的晚餐,因此在一个班次中不能同时提供两个1小时的晚餐。 有什么办法可以区分条件吗?还是我的方法是错误的?还是应该使用其他图书馆?
答案 0 :(得分:4)
您应该使用CP-SAT求解器。在examples / python中查找shift_scheduling_sat.py。