11089 多机最佳调度
时间限制:13000MS 内存限制:65535K
提交次数:0 通过次数:0
题型: 编程题 语言: 无限制
Description
假设有n个任务(n<=100),m台机器(m<=50),任务可以由任何一个机器完成,完成任务i需要的时间为ti, 请设计两种算法(一种采用贪心算法,另一种采用回溯算法),找出完成这n个任务的最佳调度,使得最早时间完成全部任务。 这里采用两种算法来求解: 1)贪心算法可以得到近似的最早完成时间,算法思想在书上4.7节。 2)回溯算法搜索m叉树(除叶节点外每个节点m个儿子),寻找最早的完成时间。
输入格式
输入两行,第一行为n和m,中间空格相连(其中n表示任务的数量,m表示机器的数量),(n<=100, m<=50)。 第二行的n个数是任务i的处理时间ti。
输出格式
输出两行,第一行为采用贪心算法算出的最早完成时间,第二行为采用回溯算法搜索出的最早完成时间。
输入样例
7 3 2 14 4 16 6 5 3 另一个输入示例: 14 3 10 10 10 10 10 7 7 7 7 7 5 5 5 5
输出样例
17 17 另一个输出示例: 37 35
提示
第(1)个贪心算法按书上思想去实现。 第(2)个就是在m叉树上深度优先搜寻最优解的过程。 //t数组为初始的任务处理时间; //len2数组为第二种回溯算法在搜索过程中已探察过任务的完成时间和; //x数组用来保存探察过的任务编号。 void backtrack (int dep) { if (dep == n) //叶子,或者if (dep>n),看首次调用backtrack参数是0还是1 { …… return; } for(int i = 0; i < m; i++) { len2[i] += t[dep]; x[dep] = i+1; if(len2[i] < best) { backtrack(dep+1); } len2[i] -= t[dep]; } }
#include <iostream>
#include <stdio.h>
#include <algorithm>
using namespace std;
int n,m;
int t[1000]={0};
int a[100]={0};
int aa[100]={0};
int res=100000;
int greedy(){
sort(t,t+n);
if(n<m){
int res=t[0];
for(int i=1;i<m;i++) //取最大值 作为工作时间
if(res < t[i])
res = t[i];
return res;
}else{
for(int i=0,j=n-1;j>=0;i++,j--)
{
if(i<m){
a[i]=t[j]; // 取最大的工作 分配给M个机器
}else{
int res=a[0];
int ii=0;
for(int i=1;i<m;i++){ //取最小时间的机器 分配工作
if(res > a[i])
{
res = a[i];
ii=i;
}
}
a[ii]+=t[j];
}
}
int res=a[0];
for(int i=1;i<m;i++) // 取最小时间作为 工作时间
if(res < a[i])
res = a[i];
return res;
}
}
void dfs(int deep){
if(deep > n-1){ //不能用sort啊,数组脚标会对不上
int sum=aa[0];
for(int i=1;i<m;i++) //取最大值 作为工作时间
if(sum < aa[i])
sum = aa[i];
if(res>sum) //更新最短时间
res = sum;
}else{
for(int i=0;i<m;i++){
aa[i]+=t[deep];
if(aa[i]<res) //剪枝 哈哈人生第一次
dfs(deep+1);
aa[i]-=t[deep];
}
}
}
int main()
{
freopen("in.txt","r",stdin);
cin >> n >> m;
for(int i=0;i<n;i++)
cin >> t[i];
cout << greedy() << endl;
dfs(0);
cout << res;
return 0;
}
相关推荐
最佳调度问题
最佳调度问题的回溯算法实现:有n个任务由k个可并行工作的机器完成。完成任务i需要的时间为Ti。找出完成这n个任务的最佳调度,使得完成全部任务的时间最少。用文件导入每个任务所需要的时间Ti。(至少10个任务)使用...
在计算机科学领域,最佳调度问题是一个关键的优化问题,特别是在多处理器系统和并行计算环境中。这个问题涉及到如何有效地分配一系列任务到多个可并行工作的机器上,以达到最大效率、最小化完成时间或达到其他优化...
在计算机科学领域,多机调度问题是一个典型的优化问题,它涉及到如何有效地分配多个处理单元(如计算机、服务器或处理器)的任务,以最大化效率或最小化完成所有任务的时间。本问题通常出现在并行计算、分布式系统...
其中,最佳调度问题的研究与解决,对于提高系统运行效率和优化资源分配具有重要意义。本文将从理论与实践两方面分析探讨最佳调度问题,并结合实验报告、代码实现及执行文件的生成过程,深入剖析该问题的核心。 调度...
通过结合贪心算法和回溯法,最佳调度算法能够有效地解决多任务并行处理中的调度问题,从而达到最小化最晚完成时间的目标。虽然该算法在最坏情况下的时间复杂度较高,但其灵活性和适用性使其成为解决此类问题的一个...
在实际应用中,操作系统往往结合多种调度策略,如混合调度,根据进程的性质和系统状态灵活切换策略,以达到最佳性能。通过分析代码思想,我们可以看到不同调度算法的实现细节,包括进程的创建、调度、切换等过程,...
抽水蓄能电站的最佳调度方案研究 关键词:抽水蓄能 最佳调度 粒子群算法 参考文献:抽水蓄能电站的最佳调度方案研究 非完全复献 仿真软件:matlab 主要内容:研究抽水蓄能机组调峰填谷的功能,目标是从电网的利益出发...
在本文中,我们将深入探讨“最佳调度算法”的实现,特别是在C++编程语言中。这个主题源自中科大软件学院算法导论的课程设计,其中包含了一个实验报告,用于分析和验证算法的效果。 首先,我们需要理解什么是最佳...
【问题描述】:假设有n个任务...试设计一个算法找出完成这n个任务的最佳调度,使得完成全部任务的时间最早。 Input : n k Ti Output: 完成任务的最少时间 Sample input Sample output 7 3 17 2 14 4 16 6 5 3
处理机调度分为多个层次,从低到高分别是:抢占式调度、非抢占式调度、作业调度、进程调度。在作业调度中,操作系统会根据某种策略(如FCFS、SJF、优先级调度、多级反馈队列等)选择作业进入内存,转化为就绪状态。...
总的来说,处理机调度是操作系统设计的关键,它需要综合考虑用户需求、系统资源和各种调度算法的特性,以实现最佳的系统性能和用户体验。理解并掌握这些概念对于理解和设计高效的操作系统至关重要。
在IT行业中,任务调度是一项...总的来说,任务调度和最佳调度算法是提高系统效率的关键,特别是在多处理器和分布式系统中。理解各种调度策略的优缺点,并根据具体应用场景选择或设计合适的算法,是提升系统性能的关键。
首先,处理机调度的目标是多方面的,包括公平性、效率和响应时间。公平性意味着系统应给予所有进程平等的机会,确保每个作业都有机会被执行;效率则关注系统能完成多少工作量,即吞吐量;而响应时间是指从用户提交...
【单功能非线性流水线最佳调度程序】是一种在计算机系统结构中常见的优化问题,它涉及到如何有效地安排流水线中的各个功能段,以达到最高的工作效率。在非线性流水线中,不同功能段的执行时间可能不一致,这使得调度...
本示例中,我们将探讨如何使用Python编程语言来解决一个具体的实例:画出列车运行图并制定最佳调度策略。这涉及到算法设计、数据结构的应用以及可视化技术。 首先,我们需要理解列车运行调度的基本要素。这通常包括...
3. **最佳调度问题的回溯 (Backtracking for Job Scheduling)** 回溯是一种试探性的搜索策略,用于在解决问题时尝试所有可能的解决方案,直到找到一个满足条件的解。在最佳调度问题中,目标可能是最大化收益或最小...