为二进制从 0 更改为 1 分配惩罚的求解器约束

Solver Constraint to assign a penalty for binary changing from 0 to 1

我正在创建一个生产调度求解器,其中机器 "X" 可以 运行 在 300 到 450 个单位之间,或者可以关闭机器。

我当前的约束条件是。

300*d<=X<=450*d 

"d"是二元约束,"X"是我的决策变量。此约束可以很好地满足我的需要。我的求解器正在决定每天给机器 运行 多少。

但是,当 d 从 0 变为 1 时,我需要应用固定成本惩罚。本质上是说关闭一台机器需要 ,000。我无法弄清楚如何在没有错误提示我的求解器不是线性的情况下执行此操作。

所以如果第 1 天 d=1 和第 2 天 d=0,我需要应用 000 的固定成本惩罚以告诉机器 运行 尽可能长时间不关机。

非常感谢任何帮助。

您可以引入在成对的连续几天内定义的新变量,这将应用以下逻辑:

if d_t + d_t-1 = 1 then z_t = 1, otherwise z_t = 0

其中 t 是日期索引,d_t 是显示机器在 t 日期是否打开的二进制变量,z_t 是新引入的变量,显示天数 t-1t.

之间是否有切换

要执行此逻辑,您需要以下约束:

z_t <= d_t + d_t-1
z_t >= d_t - d_t-1
z_t >= d_t-1 - d_t

为什么这样有效

这里是 d_td_t-1z_t 的所有可能值的集合,因为它们是上述约束的结果:

 d_t   |   d_t-1   |   z_t
--------------------------
  0    |     0     |    0
  0    |     1     |    1
  1    |     0     |    1
  1    |     1     |    {0, 1}

请注意,在最后一种情况下,当 d_td_t-1 都是 1 时,约束不会将 z_t 强制为特定值。但是,由于您的 objective 函数中将包含 ,000*z_t,因此最佳解决方案将在具有灵活性的情况下选择 z_t = 0,因为它比 z_t=1 便宜.

希望对您有所帮助!

关于我们是否对关闭(d=1 后跟 d=0)或启动(d=0 后跟 d=1)有惩罚这一问题存在一些混淆。这是启动和关闭成本的标准公式(用于许多调度模型)。另一个答案提出了类似的表述,但这种形式在实践中使用不多。

启动成本

我们需要一个仅在 d(t-1)=0 和 d(t)=1 时强制变量 y(t)=1 的结构。这可以使用

来完成
y(t) >= d(t) - d(t-1)
y(t) in {0,1}

在objective中您可以添加术语

26000 * sum(t, y(t))

(假设最小化)

详情:

  • d(0) 是我们开始规划时的机器状态window(即给定)
  • y(t)可以放宽到y in [0,1]

关闭成本

非常相似:

y(t) >= d(t-1) - d(t)
y(t) in {0,1}

其余相同