在混合整数线性规划中具有相同值的连续变量块

block of consecutive variables to have same value in mixed-integer linear programming

我正在尝试对系统组件的操作进行建模,该组件将有两种操作模式,我们称它们为 1 和 2,加上空闲模式 0

怠速没有限制,但每种运行模式会持续正好3个时间序列点,所以x_{i}= 1表示x_{i+1} = x_{i+2} = 1 (不能 post 图片,请使用下面的 link 公式) operation mode 1

同样适用于操作模式 2。

例如。 011102220 有效,但 01110220 无效。

111111 或 222222 无效,但这在其他与资源相关的约束中得到解决(系统将没有足够的资源来运行超过 3 个时间序列点),因此只要有关问题强制变量数组中三个连续的1或2是地址,应该没问题。

提前致谢,

让我们稍微简化一下问题:假设我们只有二进制值,也就是说,我们只关心 0 和 1。

引入一个新的辅助二进制向量start_block。此矢量标记 新块的起点

此二进制向量中的非零值是约束的一部分,它定义了块的含义。

我们将解向量称为X

蕴涵以成对的方式完成。

# zero-order logic
start_block[x] -> X[x]
start_block[x] -> X[x+1]
start_block[x] -> X[x+2]

<=> 

# zero-order logic ( a->b <-> !a V b )
!start_block[x] V X[x]
!start_block[x] V X[x+1]
!start_block[x] V X[x+2]

<=>

# linear expression
(1 - start_block[x]) + X[x] >= 1
(1 - start_block[x]) + X[x+1] >= 1  
(1 - start_block[x]) + X[x+2] >= 1 

X 的整个决策变量维度执行此操作(关心边界)。

请记住,这只是说:如果 X 中有一个 1,它是大小 >=3 的块的一部分。它可以是 4 个块。因为我不完全了解您的模型,所以这是我可以提供的最通用的方法。当然,您可以根据自己的情况进一步调整!

将此推广到整数变量应该不会太难,但可能会引入新的辅助变量。

长度恰好为三的游程可以建模为:

y(t+1) >= y(t)-y(t-1)
y(t+2) >= y(t)-y(t-1)
1-y(t+3) >= y(t)-y(t-1)

其中 y(t) 是二进制变量。通过删除最后一个约束,可以对长度至少为 3 的游程建模:

y(t+1) >= y(t)-y(t-1)
y(t+2) >= y(t)-y(t-1)