最佳调度问题(c/c++)

问题描述:假设有n个任务由k个并行工作的机器来完成。完成任务i需要的时间为Ti。试设计一个算法找出完成这n个任务的最佳调度,使得完成全部任务的时间最早。
算法设计:对任意给定的整数n和k,以及完成任务i需要的时间为Ti,i=1,2,3……n。计算完成这n个任务的最佳调度。
数据输入:由文件input.txt给出输入数据。第一行有2个正整数n和k。第2行的n个正整数是完成n个任务需要的时间。
结果输出:将计算的完成全部任务的最早时间输出到文件output.txt中。
最好能附上算法分析和复杂度分析,谢谢啊!

如果各机器运行速度相等,换句话就是任务无论在哪台机器上运行完成时间都相等,则问题较简单
1 . 先将任务由大到小排序
2 . 计算n个任务需要的总时间和平均到k个机器上的时间
3 . 将大于平均时间的任务各分配一个机器,找到最大完成时间
4 . 将其他任务顺序安排在一台机器上,如果时间超出最大时间,则把该任务交给下一个机器,下一个任务继续在这台机器上试安排,直到所有任务都不能在小于最大完成时间的情况下安排
5 . 安排下一台机器直道所有任务安排完,
6 . 或有可能安排某(些)任务找不到小于最大完成时间 那么重新扫描各台机器使再加上该任务后时间最小,按此方法安排万所有任物

数据结构采用链表比较合适,
K个机器k个链,n个任务按大小顺序插入一个链表,安排后从任务链表中移动到机器链表中。知道链表为空
温馨提示:内容为网友见解,仅供参考
第1个回答  2010-06-22
这个问题的算法是贪心算法,具体证明我就没写出来了。。
我写的代码复杂度是n^2,有一个排序是nlogn,喝一个2重for循环.
但是2重for循环可以简化为for+最小堆的维护,所以最好的复杂度是NlogN,
但是懒得写最小堆了...
就这样
#include <iostream>
#include <algorithm>
using namespace std;
int a[10001];
int k_hold[10001]={};
int main()
{
freopen("input.txt","r",stdin);
freopen("output.txt","w",stdout);
int n,k;
cin>>n>>k;
for(int i=1;i<=n;i++) cin>>a[i-1];
sort(a,a+n);
for(int i=0;i<k;i++) k_hold[i]=a[n-i-1];
for(int i=n-k-1;i>=0;i--)
{
int min=k_hold[0];
int minj=0;
for(int j=1;j<k;j++)
{
if(k_hold[j]<min)
{
min=k_hold[j];
minj=j;
}

}
k_hold[minj]+=a[i];

}
int max=k_hold[0];
for(int j=1;j<k;j++)
{
if(k_hold[j]>max)
max=k_hold[j];
}
cout<<max<<endl;
system("pause");
}本回答被提问者采纳
第2个回答  2010-06-22
#include <iostream.h>
#include <iomanip.h>
#include <fstream.h>

ifstream input("input.txt");
ofstream output("output.txt");

int *t; //每个任务所需的时间序列
int best = 1000; //最优值

class Flowshop
{
public:
int N; //任务数
int M; //机器数
int *len; //每台机器所需时间序列
int* x; //当前路径
int* bestx; //最优调度:其中bestx[i]=m表示把第i项任务分配给第m台机器

void showTest()
{
input>>N; // 任务数
input>>M; //机器数目

t = new int[N];

for(int m = 0; m < N; m++)
{
input>>t[m];
}

len =new int [M]; //记录每台机器已经安排的时间
for(int j = 0; j < M; j ++)
{
len[j] = 0;
}
bestx=new int [N];
x =new int[N];

backtrack(0);

output<<best;

/* cout<<"best time:";
cout<<best<<endl;
cout<<"each job costs:";
int i;
for ( i=0;i<N;i++)
cout<<t[i]<<" ";
cout<<endl;
cout<<"best schedule:";
for ( i=0;i<N;i++)
cout<<bestx[i]<<" ";
cout<<endl;
*/

}
//回溯搜索
void backtrack (int dep)
{

if (dep==N)
{

int tmp = comp();
if(tmp<best)
{
best=tmp;
for(int i=0;i<N;i++)
{
bestx[i]=x[i];
}
}
return;
}

for(int i=0;i<M;i++)
{
len[i]+=t[dep];
x[dep]=i+1;
if(len[i]<best)
{
backtrack(dep+1);
}

len[i]-=t[dep];
}

}

//计算完成任务的时间
int comp()
{
int tmp =0;
for (int i=0;i<M;i++)
{
if(len[i]>tmp)
{
tmp=len[i];
}
}
return tmp;

}
};

