我正在尝试模拟系统组件的操作,该组件将有两种操作模式,让我们称它们为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是地址,应该没问题。
提前致谢,
答案 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块。由于我不完全了解你的模型,这是我能提供的最通用的方法。当然,你可以根据你的情况进一步调整这一点!
对整数变量进行泛化不应该太难,但可能会引入新的辅助变量。