【算法概论】贪心算法:最小延迟调度问题

最小延迟调度问题 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.

       例如下图?:

【算法概论】贪心算法:最小延迟调度问题_第1张图片 当然,这不是最优调度哦

❗算法描述❗:

       在该题中,我们可以想到利用下面的贪心原则进行计算:

       ① Shortest processing time first 按每个任务的持续时间进行升序排序;

       反例:

【算法概论】贪心算法:最小延迟调度问题_第2张图片

       ② Earliest deadline first 按截止时间进行升序排序;

       ③ Smallest slack 按 dj - tj 的冗余进行升序排序。

       反例:

【算法概论】贪心算法:最小延迟调度问题_第3张图片

       我们考虑用第②种作为贪心原则。老师上课时的证明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;

	vector jobs(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;
}

测试:

【算法概论】贪心算法:最小延迟调度问题_第4张图片

 

你可能感兴趣的:(数据结构与算法)