- 1、本文档共5页,可阅读全部内容。
- 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
《算法设计与分析》上机报告
姓名:
学号:
日期:
上机题目:
最正确调度问题(回溯算法)
实验环境:
CPU:2.10GHz;内存:6G;操作系统:Win764位;软件平台:VisualStudio2008;
一、算法设计与分析:
题目:
最正确调度问题(回溯算法)
设有n个任务由m个可并行工作的机器来完成,完成任务i需要时间为ti。
试设计一个算法找出完成这个任务的最正确调度,使完成全部任务的时间最早。
算法思想:
解空间的表示:
一个深度为N的M叉树。
t[i]:第i个任务的时间
x[i]=j:当前输出结果
Res[i]=j:表示第i个任务要运行在第j台机器上
time_machine[i]:第i个机器上的运行时间
根本思路:
1、搜索从开始结点〔根结点〕出发,以DFS搜索整个解空间。
2、每搜索完一条路径那么记录下time_min和Res[i]序列,开始结点就成为一个活结点,
同时也成为当前的扩展结点。在当前的扩展结点处向纵深方向移至一个新结点,
并成为一个新的活结点,也成为当前扩展结点。
3、如果在当前的扩展结点处不能再向纵深方向扩展,那么当前扩展结点就成为死结点。
此时,应往回移动〔回溯〕至最近的一个活结点处,并使这个活结点成为当前的扩展
结点;直至找到一个解或全部解。
二、核心代码:
boolplacetest(intk)
{
inttime_max_K=time_machine[1];
for(inti=2;i=K;i++)
{
if(time_machine[i]time_max_K)
time_max_K=time_machine[i];
}
if(time_max_Ktime_min)
returnfalse;
else
returntrue;
}
voidBacktrack(intk,intt[],intx[])
{
if(kN)
{
inttime_max_K=time_machine[1];
for(inti=2;i=K;i++)
{
if(time_machine[i]time_max_K)
time_max_K=time_machine[i];
}
if(time_max_Ktime_min)
{
time_min=time_max_K;
for(inti=1;i=N;i++)
Res[i]=x[i];
}
}
else
{
for(inti=1;i=K;i++)
{
x[k]=i;
if(placetest(k))
{
time_machine[i]+=t[k];
Backtrack(k+1,t,x);
time_machine[i]-=t[k];
}
}
}
}
三、结果与分析:
附录〔源代码〕
算法源代码〔C++描述〕
/*
最正确调度问题(回溯算法)
设有n个任务由k个可并行工作的机器来完成,完成任务i需要时间为。
试设计一个算法找出完成这n个任务的最正确调度,使完成全部任务的时间最早。
*/
#includeiostream
#includectime
#includewindows.h
usingnamespacestd;
intK,N;
int*time_machine;//[K+1]={0};
int*Res;//[N+1];
staticinttime_min=INT_MAX;
boolplacetest(intk);
voidBacktrack(intk,intt[],intx[]);
intmain()
{
cout请输入任务个数和机器个数:endl;
cinNK;
if(N=K)
{
cout最短运行时间即为任务中时间最长者!endl;
return0;
}
int*t=newint[N+1];
int*x=newint[N+1];
cout请分别输入N个任务时间:endl;
for(inti=1;iN+1;i++)
cint[i];
//t[8]={0,2,14,4,16,6,5,3};
time_machine=newint[K+1];
Res=newint[N+1];
for(inti=1;iK+1;i++)
time_machine[i]=0;
for(inti=1;iN+1;i++)
{
cout
您可能关注的文档
- 《幸福是什么》教学课件.ppt
- 《茅屋为秋风所破歌》公开课优秀课件.pptx
- 最新人教版五年级下册英语第一单元测试题.doc
- 《八声甘州》(实用).ppt
- 新苏教版三年级数学第七单元测试卷.doc
- 施工机具日常保养记录.doc
- 最新人教版八年级上册数学第三章试卷.docx
- 新运输管理制度.docx
- 【PPT模板】欧洲经典PPT模板库(第一部分)【PPT母版】PPT素材培训.ppt
- WordNet介绍-服务计算汇报PPT.pptx
- 2022-2023年安全员之江苏省C2证(土建安全员)通关模拟题库附答案.docx
- 一级注册建筑师之建筑结构通关模拟卷附答案详解.docx
- 2023年一级建造师之一建建设工程经济训练试卷附答案.docx
- 劳务员之劳务员专业管理实务考前冲刺检测卷含答案讲解.docx
- 现场监督者教材.pptx
- 人教部编版三年级语文下册期末测试卷1.pdf
- 第九套广播体操完整教案.pdf
- 苏教版六年级上册数学第一学期期末综合测试卷(答案详解)10套 (1).pdf
- 浙教版2022-2023学年七下数学第一章 平行线 培优测试卷(解析版).pdf
- 第二单元 遵守社会规则 测试题-2021-2022学年部编版道德与法治八年级上册(word版 答案).pdf
文档评论(0)