Python 纸浆线性规划约束
Python Pulp Linear Programming Constraint
我对纸浆完全陌生,想知道是否需要优化以下内容:
x = pulp.LpVariable.dicts("Volume", range(0, 7), cat='Binary')
只要有 0,就必须至少有 3 个。
所以解可以是[0,0,0,0,0,0,1], [0,0,0,1,0,0,0], [1,1,1,0 ,0,0,1] 但不是 [1,0,1,0,1,0,0].
我尝试添加如下约束:
prob += min([len(list(g)) for k, g in itertools.groupby(x.values()) if k == 0]) >= 3
但是没用。
我该如何表述?
没有。 PuLP 用于线性规划,因此所有约束都需要是线性的。所以不允许使用 if 语句和类似的编程结构。
至少有三个连续零的要求可以用不同的方式表达。一种相当有趣的方法是禁止模式 101 和 1001。这可以表述为:
x[i] - x[i+1] + x[i+2] <= 1 for i=0,1,2,....
x[i] - x[i+1] - x[i+2] + x[i+3] <= 1 for i=0,1,2,....
这些约束非常精确地排除了模式 101 和 1001,但允许任何其他位模式。此外,它们不需要任何额外的变量(其他一些方法需要)。
如评论中所述,边界附近发生的情况需要引起注意。这个的精确实现有点取决于问题的细节。比如开头允许01还是001,最后是否允许10100。所以很难说明必须如何做到这一点(我将不得不列举几种可能的情况)。
无论如何,这在 Pulp 中很容易表达。
我对纸浆完全陌生,想知道是否需要优化以下内容:
x = pulp.LpVariable.dicts("Volume", range(0, 7), cat='Binary')
只要有 0,就必须至少有 3 个。
所以解可以是[0,0,0,0,0,0,1], [0,0,0,1,0,0,0], [1,1,1,0 ,0,0,1] 但不是 [1,0,1,0,1,0,0].
我尝试添加如下约束:
prob += min([len(list(g)) for k, g in itertools.groupby(x.values()) if k == 0]) >= 3
但是没用。
我该如何表述?
没有。 PuLP 用于线性规划,因此所有约束都需要是线性的。所以不允许使用 if 语句和类似的编程结构。
至少有三个连续零的要求可以用不同的方式表达。一种相当有趣的方法是禁止模式 101 和 1001。这可以表述为:
x[i] - x[i+1] + x[i+2] <= 1 for i=0,1,2,....
x[i] - x[i+1] - x[i+2] + x[i+3] <= 1 for i=0,1,2,....
这些约束非常精确地排除了模式 101 和 1001,但允许任何其他位模式。此外,它们不需要任何额外的变量(其他一些方法需要)。
如评论中所述,边界附近发生的情况需要引起注意。这个的精确实现有点取决于问题的细节。比如开头允许01还是001,最后是否允许10100。所以很难说明必须如何做到这一点(我将不得不列举几种可能的情况)。
无论如何,这在 Pulp 中很容易表达。