当前位置:
首页 >
基础算法 —— 调度问题 —— 多机并行调度问题
发布时间:2025/3/17
51
豆豆
生活随笔
收集整理的这篇文章主要介绍了
基础算法 —— 调度问题 —— 多机并行调度问题
小编觉得挺不错的,现在分享给大家,帮大家做个参考.
【概述】
多机调度问题可表达为:n 个工件由 k 个可并行工作的机器加工,完成任务 i 需要的时间为 ti,调度目标是确定这 n 个工件完成的最佳加工顺序,使得完成全部任务的时间最早,其可利用 回溯法 来求解
【问题分析】
问题实质是要从 n 个作业中找出有最小完成时间和的作业调度,因此批处理作业调度问题的解空间是一棵排列树。
开始时,所给的 t[n] 为 n 个作业的完成时间,则相应的排列树由 t[1:n] 的所有排列构成
用数组 len[n] 存储一组空间解,getTime() 计算一个完整调度的完成时间,res 记录当前最佳调度的完成时间
在进行搜索时,从第一个任务开始,对树的深度进行递归:
- 当 deep=n 时,搜索至叶结点,得到一个新的作业调度方案,此时更新最优值与相应的最佳调度
- 当 deep<n 时,若当前扩展结点位于排列树的第 n-1 层,说明需要对下一个要安排的作业进行搜索,并向第 n-2 层回溯,从而对相应子树进行搜索
【实现】
int n,k; int t[N]; int len[N]; int res=INF; int getTime() {int temp=0;for(int i=0; i<k; i++)temp=max(len[i],temp);return temp; } void dfs(int deep) {if(deep==n) {int temp=getTime();res=min(res,temp);return;}for(int i=0; i<k; i++) {len[i]+=t[deep];if(len[i]<res)dfs(deep+1);len[i]-=t[deep];} } int main() {scanf("%d%d",&n,&k);for(int i=0; i<n; i++)scanf("%d",&t[i]);dfs(0);printf("%d\n",res);return 0; }
总结
以上是生活随笔为你收集整理的基础算法 —— 调度问题 —— 多机并行调度问题的全部内容,希望文章能够帮你解决所遇到的问题。
- 上一篇: 计算几何 —— 二维几何基础 —— 三角
- 下一篇: 信息学奥赛一本通(1015:计算并联电阻