最小延迟调度问题 Scheduling to Mnimizing Lateness
问题描述:
假定有一单个的资源在一个时刻只能处理一个任务。现给定一组任务,其中的每个任务 i 包含一个持续时间 ti 和截止时间 di 。设计与实现一个算法,从t = 0 时刻开始任务,对这组任务给出一个最优调度方案,使其对所有任务的最大延迟最小化。
Single resource processes one job at a time.
Job i requires ti units of processing time and is due at time di.
If i starts at time si it finishes at time fi = si + ti.
Lateness: li = max{0, fi - di};
Goals: schedule all jobs to minimize lateness L.
例如下图?:
当然,这不是最优调度哦
❗算法描述❗:
在该题中,我们可以想到利用下面的贪心原则进行计算:
① Shortest processing time first 按每个任务的持续时间进行升序排序;
反例:
② Earliest deadline first 按截止时间进行升序排序;
③ Smallest slack 按 dj - tj 的冗余进行升序排序。
反例:
我们考虑用第②种作为贪心原则。老师上课时的证明emmm没太听懂,有两方面 no idle time 和 no inversions.
伪代码:
Sort n jobs by deadline so that d[1] ≤ d[2] ≤ … ≤ d[n]
t = 0
for j = 1 to n
Assign job j to interval [t, t + t[j]]
s[j] = t, f[j] = t + t[j]
t = t + t[j]
output intervals [s[j] , f[j]] for j = 1 to n
代码:
#include #include #include using namespace std;
struct JOB
{
int time;
int deadline;
};
bool comp(JOB &a, JOB &b);
int main()
{
int num;
cout << "请输入工作数:" << endl;
cin >> num;
vectorjobs(num);
cout << "请输入各项工作的持续时间和截止时间:" << endl;
for (int i = 0; i < num; ++i)
{
cin >> jobs[i].time >> jobs[i].deadline;
}
sort(jobs.begin(), jobs.end(), comp);
/*cout << "排序后:" << endl;
for (int i = 0; i < num; ++i)
{
cout << jobs[i].time << ' ' << jobs[i].deadline << endl;
}*/
int start = 0;
int lateness = 0;
cout << "最优调度:" << endl;
for (int i = 0; i < num; ++i)
{
cout << start << ' ' << jobs[i].time + start << endl;
start += jobs[i].time;
lateness += max(0, start - jobs[i].deadline);
}
cout << "最小延迟时间:" << lateness << endl;
return 0;
}
bool comp(JOB &a, JOB &b)
{
return a.deadline < b.deadline;
}
测试: