作业车间调度优化——最小化总完工时间建模困惑求助
Hey Brian, 看起来你已经找对了开头的决策变量,我来帮你把这个建模补全,顺便理清楚关键的约束逻辑~
首先先明确你的问题类型:这是同速平行机调度问题(4台加工速度相同的机器,作业无优先级、不可中断),目标是最小化总完工时间(所有作业完工时间之和,记为$\sum C_j$)。这个问题其实有成熟的最优调度策略,但先回到你关心的建模部分。
已有的决策变量(你选的这个很合适)
x_{ij}:二进制变量,当作业$j$被分配到机器$i$上加工时取1,否则取0(其中$i = 1,2,3,4$;$j = 1,2,...,15$)
需要补充的变量
光有分配变量没法计算完工时间,得加几个关键变量:
C_j:连续变量,表示作业$j$的完工时间S_j:连续变量,表示作业$j$的开始时间- (可选但高效)
y_{jk}:二进制变量,当作业$j$在作业$k$之前加工时取1,否则取0(用于约束同一机器上的作业不重叠)
约束条件
1. 作业分配约束
每个作业必须且只能被分配到一台机器上:
$$\sum_{i=1}^4 x_{ij} = 1 \quad \forall j = 1,2,...,15$$
2. 作业时间基本关系
作业的完工时间等于开始时间加上自身加工时间:
$$C_j = S_j + P_j \quad \forall j = 1,2,...,15$$
3. 同一机器的作业不重叠约束
这是建模的核心难点,我们用大M法结合排序变量来处理:
对于任意两个不同的作业$j$和$k$,以及任意机器$i$:
$$S_j + P_j \leq S_k + M(1 - x_{ij} - x_{ik} + y_{jk})$$
$$S_k + P_k \leq S_j + M(1 - x_{ij} - x_{ik} + (1 - y_{jk}))$$
这里的$M$是一个足够大的常数(比如取所有作业加工时间的总和,确保约束在需要时生效)。逻辑是:
- 如果$j$和$k$都被分配到机器$i$(即$x_{ij}=1$且$x_{ik}=1$),那么两个约束会强制要么$j$在$k$前加工($y_{jk}=1$,第一个约束生效),要么$k$在$j$前加工($y_{jk}=0$,第二个约束生效),保证作业不重叠。
- 如果$j$或$k$没有被分配到机器$i$,那么$1 - x_{ij} - x_{ik}$至少为0,加上后面的项后,右边会远大于左边,约束自动满足。
4. 基础变量约束
所有时间变量非负,二进制变量只能取0或1:
$$S_j \geq 0, C_j \geq 0 \quad \forall j$$
$$x_{ij} \in {0,1}, y_{jk} \in {0,1} \quad \forall i,j,k$$
目标函数
我们的目标是最小化所有作业的完工时间之和:
$$\text{Minimize} \quad \sum_{j=1}^{15} C_j$$
额外小贴士:最优调度策略
其实这个问题不需要求解整数规划就能得到最优解,用**LPT算法(最长加工时间优先)**即可:
- 把所有作业按加工时间从大到小排序
- 依次将作业分配给当前总负载(已分配作业加工时间之和)最小的机器
这个策略能保证得到最小总完工时间,如果你只是需要最优调度结果,这个方法比建模求解快得多~
内容的提问来源于stack exchange,提问作者BrianW




