8月22日贪心法.pptVIP

  1. 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
  2. 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  3. 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
  4. 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
  5. 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们
  6. 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
  7. 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
8月22日贪心法

任务调度问题 一个单位时间任务是个作业,如要在计算机上运行一个程序,它恰覆盖一个单位的运行时间.给定一个单位时间任务的集合S,对S的一个调度即S的一个排列,其中规定了这些任务的执行顺序.该调度中的第一个任务开始于时间0,结束于时1;第二个任务开始于时间1,结束于时间2,…… 单处理器上具有期限和罚款的单位时间任务调度问题的输入如下: 1.包含n个单位时间任务的集合S=1,2,……,n; 2.n个取整的期限d1 ,……,dn ,(1≤d,≤n),任务i要求在di 前完成; 3.n个非负的权(或罚款)w1 ,……,wn .如果任务i没在时间di 之前结束,则导致罚款wi ; 要求找出S的一个调度,使之最小化总的罚款. 定义两个概念: 迟任务──调度中在规定期限后完成的任务,试题要求解出最小化迟任务的罚款总和; 早任务──调度中在规定期限前完成的任务,最大化早任务的罚款总和正好对应问题的解; 任意一个调度可通过下述方式安排成规范形式: 1.按期限递增的顺序对早任务进行调度。即只要在调度中有两个分别完成于时间K和K+1的早任务i、j且dj di ,我们就互换i和j的位置,使得任务i在交换后仍然是早的,而任务j被移到更前的位置; 2.如果某个早任务X跟在迟任务Y之后,我们可以交换X和Y的位置,使得早任务先于迟任务;某一调度中早任务的集合构成了一个独立的任务集A,因为A中任务按期限单调递增的顺序进行调度后,没有一个任务是迟的,且A中期限为t或更早的任务个数小于等于t。 我们可以采用贪心法找出具有最大总罚款的独立任务集A。这个任务集正好对应最小化迟任务的罚款总和。 例如 任务i 1 2 3 4 5 6 7 期限di 4 2 4 3 1 4 6 罚款wi 70 60 50 40 30 20 10 最初,我们设所有n个时间空位都是空的。然后按罚款的单调递减顺序(任务1,任务2,任务3,任务4,任务5,任务6,任务7)来考虑各个子任务。在考虑任务j时,如果有一个恰处于或前于dj 的时间空位仍空着,则将任务j赋与最近的这样的空位,并填入;如果不存在这样的空位,则将任务j赋与一个还未被占的、最近的空位。 按上述贪心策略选择了任务1,2,3,4,7,放弃任务5,6。最终的最优调度为〈2,3,4,1,7,5,6〉,其总的罚款为W5 +W6 =50 设N─任务个数,num─目前早任务个数;t─罚款总和 list─任务序列。其中list[i].k、 list[i].d、 list[i].w为任务I的编号,期限和罚款。 list[i].k0,则任务i为早任务;list[i].k0,则任务i为迟任务;lt─辅助数组 Pck为早任务的编号序列; 算法如下: 读入任务数N; For i := 1 to N Do Begin 读入任务i的期限List[i].d和罚款List[i].w; List[i].k := I{记下其序号} End;{for} list序列按罚款单调递减的顺序排序 ; ? num := 0; For i := 1 to N Do Begin{依次处理每一个任务} t := 0;{统计目前num个早任务中期限小于等于num的任务个数t} For j := 1 to num Do If List[Pck[j]].d = num Then Inc(t); If t List[i].d Then Begin{若有一个恰处于或前于第j个任务期限的时间空位,则早任务个数+1;任务i进入早任务集合} Inc(num);Pck[num] := i; List[i].k := - List[i].k;{设任务i为早任务标志} j := num;{将早任务按期限递增顺序排列} While (j 1) And (List[Pck[j]].d List[Pck[j - 1]].d) Do Begin t := Pck[j]; Pck[j] := Pck[j - 1]; Pck[j - 1] := t;Dec(j); End{while} End{then} End;{for} For i := 1 to num Do打印第I个早任务的序号- List[Pck[i]].k; t := 0;{打印所有迟任务并累计罚款总和} For i := 1 to N Do

文档评论(0)

yan698698 + 关注
实名认证
文档贡献者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档