在Python Pulp中创建约束以将连续的1到1限制为连续

时间:2019-01-27 19:43:04

标签: python optimization pulp

我想为使用纸浆建造的优化问题添加一个约束。约束应计算非零数字的“条纹”数,即

[1,1,1,1,0] = 1 because there us 1 group of 1s
[1,1,1,0,1] = 2 because there are 2 group of 1s
[1,0,1,0,1] = 3 because there are 3 group of 1s

约束应将组号限制为1或0(如果数组全为0)

就我的问题而言,这是一个具有3个时隙(列)的调度问题。我们正在考虑有2个人,并且可能有2个可能的职位(行)。 my_array =类似

([x1,x2,x3], [x4, x5, x6], [x7, x9, x9], [x10, x11, x12])

行0 =人1,工作角色A。行1 =人2工作角色A。行3 =人1工作角色B。行3 =人2工作角色B。如果为1,则该人工作,如果为0,则人不工作。

我想要一个人跨角色工作的总小时数(例如,对于人1,角色0和第2行的总和),只有1个连续的连胜,即1秒,即0。

我添加了此约束:

for p in range(num_people):
prob += len([ sum( 1 for _ in group ) for key, group in itertools.groupby(sum(my_array[p+x*num_people] for x in range(num_positions))) if key ]) == 1

但是,优化问题的输出中有一行,其中某人正在工作非连续行。即

([1,0,0], [1, 1, 0], [0, 0, 1], [0, 0, 0])

对第0行+第2行和第1行+第3行进行求和

([1,0,1], [1, 1, 0])

在这里,人员1工作在0时隙和2时隙,但不使用1时隙,这是我要避免的。尽管没有错误,但似乎该约束没有注册。对于将这种约束添加到线性优化问题中的其他方法,是否有任何建议?

1 个答案:

答案 0 :(得分:0)

在机器调度此有时也被称为:限制开始起坐的数量。有一些有趣的公式。

在这种特殊情况下,我们只有三个时间段(在问题中明确指出)。因此,我们唯一需要禁止的模式是:[1,0,1]。假设x[t]是我们的二进制变量。然后我们可以介绍剪切:

 x[0]-x[1]+x[2] <= 1

这将禁止[1,0,1],但将允许任何其他图案。

here显示了另一种方法。