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

时间:2017-06-12 09:53:12

标签: mathematical-optimization linear-programming integer-programming

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

空转没有限制,但每个操作模式将持续正好3个时间序列点,因此x_ {i} = 1表示x_ {i + 1} = x_ {i + 2} = 1(无法发布)图片,请使用下面的链接获取公式) operation mode 1

同样适用于操作模式2.

例如。 011102220有效,但01110220不是。

111111或222222无效,但在其他与资源相关的限制条件下(系统将没有足够的资源来操作超过3个时间序列点),因此只要有关强制的问题变量数组中连续三个1或2是地址,应该没问题。

提前致谢,

2 个答案:

答案 0 :(得分:3)

长度恰好为3的运行可以建模为:

>>> a = np.array([0, 0, 0], dtype=float)
>>> a[0] = 0.5
>>> a[1] = 1.5
>>> a
array([ 0.5,  1.5,  0. ])

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

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)

答案 1 :(得分:-1)

让我们稍微简化问题:我们假设我们只有二进制值,这意味着我们只关心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,则它是大小&gt; = 3的块的一部分。它可以是4块。由于我不完全了解你的模型,这是我能提供的最通用的方法。当然,你可以根据你的情况进一步调整这一点!

对整数变量进行泛化不应该太难,但可能会引入新的辅助变量。