在 PuLP MIP 中定义多个逻辑 OR 约束



比如说,我有一组二进制变量,如下所示:

ht = {}
for t in range(100):
ht[t] = pulp.LpVariable('ht[%i]' % t, lowBound=0, upBound=1, cat='Integer')

我想确保 ht[t] 之间存在差距,以便:

ht[t] + ht[t + 1] + ht[t + 2] + ht[t + 3] + ht[t + 4] + ht[t + 5] <= 1
OR
ht[t - 1] + ht[t] + ht[t + 1] + ht[t + 2] + ht[t + 3] + ht[t + 4] <= 1
OR
ht[t - 2] + ht[t - 1] + ht[t] + ht[t + 1] + ht[t + 2] + ht[t + 3] <= 1
OR
ht[t - 3] + ht[t - 2] + ht[t - 1] + ht[t] + ht[t + 1] + ht[t + 2] <= 1
OR
ht[t - 4] + ht[t - 3] + ht[t - 2] + ht[t - 1] + ht[t] + ht[t + 1] <= 1
OR
ht[t - 5] + ht[t - 4] + ht[t - 3] + ht[t - 2] + ht[t - 1] + ht[t] <= 1

根据"t"的位置,左侧和/或右侧的相邻邻居需要为 0。

是否可以在 PuLP 中编写此约束?

抱歉,这不是那么容易或便宜:我们需要额外的二进制变量:

ht[t] + ht[t + 1] + ht[t + 2] + ht[t + 3] + ht[t + 4] + ht[t + 5] <= 1 + 5 * δ[t,1]
ht[t - 1] + ht[t] + ht[t + 1] + ht[t + 2] + ht[t + 3] + ht[t + 4] <= 1 + 5 * δ[t,2]
ht[t - 2] + ht[t - 1] + ht[t] + ht[t + 1] + ht[t + 2] + ht[t + 3] <= 1 + 5 * δ[t,3]
ht[t - 3] + ht[t - 2] + ht[t - 1] + ht[t] + ht[t + 1] + ht[t + 2] <= 1 + 5 * δ[t,4]
ht[t - 4] + ht[t - 3] + ht[t - 2] + ht[t - 1] + ht[t] + ht[t + 1] <= 1 + 5 * δ[t,5]
ht[t - 5] + ht[t - 4] + ht[t - 3] + ht[t - 2] + ht[t - 1] + ht[t] <= 1 + 5 * δ[t,6]
δ[t,1]+δ[t,2]+δ[t,3]+δ[t,4]+δ[t,5]+δ[t,6] <= 5
δ[t,k] ∈ {0,1}

约束中5 * δ[t,k]的术语表示:

δ[t,k]=0 => k-th constraint is active
δ[t,k]=1 => k-th constraint is relaxed

我们至少需要一个活动约束,因此我们不允许所有δ[t,k]都是 1。

最新更新