达到最高效益的调度
2012-09-29 13:55
423 查看
/article/2982264.html
问题: 假设有一台机器,以及在此机器上处理的n个作业a1,a2,...an的集合。每隔作业aj有一个处理时间tj,效益pj,以及最后期限dj。机器在一个时刻只能处理一个作业,而且作业aj必须在tj连续时间单位内不间断地运行。如果作业aj在最后期限dj之前完成,则获得效益pj,但如果在最后期限之后才完成,则没有效益。请给出一个动态规划算法,来寻找能获得最大量效益的调度,假设所有的处理时间都是1到n之间的整数。
分析:
其实这个问题类似于01背包问题。
1. 将a1,a2,…,an按照dj值排序,从小到大。假设接下来的分析中,已经保证当i<j时,di<dj。添加d0=0。
2. 构建数组s
[d
],s[i][j]代表在j时间内,调度i个作业,所得最高效益值。初始时,令s[i][0] = 0(i = 0->n),s[0][j] = 0(j = 0->d
)。
3. 求s[i][j]的值,select[i][j]用于记录是否选择i。这里递归包含了一种思想:如果第i个作业被调度,那么最好使其在期限时正好结束,这样能够保证i之前的作业能够在更充裕的时间内被调度。
我之前任务这就是一个单纯的背包问题,不理解上面为什么要排序,为什么要求min
下面的段错误的代码:
这是因为任务有截止期限的,所以必须按照di从小到大排序
下面的代码比较好理解
问题: 假设有一台机器,以及在此机器上处理的n个作业a1,a2,...an的集合。每隔作业aj有一个处理时间tj,效益pj,以及最后期限dj。机器在一个时刻只能处理一个作业,而且作业aj必须在tj连续时间单位内不间断地运行。如果作业aj在最后期限dj之前完成,则获得效益pj,但如果在最后期限之后才完成,则没有效益。请给出一个动态规划算法,来寻找能获得最大量效益的调度,假设所有的处理时间都是1到n之间的整数。
分析:
其实这个问题类似于01背包问题。
1. 将a1,a2,…,an按照dj值排序,从小到大。假设接下来的分析中,已经保证当i<j时,di<dj。添加d0=0。
2. 构建数组s
[d
],s[i][j]代表在j时间内,调度i个作业,所得最高效益值。初始时,令s[i][0] = 0(i = 0->n),s[0][j] = 0(j = 0->d
)。
3. 求s[i][j]的值,select[i][j]用于记录是否选择i。这里递归包含了一种思想:如果第i个作业被调度,那么最好使其在期限时正好结束,这样能够保证i之前的作业能够在更充裕的时间内被调度。
for i = 1->n for j = 1->d[i] //不调度i s[i][j] = s[i-1][min(j, d[i-1])] select[i][j] = false //调度i if j>t[i] if s[i][j] < s[i-1][min(j-t[i], d[i-1])]+p[i] s[i][j] = s[i-1][min(j-t[i], d[i-1])]+p[i] select[i][j] = true
我之前任务这就是一个单纯的背包问题,不理解上面为什么要排序,为什么要求min
下面的段错误的代码:
int maxV = 0x80000000; int f = {0}; for (int i = 0; i < n; ++i ) { for (int v = work[i].deadline; v >= work[i].time; --v) { f[v] = max(f[v],f[v - work[i].time] + work[i].productivity); if (maxV < f[v]) maxV = f[v]; } } cout<<maxV<<endl;
#define N 10 //每个作业作为一个结点 struct node { int time;//处理时间 int productivity;//效益 int deadline;//最后期限 }work ;
这是因为任务有截止期限的,所以必须按照di从小到大排序
下面的代码比较好理解
sort(); int end = deadline[0] - time[0]; for (int i = 0; i < end; ++i) f[0][i] = 0; for (int i = end; i<= deadline[0]; ++i) f[0][i] = value[i]; for (int i = 1; i < n; ++i) { for (int j = 0; j <= deadline[i]; ++j) { if (j< time[i])//如果结束时间比运行时间还少, 则不能选择这个作业 { f[i][j] = f[i-1][min(j,deadline[i-1])]; } else { int end = j - time[i]; f[i][j] =max( f[i-1][min(end, deadline[i-1])] + value[i], f[i-1][deadline[i-1]]);//如果和前一个冲突,选与不选的问题 } } }
相关文章推荐
- 达到最高效益的调度
- 算法导论-15-7-达到最高效益的调度
- 算法导论-15-7-达到最高效益的调度
- 算法导论-15-7 达到最高效益的调度
- 动态规划--达到最高效益的调度
- 算法导论---达到最大效益的调度
- 算法导论15 dp 最高效益调度
- 让PHP7达到最高性能的几个Tips
- pku1157-------LITTLE SHOP OF FLOWERS(简单动态规划题:摆放鲜花使审美价值达到最高)
- 项目管理人员达到最高层所需的八大能力
- uC/OS-II任务调度之就绪表及最高优先级任务判定算法
- 让PHP7达到最高性能的几个Tips
- 程序员怎样才能达到编程的最高境界
- 多人连接打印机提示达到最高值出错的解决方法
- 让 PHP7 达到最高性能的几个建议
- 移形幻影,把不同的两个文件,合成一个文件,以达到掩饰最高境界!哈哈,好文章!!!
- 让PHP7达到最高性能的几个Tips
- 单表查询如何建立索引让你的查询语句性能达到最高
- 04 Dec 15 让PHP7达到最高性能的几个Tips
- 【Codeforces Beta Round 2A】【模拟 map 有map的java实现哦】Winner 第一个达到最终最高分的人名