6设有n项任务加工时间分别表示为正整数t1t2t3…tn现有2台同样的机器从0时刻开始安排对这些任务的加工规定只要有待加工的任务任何机器就不得闲置。如果直到时刻T所有任务都完成了总的加工时间就等干T设计一个算法找到使得总加工时间T达到最小的调度方案设给定实例如下t1=1t2=5t3=2t4=10t5=3试给出一个加工时间最少的调度方案给出代码过程和问题的解
一种解法是使用贪心算法,将任务按照加工时间从大到小排序,然后依次将任务分配给当前加工时间较短的机器进行加工。具体步骤如下:
- 将任务按照加工时间从大到小排序。
- 初始化两台机器的加工时间为0。
- 依次将任务分配给当前加工时间较短的机器进行加工,直到所有任务都完成。
- 计算总的加工时间T。
根据这个算法,对于给定实例,可以得到以下调度方案:
机器1:t4(10) -> t2(5) -> t5(3) -> t3(2) -> t1(1) 机器2:0 -> 1 -> 6 -> 8 -> 13
总的加工时间为13,符合要求。
代码实现如下:
def schedule(tasks):
# 将任务按照加工时间从大到小排序
tasks.sort(reverse=True)
# 初始化两台机器的加工时间为0
machine1, machine2 = 0, 0
# 依次将任务分配给当前加工时间较短的机器进行加工
for task in tasks:
if machine1 <= machine2:
machine1 += task
else:
machine2 += task
# 计算总的加工时间T
T = max(machine1, machine2)
return T
问题的解:
- 为什么将任务按照加工时间从大到小排序?
这是因为贪心算法的核心思想是每次选择当前最优解,而在本问题中,任务的加工时间越长,需要占用机器的时间也越长,因此优先考虑加工时间长的任务可以使得总的加工时间更短。
- 为什么每次选择当前加工时间较短的机器进行加工?
这是因为如果选择加工时间较长的机器进行加工,可能会使得另一台机器空闲时间变长,从而增加总的加工时间。因此优先选择加工时间较短的机器可以使得任务的加工更加高效
原文地址: http://www.cveoy.top/t/topic/fp13 著作权归作者所有。请勿转载和采集!