有人能解释一下如何才能最佳地解决这个问题吗?
很明显,贪婪的方法不会产生最佳解决方案,即使这两个链接说SJF是最优的(我不认为他们考虑平均等待时间而是有标准最小化总执行时间)。从我能够弄清楚这个问题,似乎需要详尽地列出所有可能的工作时间表(排列)。但我不确定是否有基于动态编程的方法可以让人们获得最佳解决方案而无需穷尽地找到所有可能排列的平均等待时间。
问题:(r_i, t_i)
个n
个不同作业的数组中给出了作业请求时间和作业时间列表的列表。 r_i
表示作业请求进入时,即作业的到达时间或请求时间,t_i
表示作业执行所需的时间单位。只有一个人处理工作,一次只能在一个工作上工作。
使用输入数组N
计算给定(r_i, t_i)
个作业集的最短平均等待时间?
示例:列出(r_i, t_i)
:job-1(0, 3), job-2(2, 5), job-3(3, 2)
如果作业按job-1, job-2, job-3
的顺序完成,则:
等待job-1
=作业结束时间 - 作业请求时间= 3-0
job-2
= 8-2 = 6
job-3
= 10-3 = 7
所以平均等待时间是:(3 + 6 + 7)/ 3.
但是,如果按照job-1, job-3, job-2
的顺序完成这些工作:平均等待时间为:(3+2+8)/3 = 13/3
,这比原始订单更好。所以最小平均等待时间是13/3时间单位。
修改
正在将工作的等待时间定义为(完成时间 - 到达或请求时间)。人们也可以称之为周转时间。问题是最小化总等待时间/ N,如果假设等待时间的定义不同(作业开始时间 - 作业到达时间),则最小化总等待时间。
< / LI>SJF(最短作业优先)没有给出最佳时间表的例子:
J1(1,5) J2(2,2) J3(0,3)
最短的工作j2。但是选择j3,j2,j1比在j2,j3,j1(等待时间= 4 + 7 + 11)中首先选择j2更好的时间表(等待时间= 3 + 3 + 9)
在时间0,最短的工作是J1。 J1-J2作为时间表,总等待时间为100 + 102。 J2-J1计划表示最佳总等待时间为3 + 103。
答案 0 :(得分:1)
您的描述中有些内容尚不清楚:是否允许先发制人?即是否可以停止一项工作,启动另一项工作,然后再完成工作。在这两种情况下,您都可以查看this website,以了解您的问题是NP难的还是多项式可解决的。
此外,查看完成时间的总和或等待时间的总和是完全相同的,您只需添加/删除发布日期和处理时间的总和。
答案 1 :(得分:0)
听起来像作业车间安排这是 NP-complete (这是一种奇特的说法,今天没有人知道如何在合理的时间内最佳地解决它并向外扩展)。
查看诸如构造启发式之后的本地搜索(例如禁忌搜索)等算法。这些工作最好,如MISTA 2013等学术论文所证明。对于相关实施,请参阅我的开源Project Job Scheduling和Task assigning optmization实施/视频。