具有等待时间和优先级的调度算法

时间:2018-03-14 17:40:25

标签: algorithm scheduling

我已经浏览了一系列调度算法及其实现,但找不到任何参考来实现解决以下问题的算法。

给定一系列具有n个进程的进程,第i个进程由以下表示:

到达[i] 代表其到达时间,

离开[i] ,表示流程终止的时间(处理或未处理无关紧要)和

时间[i] 表示提供流程所需的时间,

表示布尔值的

Preferred [i] (如果首选该流程,则为true,否则为false)

我们需要安排流程以最大限度地处理首选流程。

一次只能处理一个进程,如果进程在完成之前离开,则表示未处理。否则,一旦启动,就不能暂停或中断进程。

“最佳”解决方案的标准依次为:

  1. 最受欢迎的流程。
  2. 提供的大多数非首选流程
  3. 最少的总处理时间。
  4. 任何想法都会受到赞赏。

1 个答案:

答案 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.

对于非首选流程,您仍然需要类似的功能 - 但是必须将流程调整到首选流程的间隙中。我将该延期作为学生的练习。 : - )

请注意,它会分解为很多微小问题,每个开放时间间隔一个。