我已经浏览了一系列调度算法及其实现,但找不到任何参考来实现解决以下问题的算法。
给定一系列具有n个进程的进程,第i个进程由以下表示:
到达[i] 代表其到达时间,
离开[i] ,表示流程终止的时间(处理或未处理无关紧要)和
时间[i] 表示提供流程所需的时间,
表示布尔值的Preferred [i] (如果首选该流程,则为true,否则为false)
我们需要安排流程以最大限度地处理首选流程。
一次只能处理一个进程,如果进程在完成之前离开,则表示未处理。否则,一旦启动,就不能暂停或中断进程。
“最佳”解决方案的标准依次为:
任何想法都会受到赞赏。
答案 0 :(得分:1)
我怀疑你的最佳解决方案是一个简单的反向跟踪算法 - 尝试所有可能性,用分数评估每个"错过点数":最小化你做的首选进程的数量不完成。
首先,进行一些预处理:
现在,只需进行经典的try-everything递归:
Base Case:
If process list is empty, move to handling non-preferred processes in a similar function.
Case 1: Serve the first process `P` on the list.
skipped [remains unchanged]
new_served_list = served_list + P (append)
new_start = current start time + `Time(P)`
new_total = total processing time + `Time(P)`
// remove processes whose latest start time will be passed:
new_proc_list = proc_list - {any process with `latest_start(P) < start_time`}.
Recur on (new_start, new_total, new_served_list, new_proc_list)
save `result_1`
Case 2: *Don't* serve the first process.
new_skipped = skipped + 1
new_proc_list = proc_list - `P`.
recur on (start, total, served_list, new_proc_list)
save `result_2
Compare result_1 and result_2; return the better one.
对于非首选流程,您仍然需要类似的功能 - 但是必须将流程调整到首选流程的间隙中。我将该延期作为学生的练习。 : - )
请注意,它会分解为很多微小问题,每个开放时间间隔一个。