- 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
第 PAGE
第 PAGE 1 页 共 NUMPAGES 18 页
实验4、《回溯法实验》
一、实验目的
1. 掌握回溯算法思想
2. 掌握回溯递归原理
3. 了解回溯法典型问题
二、实验内容
1. 编写一个简单的程序,解决8皇后问题。
2. 批处理作业调度问题
[问题描述]给定n个作业的集合J=(J1, J2, … , Jn)。每一个作业Ji都有两项任务需要分别在2台机器上完成。每一个作业必须先由机器1处理,然后再由机器2处理。作业Ji需要机器i的处理时间为tji,i=1,2, … ,n; j=1,2。
对于一个确定的作业调度,设Fji是作业i在机器i上完成处理的时间。则所有作业在机器2上完成处理的时间和成为该作业调度的完成时间和。
批处理作业调度问题要求对于给定的n个作业,制定一个最佳的作业调度方案,使其完成时间和达到最小。
要求输入:
1)作业数 2)每个作业完成时间表:
作业完成时间
机器1
机器2
作业1
2
1
作业2
3
1
作业3
2
3
要求输出: 1)最佳完成时间 2)最佳调度方案
提示:算法复杂度为O(n!),建议在测试的时候n值不要太大,可以考虑不要超过12。
3. 数字全排列问题
任意给出从1到N的N个连续的自然数,求出这N个自然数的各种全排列。如N=3时,共有以下6种排列方式:123,132,213,231,312,321。
注意:数字不能重复,N由键盘输入(N=9)。
三、算法思想分析
1.八皇后问题是典型的回溯问题,先从空格子起逐行放皇后,如果符合要求即安全则放置,否则返回上一行下一个位置继续,直至最后一行安全放置则为一种放置方式。
2.批处理作业调度的解空间为排列数,不断利用递归函数直至叶节点,剪枝函数为当前用时与最佳用时的比较。关于时间的计算,每次选择作业后先将机器1用时累加,机器2上总用时需要先比较上一个作业完成时间与此时机器1上的总用时,如果机器1上总用时大于上一作业用时,那么机器2上用时则加上机器1上用时与此作业在机器2上的单独用时,反之,则代表此时机器2仍然在处理上一任务,那么机器2上用时则加上上一作业用时与此作业在机器2上的单独用时。
3.数字全排列问题的解空间为排列树,依次向下排列,判断是否继续的条件为该数字是否已经使用,通过一个flag与for循环判断即可,直至到了最后一个数字则输出结果。
四、实验过程分析
1.八皇后问题的难点在于安全条件的设计,即同一列,对角线都不能同时放置,对角线的设计比较巧妙,根据PPT设计向右斜为i-j+N,向左斜为i+j,利用二维数组很好的避免了代码的重复与累赘。
2.批处理作业调度的回溯条件即当前时间与最佳时间的比较,本题的难点在于时间的计算,最开始对于机器2上的总用时是用一个整型数据记录,但没办法与上一个作业用时比较,或者说不方便进行下一次回溯条件的改变,后来参考课本PPT采用数组记录就解决了。计算时间的另一个问题即作业进入机器2上时,上一个作业是否已经完成,需不需要等待,这里要加判断条件,否则时间计算会出问题。
3.从数字全排列问题的实验中,我更加熟悉了回溯的基本套路,判断数字是否使用的flag和for循环设计很典型也很实用。
五、算法源代码及用户屏幕
1.(1)算法源码
/***************************************
八皇后问题。
codeblocks C++
2018.11.3
***************************************/
#include iostream
#include iomanip
using namespace std;
#define N 8 //定义皇后数量
int countN = 0;
int tryN(int n, int a[N][N], int m[], int right[], int left[]); //检测皇后摆放方式
void printN(int a[N][N]); //打印皇后摆放位置
int main()
{
int a[N][N] = {0}; //摆放皇后的数组
int m[N] = {0}; //同一竖排
int right[N*2] = {0}; //右斜对角线
int left[N*2] = {0}; //左斜对角线
int countN = tryN(0, a, m, right, left);
coutcount = countNendl;
return 0;
}
int tryN(int n, int a[N][N], int m[]
您可能关注的文档
- 运动功能解剖观察-医学信息工程实验报告.docx
- 正弦波同步移相触发电路实验报告.docx
- 《算法综合实验》实验报告.docx
- 《数据结构》课程设计-算数表达式求值实验报告(附源码).docx
- 网页设计与开发《新生实践课》实验报告.doc
- java实现自动生成四则运算实验报告.docx
- PCM编码与解码仿真实验报告.doc
- python实验报告-函数定义和调用.doc
- Web应用开发技术-静态网页开发实验报告.docx
- 递归与分治策略实验报告(附源码).doc
- 高级语言程序设计大作业实验报告(学生信息管理系统).docx
- 基于MVC用JSPServlet实现JPetStore实验报告.doc
- 基于MVC用JSPServlet实现JPetStore实验报告+使用AJAX和jQuery改善用户体验实验报告.doc
- 基于python的简单云盘的实现实验报告(附源码).pdf
- 基于SAT的数独游戏求解程序-数据结构课程设计报告.docx
本人专注于k12教育,英语四级考试培训,本人是大学本科计算机专业毕业生,专注软件工程计算机专业,也可承接计算机专业的C语言程序设计,Java开发,Python程序开发。
文档评论(0)