最佳调度问题回溯算法.doc

  1. 1、本文档共5页,可阅读全部内容。
  2. 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 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+1;i++) {

文档评论(0)

haihang2017 + 关注
实名认证
内容提供者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档