最优流水调度问题
问题描述:
设有n个作业,每一个作业i均被分解为m项任务: Ti1, Ti2, ┅ , Tim(1≤i≤n,故共有n*m个任务),要把这些任务安排到m台机器上进行加工。
现在有三条限定:
1、 每个作业i的第j项任务Tij (1≤i≤n, 1≤j≤m)只能安排在机器Pj上进行加工;
2、 作业i的第j项任务Tij(1≤i≤n, 2≤j≤m)的开始加工时间均安排在第j-1项任务Ti,j-1加工完毕之后;
3、 任何一台机器在任何一个时刻最多只能承担一项任务。
最优流水作业调度:设任务Tij在机器Pj上进行加工需要的时间为tij。如果所有的tij(1≤i≤n, 1≤j≤m)均已给出,要找出一种安排任务的方法,使得完成这n个作业的加工时间为最少。已经证明,当机器数(或称工序数)m≥3时,流水作业调度问题是一个NP-hard问题。
这里就考虑n个作业对于2个机器(P1,P2)的调度。现在问题就是:给定n个作业T,每个作业可以分成两项任务A,B;其中A任务在P1处理,B任务在P2上处理。如何给出一个使得这个n个作业的加工时间最短?
问题解决:
分析:
首先考虑最优流水调度的性质:
1、 在所确定的最优调度的排列中去掉第一个执行作业后,剩下的作业排列仍然还是一个最优调度,即该问题具有最优子结构的性质。
2、 在计算规模为n的作业集合的最优调度时,需多次使用该作业集合的子集合的最优调度,即该问题亦具有高度重复性。
So… 考虑用动态规划求解这个问题咯~
设N={1,2,┅,n}是全部作业的集合,作业集S是N的子集S∈N。在我们对S中的第一个作业开始进行加工时,机器P2上加工的其它作业可能还尚未完成,不能立即用来对S中的作业进行加工。
假设对机器P2需等待t个时间单位以后才可以用于S中的作业加工(t也可以为0即无须等待),记为g(S,t)。
现选定作业i为S中第一个加工作业之后,在机器P2上开始对S-{i}中的作业进行加工之前,所需要的等待时间为bi+max{t-ai,0}。这是因为,若P2在开始加工S中的作业之前需等待t个时间单位且t > ai,则作业i在P1上加工完毕(需时ai)之后,还要再等t-ai个时间单位才能开始在P2上加工;若t≤ai,则作业i在P1上加工完毕之后,立即可以在P2上加工,等待时间为0。故P2在开始对S-{i}中的作业进行加工之前,所需要的等待时间为t’= bi&#