- 1、本文档共5页,可阅读全部内容。
- 2、有哪些信誉好的足球投注网站(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
最佳调度问题(回溯算法)[精选]
《算法设计与分析》上机报告
姓名: 学号: 日期: 上机题目: 最佳调度问题(回溯算法) 实验环境:
CPU: 2.10GHz ; 内存: 6G ; 操作系统:Win7 64位 ;软件平台:Visual Studio2008 ; 一、算法设计与分析:
题目:
最佳调度问题(回溯算法)
设有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、如果在当前的扩展结点处不能再向纵深方向扩展,则当前扩展结点就成为死结点。
此时,应往回移动(回溯)至最近的一个活结点处,并使这个活结点成为当前的扩展
结点;直至找到一个解或全部解。
二、核心代码:
bool placetest(int k)
{
int time_max_K = time_machine[1];
for(int i=2;i=K;i++)
{
if( time_machine[i] time_max_K )
time_max_K = time_machine[i];
}
if(time_max_K time_min)
return false;
else
return true;
}
void Backtrack(int k,int t[],int x[])
{
if(k N )
{
int time_max_K = time_machine[1];
for(int i=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(int i=1;i=N;i++)
Res[i] = x[i];
}
}
else
{
for(int i=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个任务的最佳调度,使完成全部任务的时间最早。
*/
#include iostream
#include ctime
#include windows.h
using namespace std;
int K,N;
int *time_machine;//[K+1]={0};
int *Res;//[N+1];
static int time_min = INT_MAX;
bool placetest(int k);
void Backtrack(int k,int t[],int x[]);
int main()
{
cout 请输入任务个数和机器个数:endl;
cin N K;
if( N = K)
{
cout 最短运行时间即为任务中时间最长者!endl;
return 0;
}
int *t = new int[N+1];
int *x = new int[N+1];
cout 请分别输入 N个任务时间: endl;
for(int i=1;iN+1;i++)
cin t[i];
//t[8] = {0,2,14,4,16,6,5,3};
time_machine = new int[K+1];
Res = new int[N+1];
for(int i=1;iK+1;i++)
time_machine[i]=0;
for(int i=1;iN+
您可能关注的文档
最近下载
- DB4403_T 77-2024 电动汽车充电安全监控平台数据采集规范.docx
- 基层网络舆情监测工作的实践与思考.docx VIP
- 加强政治机关建设提升机关工作质量.pptx VIP
- 作业3:《windows服务器基础配置与局域网组建》工学一体化课程学习任务设计.docx VIP
- 某小区供配电系统设计本科生毕业设计论文.doc VIP
- DG_TJ 08-2242-2023 民用建筑外窗应用技术标准.docx
- 胶带简介介绍.ppt
- 文化创意产品设计开发合同.doc VIP
- 瓦工:高级瓦工(强化练习).docx VIP
- 作业11:《windows服务器基础配置与局域网组建》工学一体化课程教学进度计划表.docx VIP
文档评论(0)