带有期限和效益的单位时间的作业排序贪心算法

因为这里考虑的作业都能够在单位时间内完成,所以判断i是否可以纳入J中作为一个可行解的标准有以下三个:

①作业i可能的存储位置可以这样进行:将已经计入J中的作业从第k个作业开始,把作业i的期限值逐个与作业k、作业k-1、作业k-2、…、作业1做比较,直到找到一个位置q,这个位置q上的作业的期限值小于等与作业i的期限值,而位置q+1上的作业的期限值大于i的期限值,形式化描述位D(J(q))≤D(J(i))< D(J(q+1))。所以把位置q+1到位置k上的作业都后移一个位置,把位置q+1腾出后就是作业i可能插入的位置。做这样的处理后能够使D(J(1))≤D(J(2))≤…≤D(J(k+1))得到满足。因此第一个判断标准就是在数组J中找到第一个期限值小于作业i的期限值的那个作业的所在位置q。

②找到作业i的插入位置并把它插入数组J后,还要考虑i并入后是否能够保证已经在J中的所有作业能在期限值之内完成。由于作业i插入位置前的所有作业的位置都没有动过,因此它们肯定能在期限值规定时间内完成。这里主要考虑的是作业i插入位置后的那些移动位置的作业。这些作业往后移动一个位置,这就意味着轮到它们的执行时间往后推了一个单位时间。一个可行解应该是这些作业的执行时间往后推一个单位时间后,还能在它们各自的期限值之间完成。因此如果一个作业r的限期值等于它在数组中的所在位置,即D(J(r))=r,这样的作业是不能往后推的。因为如果后推后,它的新位置是r+1,而这个作业的期限值D(J(r))=r,后移后就不能使这个作业在有效期内得到完成。

综上两条,判断一个作业i应该的插入位置,应该从已经在J中作业的最后一个作业k开始往第1个作业扫描,用一个变量r表示正在扫描的那个作业。用D(J(r))>D(i) and D(J(r))≠r判断,如果条件不成立则表明要么找到了第一个期限值小于作业i的期限值的作业,要么发现了某个作业的D(J(r))=r它不保证J中的所有作业在它们的截止期限前完成的判断分析:

能后移;如果条件成立则继续往J中前面的作业扫描。当条件不成立的时候,就可以确定出某个位置r。

③通过以上两步的处理判断得到的位置r,就是确定的作业i的插入位置。但是找到这个位置并不意味着作业i能够插入形成可行解,因为如果作业i的期限值小于这个位置值r,即D(i)<r,将作业插入这个位置后作业i要在第r个时间才能开始执行,但是作业i的期限值明显规定该作业必须在r时间之前完成。所以在找到位置后,还要做第3个判断,即判断是否D(i)>r,如果大于表明作业i插入后才能形成可行解。

带有期限和效益的单位时间的作业排序贪心算法及说明:

由以上的分析可以写出以下的关于带有期限和效益的单位时间的作业排序的贪心算法如下: procedure JS(D, J,n, k)

1 integer D(0:n), J(0:n), i, k, n, r //数组D存放n个作业的期限值,这些存放在数组中的作业是按照它们产生的效益值非递减排序过的;数组J存放纳入成为可行解的作业;k代表已经处理放入J中的作业数量;i指示当前正在处理的作业;r表示扫描数组J时的当前扫描位置

2 D(0)←j(0)←0 //引入虚构作业0,是为了便于处理将作业插入位置1

3 K←1; J(1) ←1 //初始化时,把第1个作业放入J中,则当前已经处理放入J中的作业数量k为1

4 for i←2 to n do //第1个作业已经处理了,因此需要处理的作业是第2个到第n个

5 r←k // 从已经纳入J中的最后一个位置k的作业开始往前扫描

6 while D(J(r))>D(i) and D(J(r))≠r do //while循环判断寻找当前处理的作业i适合的插入位置

7 r←r-1

8 repeat

9 if D(J(r))≤D(i) and D(i)>r then //判断如果作业放在位置r后一个位置是否能够在期限值规定内完成

10 for i←k to r+1 by –1 do //用for循环把从位置r+1到位置k上的作业都往后移动一个位置。把r+1的位置空出来存放作业i

11 J(i+1) ←J(i)

12 repeat

13 J(r+1) ←i; k←k+1//把作业i放入r+1的位置上,总共处理放入J中的作业数目增加1 14 endif

15 repeat

end JS

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值