使用贪婪算法解决作业调度问题

对于贪婪算法的基本思想是,在给定判断条件下,如果每次选择当下能够得到的最佳回报的选项,在很多情况下,这么做使无法实现最优解的,但是贪婪算法要能产生最优解,那他所对应的问题必须是具有特定的递归结构的。

而在某种条件的判断下选取出来最优方案之后,问题的规模就会变小,但是性质使不会发生+变化的,也就是说在+做出当前选择之后,问题的规模就会变小,但使用原来的方法所做出的选择依然是可以得到最优解。所以说贪婪算法要能够产生作用,它对应的问题必须具有以下性质,第一就是当前做出的选择不受到后面做出的选择的影响。例如这里要说的作业调度问题,如果一个工厂要求在给定的时间段内尽可能多的完成给定的既定任务,每个人都有规定的起始时间和结束时间,而共产一次是只能够执行一个任务的,也就是说,如果两个任务的起始时间和结束时间存在重合,那工厂是只能够选择其中之一来完成。

添加图片注释,不超过 140 字(可选)

添加图片注释,不超过 140 字(可选)

对于给定的如上例子,给出的最优解决方案如上,而对于贪婪算法来解决这个任务调度问题,给定时间段[0,T]之后,选择一个起始时间最晚但又能完成的任务,假设选定的任务的起始时间是t,接下里的问题就会变成如何在时间段[0,t]内选择任务,注意到此时的选择与上一次的选择是没有相互影响的,无论在[0,t]时间段内选择任务任务,上次选择的任务都不会受到影响,[0,t]内对应的任务完全可以和上一次选择的任务结合在一起形成问题的解。

第二个就是问题存在递归性质或间套结构,在任务调度问题中,一开始问题的规模是[0,T],在做出一个选择后问题的规模就变成了[0,t],后者比前者的规模更小,但是要解决的问题的性质是相同的,依然是如何在给定的时间段内选择最多的任务。

因此在规模变化前适用的啊原则,在问题规模变化之后依然适用,一旦要解决的问题具备着两点性质,就可以考虑使用贪婪算法的设计思想来解决该问题。

而使用python来解决调度问题的思路和代码如下:

T = 30  #时间段
N = 20  #任务总数
Tasks = []
for i in range(N):  #初始化每个任务的起始和结束时间
    a = random.randint(0, 30)
    b = random.randint(0, 30)
    Tasks.append([min(a, b), max(a, b)])
Tasks.sort(key = lambda x:x[0], reverse = True)  #将任务按照起始时间降序排列
print("all tasks time intervel are: {0}".format(Tasks))
S = []
for task in Tasks:
    if task[1] <= T:  #选择能在给定时间段内完成且起始时间最晚的任务
        S.append(task)
        T = task[0]  #选择任务后修改时间段
print("the best tasks combination are : {0}".format(S))

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值