这个问题是《算法导论》上的一个经典的贪心算法问题——单处理器上具有期限和惩罚的单位时间任务调度问题,目标是使惩罚最小。
问题描述:
具有截止时间和误时惩罚的单位时间任务时间表问题可描述如下:
(1) n 个单位时间任务的集合S={1,2,…,n}(n≤500);
(2) 任务i的截止时间deadline[i],1≤d[i]≤n,即要求任务i在时间d[i]之前结束;
(3) 任务i 的误时惩罚1≤weught[i]<1000,即任务i 未在时间d[i]之前结束将招致w[i]的惩罚;若按时完成则无惩罚。
任务时间表问题要求确定S 的一个时间表(最优时间表)使得总误时惩罚达到最小。
实验要求:
(1)实现这个问题的贪心算法
(2)将每个 wi 替换为max{m1,m2…mn}—wi,运行算法比较结果。
输入与输出:
输入为任务的截止时间和任务未按时完成的惩罚
int[] deadline = new int[]{4,2,4,3,1,4,6}; // 任务期限,范围是闭区间[1,n]
int[] weight = new int[]{70,60,50,40,30,20,10}; // 任务未按时完成的惩罚
输出为最小的惩罚值、任务的具体调度顺序。
总的惩罚为:50
任务执行顺序为:
第1天执行的任务为: Task{id=3, deadline=3, weight=40}
第2天执行的任务为: Task{id=1, deadli