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

时间:2016-07-21 18:41:27

标签: excel binary excel-2010 linear-programming solver

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

我当前的约束说。

300*d<=X<=450*d 

&#34; d&#34;是二元约束,&#34; X&#34;是我的决定变量。这种约束适用于我需要的东西。我的解算器决定每天运行机器多少钱。

但是,当d从0变为1时,我需要应用固定的成本惩罚。基本上说要关闭机器需要花费$26,000。我无法弄清楚如何做到这一点而不会出现错误,说我的求解器不是线性的。

因此,如果在第1天d=1和第2天d=0,我需要应用$26000的固定成本罚款,以便告诉机器尽可能长时间运行关闭。

非常感谢任何帮助。

2 个答案:

答案 0 :(得分:0)

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

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。但是,由于您的目标函数中会有$26,000*z_t,因此最佳解决方案可以灵活地选择z_t = 0,因为它比z_t=1便宜。

我希望这有帮助!

答案 1 :(得分:0)

在问题中是否存在关闭(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}

在目标中,您可以添加术语

26000 * sum(t, y(t))

(假设最小化)

详细说明:

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

关闭费用

非常相似:

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

其余的相同。