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

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

例如下图?:

9c60af91212c5ba33891be50c5a4b68c.png 当然,这不是最优调度哦

❗算法描述❗:

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

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

反例:

6968cba10f6553f95c485535c21720f5.png

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

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

反例:

00a979a26695f3da919e96f832db3c8c.png

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

}

测试:

17ece79939df480bcf6c380b6d47afad.png

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值