我正在创建一个生产调度解算器,其中机器" 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
的固定成本罚款,以便告诉机器尽可能长时间运行关闭。
非常感谢任何帮助。
答案 0 :(得分:0)
您可以引入一对连续几天定义的新变量,它将应用以下逻辑:
if d_t + d_t-1 = 1 then z_t = 1, otherwise z_t = 0
其中t
是日期索引,d_t
是二进制变量,显示机器是否在t
天内打开,z_t
是新引入的变量,显示日期t-1
和t
之间是否有切换。
要强制执行此逻辑,您需要以下约束:
z_t <= d_t + d_t-1
z_t >= d_t - d_t-1
z_t >= d_t-1 - d_t
为什么会这样?
以下是d_t
,d_t-1
和z_t
的所有可能值的集合,因为它们来自上述约束:
d_t | d_t-1 | z_t
--------------------------
0 | 0 | 0
0 | 1 | 1
1 | 0 | 1
1 | 1 | {0, 1}
请注意,与上一种情况相比,当d_t
和d_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))
(假设最小化)
详细说明:
y in [0,1]
关闭费用
非常相似:
y(t) >= d(t-1) - d(t)
y(t) in {0,1}
其余的相同。