void main()
{
Flowshop f;
f.showTest();
}

####################
e.g. input.txt:
7 3
2 14 4 16 6 5 3

最佳调度问题(c\/c++)
如果各机器运行速度相等,换句话就是任务无论在哪台机器上运行完成时间都相等,则问题较简单 1 . 先将任务由大到小排序 2 . 计算n个任务需要的总时间和平均到k个机器上的时间 3 . 将大于平均时间的任务各分配一个机器,找到最大完成时间 4 . 将其他任务顺序安排在一台机器上,如果时间超出最大...

【C\/C++ 线程池设计思路 】设计与实现支持优先级任务的C++线程池 简要...
C\/C++ 线程池设计中,处理具有优先级的任务是一项挑战。它要求设计者在兼顾资源利用率和性能的同时,考虑任务公平性。首要原则包括任务调度、资源管理和性能优化。任务调度需确保高优先级任务能快速执行,而资源管理则需平衡线程数量以避免过载。性能优化涉及并发度、池规模调整和队列管理策略。具体实现中,任...

超详细 C\/C++ 学习路线分析:学好 C\/C++,走遍天下都不怕!
一、C\/C++入门阶段初学者应从培养编程思维和动手能力开始,深入理解面向过程和面向对象的编程思想。此阶段的主要目标是掌握语言基础。C语言学习数据类型、变量、内存布局、指针基础字符串、一维数组、二维数组一级指针,二级指针,三级指针,N级指针概念指针数组和数组指针结构体、文件的使用动态库的封装和设计...

题目:进程A,B,C,D,E,到达时间是0,1,2,3,4,服务时间分别是4,3,5,2...
我有更好的答案推荐于2017-12-16 13:48:27 最佳答案 如果图中红色的线段是正确的话,那么应该是操作系统的时间片为1的轮转调度。即每一个进程允许执行一个时间片的长度,然后若有待执行的进程,则按照先来先服务的方式发生进程切换。而刚好5个进程依次到达,所以看到的是A、B、C、D、E被执行,两个周期后,进程...

2011数学建模国赛B题 求解答
对于问题一,模型求解:根据我们建立的模型,我们进行了编程,主要代码如下:(1)Dijkstra算法的C++代码:#include<iostream.h>void main(){ int infinity=100,j,i,n,k,t,**w,*s,*p,*d; cout<<"input the value of n:"; cin>>n; cout<<endl;d=new int[n]; s=new int[n]; p=new int[n]; w=...

东南大学吴健雄学院的荣誉校友
1997年,他与C.F.J.Wu教授和Dr.Y.Y.Chen的合作论文荣获“the Jack Youden Prize for the best expository paper in Technometrics for the year 1997”。这篇论文第一次用最优理论研究调度问题的系统的概述。2000年,他和Dr.C.H.Liu合作的论文荣获“the Frank Wilcoxon Prize fo the best ractical ...

OptaPlanner - 入门介绍
OptaPlanner是专为解决规划问题的引擎。它优化企业资源计划,如车辆调度、员工排班、云优化、任务分配、任务调度、Bin Packing等。其主要作用是分配有限资源(员工、资产、时间和金钱)以提供产品或服务,通过优化计划,提高服务质量和降低成本。OptaPlanner以轻量级、可嵌入的规划引擎形式存在,它使普通的Java程序...

C++的学习方法!~
首先从宏观上入手,你需要明白的是C++是程序设计语言的本质。在此我把C++最重要的性质写下来:C++是一门静态类型检查,基于C内存模式,支持四种基本程序设计范型的语言。注意,这里说明了三个本质特性,静态说明了语言的类型检查性质,基于C内存模式告诉我们在C++中所有与内存有关的操作都需要程序员自己来负责,这样就带来了...

软考中级软件设计师要学会哪种程序设计语言(我只学过C,C++,汇编)
C和C++都有,但题目难度不大,汇编语言不考,建议多看看软件工程的理论知识,考得很多。还有操作系统,编译原理等跟计算机专业相关的理论。根据软件设计师考试大纲要求,软件设计师包含两个考试科目:基础知识和应用技术,两个科目都是笔试。基础知识在上午考试,考试题型为客观选择题,共计75道选择题;应用技术在下午考试,考试...

c++中哪个算法用于页面置换
用C++语言编写FIFO页面置换算法代码用C语言编写OPT、FIFO、LRU,LFU四种置换算法。熟悉内存分页管理策略。了解页面置换的算法。掌握一般常用的调度算法。根据方案使算法得以模拟实现。锻炼知识的运用能力和实践能力。首先在电脑中打开visualC++0,输入预处理命令和主函数:#includestdio.h\/*函数头:输入输出头...

相似回答