算法导论_16.5一个任务调度问题

一、任务调度问题描述

单个处理器对若干个单位时间任务进行最优调度, 其中每个任务都有一个截止期限和超时惩罚。
单个处理器上具有期限和惩罚的单位时间任务调度的输入如下,有三个数组:
1) 包含有n个单位时间任务的集合S = {a1, a2, a3, …, an};
2) n个整数值的期限d1, d2, …, dn, 即任务ai要求在di之前完成;
3) n个非负的权值(惩罚代价)w1, w2, w3,…, wn;如果ai在di之前没有被调度,就会有惩罚wi;
目标:找出一个S的调度,使得总的惩罚最小;

考虑一个给定的调度, 一个任务在限期之后完成的,这个任务就是迟了; 一个任务在限期之前完成, 这个任务就是早了;
一个任务的调度总是安排早任务优先的形式,其中早的任务总是在迟的任务之前完成。如果某个早的任务ai在迟任务之后aj, 那么调换ai, aj的次序, 并不会更改ai, aj的状态;
任意一个调度总是安排成这样一个范式, 早的任务先于迟的任务,并且按照期限的单调递增顺序对早任务进行调度;
实际操作中, 将调度安排成早任务优先的形式。只要在调度中有两个分别完成于时间k 和 k+1的早任务ai, 和aj,如果dj < di, 就交换ai 和 aj的位置,总是使得期限早的任务先执行;

如此, 寻找最优调度问题变成了一个寻找一个由最优调度中的早任务构成的集合A的问题,一旦A被确定之后, 就可以按照期限的单调递增顺序列出A中的所有元素,得到实际的调度(因为A中的的都是早任务优先,即截至期限早的任务先被调度,所以以单调递增顺序列出A中的元素,结果就是实际调度);
e是所有独立的任务集合A的族;

最小化延迟任务的惩罚之和问题与最大化早任务的惩罚之和的问题是一样的;在e中找到集合A,使得所有的惩罚之和最大, 这个A集合就是求解的任务调度;

二、任务调度的代码实现

将任务调度问题使用拟阵M = (S, L)解决。集合L是早任务的集合族;拟阵M是加权拟阵, 加权函数是惩罚值;
根据惩罚权值进行排序,将惩罚时间长短放在前面;
使用一个数组作为时间标识, 记录每个单位时间是否有任务安排;
如果截止日期相同,则根据时间长短判断哪个优先, 尽量将任务安排在截至时间完成,否则放在前一天;如果截至时间前都有任务安排,就舍去,增加到罚时中;

这里的贪心策略是:对于任务ai, 其截止时间是d[i], 贪心策略是尽量将任务ai安排在距离截止时间最近的空闲时间片;(这样将更早的时间片留给更需要的任务)

  • 1
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值