Job Shop调度的约翰逊算法解决了2台机器和N个工作的情况
Job Pi有两个操作,持续时间为Pi1,Pi2,在机器M1,M2上完成。
Step 1. List A = { 1, 2, …, N }, List L1 = {}, List L2 = {}.
Step 2. From all available operation durations, pick the minimum.
If the minimum belongs to Pk1,
Remove K from list A; Add K to end of List L1.
If minimum belongs to Pk2,
Remove K from list A; Add K to beginning of List L2.
Step 3. Repeat Step 2 until List A is empty.
Step 4. Join List L1, List L2. This is the optimum sequence.
我不明白为什么这会给出“最佳”答案。这是wikipedia link
我认为这是一个反例:
工作集:
(2,3);(4,5);(6,7)
最终答案算法给出了机器1上的J1,J2,J3(2,4,6),而机器2始终处于空闲状态。相反,如果我们在机器1上调度J1,J2,在机器2上调度J3,那么我们可以早点完成它
任何人都可以解释我做错了什么。
答案 0 :(得分:1)
最终答案算法给出了机器1上的J1,J2,J3(2,4,6),而机器2始终处于空闲状态。相反,如果我们在机器1上调度J1,J2,在机器2上调度J3,那么我们可以更早地完成它。
没有。关键是作业由两部分组成,第一部分必须在机器1上完成,第二部分在第一部分完成后在第二台机器上完成。
所以在你的例子中,你得到序列{ J1, J2, J3 }
,这是正确的,它将被执行
J1[1]
; 2分钟J2[1]
和M2上的J1[2]
同时启动; 4分3分钟J3[1]
和M2上的J2[2]
开始 - 巧合的是,J2[1] > J1[2]
- 同时; 6分5分钟J3[2]
; 7分钟2 + 4 + 6 + 7 = 19
分钟,这是最快的方式。
目标是最大化M1上和M2上的活动之间的重叠。因此,如果您的第一部分工作时间较短,请先进行操作,尽快将机器2占用。如果可能的话,最后将第二部分做短的工作,这样机器1完成工作的时间很短。