mixed-integer-programming - 使用 Time Windows 进行一维装箱
问题描述
嗨 StackOverflow 专家!
我有一个 1D Bin 包装满意度问题(即给出了 bin 的数量并且不需要最小化)。我认为这个问题非常简单,可以在这里找到 MIP 公式:https ://medium.com/swlh/exploring-the-bin-packing-problem-f54a93ebdbe5
但是,如果要打包的块有 Time Windows 怎么办?示例:假设每个 bin 的高度在 70 到 100 之间。一些块有一个打开的 TimeWindow,这意味着它们可能位于任何位置(在任何 bin 中)。但是如果一个 5 大的块的 TimeWindow 等于例如 [50,60],则块的开始必须位于 50 或更高,而块的结束必须位于 60 或更早。(即,如果位置 0 位于容器顶部,位置 100 位于容器底部,则块必须位于 100 高的容器中点的正下方)。
垃圾箱的(整数)大小约为 50-100,块的大小约为 2-25,TimeWindows 通常为 6-100 大。
因此,问题不再只是为每个块找到最佳 bin,而是将每个块定位在其分配的 bin 内。
应该是个有趣的问题!任何人都有好的 MIP 配方?:-)
解决方案
这可以建模为并行机器上的调度问题。让我们介绍一些符号:
- 让
J
是作业集(块)和M
机器集(箱) r_j
并且d_j
将是工作j
时间窗口的开始和结束(r表示发布日期,d表示截止日期)c_jm
是在机器上处理工作的成本,以及j
在机器上处理所需的时间。m
p_jm
j
m
x_jm
一个二进制变量,如果作业j
分配给机器m
,则为 1,否则为 0y_ij
另一个变量是 1 如果作业i
并且j
分配给同一台机器,作业在作业i
之前j
;0 否则s_j
和的开始和结束时间的e_j
连续变量j
,分别
有了这个,根据 Sadykov 和 Wolsey [SW],以下是一个众所周知的 MIP 公式:
目标函数最小化总处理成本(目标函数可以更改为另一种东西,因为 OP 只想解决可满足性),而约束表示:
- 每个作业都分配给一台独特的机器。
- 关联作业的开始和完成时间。
- 确保 if
y_ij = 1
, ie在同一台机器i
之前j
和由同一台机器处理,然后处理j
必须在结束之后i
开始。这里,U
是一个足够大的常数,可以设置为例如U = max_j d_j - min_j r_j
。 - 5. 是否尊重时间窗口。
- 逻辑约束;最多一个,
i
并且j
可以在另一个之前处理 - 保证如果
i
和j
被分配给m
,那么一个必须在另一个之前被处理。 - 如果作业
i
和j
被分配到不同的机器,那么y_ij = 0
和y_ji = 0
。 - 10. 限制变量域。
上面的参考资料包括几个不等式来收紧模型,以及一个计算基准比较和结合模型与约束编程。
编辑:在 OP 的情况下,所有箱子都是平等的,因此我们可以简化模型以考虑相同的机器(就每个作业的独特成本c_j
和处理时间而言p_j
,与机器无关)。
[SW] Sadykov, R. 和 Wolsey, LA (2006)。整数规划和约束规划在解决具有截止日期和发布日期的多机分配调度问题。INFORMS计算杂志,18 (2), 209-217。可在 ResearchGate 上在线获取。
推荐阅读
- data-science - 可以使用 foreach 循环来生成 R2 数据并将其存储为新列,同时删除当前变量
- c++ - 如何使用流序列化复杂的 POD?
- java - 如何使用条件限制对 Postgresql 数据库中的多个列进行求和和分组?
- python - 打字问题
- javascript - 如何使用 jQuery 动态添加标签?
- javascript - Javascript重复对象填充数组
- r - 在具有多个自变量的单变量逻辑回归后,将系数、置信区间和优势比存储在一个数据框中
- php - 如何在重定向 URL Laravel 8 和 Inertiajs 中保留哈希
- java - JSF 内存问题
- c# - c# UnitTesting 测试是否进行了 API 调用