2

我试图对一个系统组件的操作进行建模,该组件将有两种操作模式,我们称它们为1和2,再加上空闲模式0连续变量块在混合整数线性编程中具有相同的值

怠速没有限制,但每个操作模式将持续正好3个时间序列点,所以x_ {i} = 1意味着x_ {i + 1} = x_ {i + 2} = 1(无法发布图像,请使用下面的方程中的链接) operation mode 1

同样适用于操作模式2

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

111111或222222无效,但这是在其他资源相关约束(系统将没有足够的资源来操作超过3个时间系列点)时处理的,所以只要涉及到在变量数组中强制三个连续的1或2s是地址,应该没问题。

由于提前,

回答

-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,则它是大于等于3的块的一部分。它可以是4块。因为我完全不知道你的模型,这是我可以提供的最一般的方法。当然,你可以进一步调整你的情况!

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

+0

感谢您的快速回复! 你能详细介绍一下你的代码的第二块吗? !start_block v X [x]部分是否使start_block [x]为0以指示X中的三个连续的1? – BeWater

+0

不,它说:如果start_block [x] == 1 - >在x的pos x,x + 1,x + 2处将会有1。因此,它取决于您的剩余模型如何合并它(一般流程是:start-block意味着X上的东西;因此可能start_block是在其余模型中使用的变量)。在代码块中,只有最后一部分是相关的。上面的两个模块只是为了显示它来自哪里。 – sascha

+0

如果您需要某些其他方向的效果,您可以始终对其进行建模(例如,从X到start_block)。但对于至少3个大小的这种特殊情况,这个方向非常实用。 – sascha

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) 

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

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

谢谢!但是,如果y(t)= 0,y(t-1)= 1,那么第三个约束将读为y(t + 3)<= 0,是不是会导致对y值产生不需要的0值锁定? (因为y(t)= 0且y(t + 3)= 0,迫使y(t + 1)和y(t + 2)为0,所以10⇒10000 – BeWater

+0

恐怕我没有遵循如果'y(t)= 0,y(t-1)= 1',我们有'1-y(t + 3)> = -1'或者'y(t + 3)<= 2',这就是没有约束力 –

+0

你是完全正确的!我在计算中犯了一个愚蠢的错误,我对这种混淆表示歉意。 – BeWater

相关问题