学习笔记:贪心算法

一:单机作业调度问题

首先,先展示问题

问题分析:

每一个作业要在有限个单位时间内完成才算这个作业的收益,比如有作业p,收益:(P1,P2)=(100,10),限期:(D1,D2)=(2,1),这个表明作业P1要在两个单位时间内完成才有收益100,而一台处理机完成一个作业需要一个单位时间。因此

算法思想:

要获得最大收益需要将限期由大到小排序,然后在相同限期的作业中,取收益最大的,尽量将每个不同限期的作业都用到,然后先完成限期小的,在完成限期大的,这样的话,限期小的完成了,限期大的还没到截止时间,

接下来用代码实现

这里将收益列表,限期列表排好序后,我想先在限期最小的作业中找收益最大的拿给处理机,然后在限期次小的作业中找收益最大的拿给处理机……如此下去。但在此时遇到了一个难题,如果第一个作业的限期是1,而第二个作业的限期是3,所有作业的限期【3,1,1】,那么我上面的想法就不能得出最优解。这时我想到用一个判断条件来进行区分,判断1.前一个作业的限期与后一个作业的限期差值为一,就像【2,1,1】一样,这样的话,限期为一的作业只需取一个就Ok。判断2.前一个作业与后一个作业的限期差值大于一,就像【5,3,3,1,1】,这样的话从前一个作业中取了一个后,就需要再取一个,然后将这两个的作业的限期相加,在判断限期差值是否为一,为一就到下一个限期的作业。比如先从【5,3,3,1,1】中取了一个1,然后取3,但3与1的差值不是1,所以再取一个1,1加1=2,2与3的差值为1,就到下一个更大的限期5,5与3的限期差值不是1,就要从5之前作业中取一个限期最小收益最大的作业1,如果作业1的限期与3相加得到的数,与5的差值不是1的话,就进行迭代,取作业2,作业3……zhi作业(1+……+n)的限期与3相加得到的数,与5的差值为1时,就得到了最优解。

具体的代码实现还没写出来,呜呜呜,脑袋好涨,写不下去代码了,目前还没有用代码证实这一猜想,所以不敢说我的这个思想得出得一定就是最优解。

方法二:穷举法

算法思想:

将所有的可行解列出来,然后从中选出最优解

代码如下

结果如下

不过我这只适用于前一个作业与后一个作业限期差值为1的情况。我这有点面向结果编程的意思了,还不通用,目前还在改进算法中

二:背包问题

算法思想:将物品的单位权值算出来,然后从大到小进行排序,同时也对物品重量和权值也进行排序。将排好序的物品,从第一个开始放入背包,将背包放满为止。其所得的权值即为最有解。

代码如下

结果:

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值