算法分析与设计实验报告四——回溯法实验
一、实验目的
- 掌握回溯算法思想
- 掌握回溯递归原理
- 了解回溯法典型问题
二、实验内容
- 编写一个简单的程序,解决8皇后问题。
- 批处理作业调度问题
[问题描述]给定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)最佳调度方案
提示:算法复杂度为O(n!),建议在测试的时候n值不要太大,可以考虑不要超过12。 - 数字全排列问题
任意给出从1到N的N个连续的自然数,求出这N个自然数的各种全排列。如N=3时,共有以下6种排列方式:123,132,213,231,312,321。
注意:数字不能重复,N由键盘输入(N<=9)。
三、算法思想分析
- 8皇后问题
基本思想为一个基本的回溯,从最开始的空棋盘先放一个棋子,然后根据放置的棋子推演出一个新的局面,然后下下一行的棋子,一直递归的下下去直到最后一行下好,这样一个情况就产生成功;如果在中途的某一行没有地方可以下子,则恢复上一局面,在上一行重新下子,这样通过树形的穷举,即回溯的状态空间树,就可以将所有可能都推演一遍。
实现时的算法描述为:
安全算法描述:
判断竖直线,主对角线,副对角线是否有棋子 - 批处理作业调度问题
基本思想为一个排序树,根据排序树每次推演的情况得到该情况所需调度时间,并与当前最优方案比较,如果调度时间更小,则将当前最小时间与当前情况储存,直到所有情况都已经推演完毕,最后输出结果。
排列树思想基于一个交换的过程,每次推演时将当前结点与未使用的结点进行交换,得到多种情况,每种情况同样递归调用算法进行推演,最后每个结点都推演过自己的子集,这样所有的情况就能推演全。
算法描述
- 数字全排列问题
基本思想完全就是一个排列树,每次完成一次推演输出当前情况即可。
排列树算法描述请见第二题算法思想概述,在这里不再赘述。
四、实验过程分析
本次实验重点练习了回溯的相关内容,而回溯算法由于其有线索的性质,可以通过一个线索递归调用函数将所有情况推演出,而非单纯的去穷举,这样在穷举过程中就可以有条理地交与机器去执行。在实验中由于理解不够,在做皇后问题时忘记了对现场的恢复,一度导致整个局面十分混乱,归根结底是对回溯的思想理解的不透,在将8皇后完整地实现之后,在做排列树时就相对有针对性了,虽然推演的方法不同,但根据判定—改线索向下推进—递归调用自身—恢复现场的方法,可以对排列树的思想较快的理解,这是我十分可喜的收获。
同时通过本次实验,我深切感受到了回溯法的算法复杂度确实较大,如8皇后问题需要秒为单位的时间才能解决,这和之前的时间比是十分长的。
五、算法源代码及用户屏幕
1.8皇后问题
①代码
#include <iostream>
using namespace std;
#define NUM 50
int queen(int res[], int i, int chess[][NUM], int column[], int left[], int right[], int n) {for (int j = 0; j < n; j++) {//判断是否安全if (!column[j] && !left[i + j] && !right[i - j + n]) {//放皇后chess[i][j] = column[j] = left[i + j] = right[i - j + n] = 1;//判断是否到最后一行if (i == n - 1) {res[0]++;cout << "situation " << res[0] << endl;for (int i = 0; i < n; i++) {for (int j = 0; j < n; j++) {if (j == n - 1)cout << chess[i][j] << endl;else cout << chess[i][j] << " ";}}cout << endl;}//如果没有,下挖else queen(res, i + 1, chess, column, left, right, n);//去皇后chess[i][j] = column[j] = left[i + j] = right[i - j + n] = 0;}}return res[0];
}
int main() {int n;cout << "Please input the size of chessboard: ";cin >> n;int chess[NUM][NUM] = { 0 };int column[n] = { 0 };int left[2 * n] = { 0 };int right[2 * n] = { 0 };int count = 0;int res[1] = { 0 };res[0] = queen(res, 0, chess, column, left, right, n);cout << "the total number of the situation is: " << res[0];system("pause");return 0;
}
②用户界面
首先输入棋盘格数,然后回车返回各个情况的内容与所有情况的个数。
2. 批处理作业调度问题
①代码
#include <iostream>
using namespace std;
#define NUM 100
void jobScheduling(int jobs[][NUM], int m, int i, int min[], int temp[]) {if (i > m) {for (int i = 1; i <= m; i++) {cout << temp[i] << " ";}int sum = 0;for (int j = 1; j <= m; j++) {for (int k = 1; k <= j; k++) {sum += jobs[k][1];}sum += jobs[j][2];}cout << sum << endl;if (sum < min[0]) {min[0] = sum;for (int j = 1; j <= m; j++) {min[j] = temp[j];}}}else {for (int t = i; t <= m; t++) {//交换for (int k = 1; k <= 2; k++) {int temp = jobs[t][k];jobs[t][k] = jobs[i][k];jobs[i][k] = temp;}int tmp = temp[t];temp[t] = temp[i];temp[i] = tmp;//递归向下调度jobScheduling(jobs, m, i + 1, min, temp);//恢复现场for (int k = 1; k <= 2; k++) {int temp = jobs[t][k];jobs[t][k] = jobs[i][k];jobs[i][k] = temp;}tmp = temp[t];temp[t] = temp[i];temp[i] = tmp;}}
}
int main() {int m;cout << "Please input the number of jobs: ";cin >> m;cout << "Please input the time of each job and each machine: ";int jobs[NUM][NUM];int min[m + 1];int temp[m + 1];min[0] = 1000;for (int i = 1; i < m + 1; i++) {min[i] = i;temp[i] = i;}for (int i = 1; i <= m; i++) {for (int j = 1; j <= 2; j++) {cin >> jobs[i][j];}}jobScheduling(jobs, m, 1, min, temp);cout << "the minimum of the total scheduling time is: " << min[0] << endl;cout << "the scheduling mechod is: ";for (int i = 1; i <= m; i++) {cout << min[i] << " ";}system("pause");return 0;
}
②用户界面
首先输入作业个数,然后输入每个作业在机器1与机器2上运行的时间,然后回车输出每个情况的结果与所求的最小时间结果与对应情况。
3. 数字全排列问题
①代码
#include<iostream>
using namespace std;
#define NUM 20
void allSort(int i, int n, int num[]) {if (i >= n) {for (int i = 0; i < n; i++) {cout << num[i] << " ";}cout << endl;}else {for (int t = i; t < n; t++) {int temp = num[t];num[t] = num[i];num[i] = temp;allSort(i + 1, n, num);temp = num[t];num[t] = num[i];num[i] = temp;}}
}
int main() {int num;cout << "Please input the number: ";cin >> num;int n[num];for (int i = 0; i < num; i++) {n[i] = i + 1;}allSort(0, num, n);system("pause");return 0;
}
②用户界面
首先输入数字个数,然后回车显示所有情况。
算法分析与设计实验报告四——回溯法实验相关推荐
- 算法分析与设计课程复习之回溯法
算法分析与设计课程复习之回溯法 一.基本思想 1.解空间 设问题的解向量为X=(x1,x2,-,xn) ,xi的取值范围为有穷集Si .把xi的所有可能取值组合,称为问题的解空间.每一个组合是问题的一 ...
- 矩形法求定积分公式MATLAB,Matlab实验报告四(矩形法梯形法抛物线法求定积分).doc...
Matlab实验报告四(矩形法梯形法抛物线法求定积分) 数学与信息科学系实验报告 实验名称 定积分的近似计算 所属课程 数学软件与实验 实验类型 综合型实验 专 业 信息与计算科学 班 级 学 号 姓 ...
- 算法分析与设计——回溯法实验报告
算法导论 课程设计 成 绩 题 目: 回 溯 法 学院班级: 1613013 学 号: 16130130216 姓 ...
- 模型机设计计算机组成原理报告,计算机组成原理 实验报告四 基本模型机设计与实现...
计算机组成原理 实验报告四 基本模型机设计与实现 计算机组成原理实验报告学院:计算机科学与信息 专业: 班级:姓名 学号 实验组实验时间 指导教师 成绩实验项目名称 实验四.基本模型机设计与实现实验目 ...
- 算法分析与设计 西工大 noj 第二次实验
算法分析与设计 西工大 noj 第二次实验 Problem A 0-1背包问题 时限:1000ms 内存限制:10000K 总时限:3000ms 描述: 需对容量为c 的背包进行装载.从n 个物品中选 ...
- mysql实验报告四_实验报告四
实 实 验 报 告 课程名称 数据库实验及课程设计 实验项目 数据查询 实验 仪器 ___________________________ 系 别______信息管理学院______ 专 业_____ ...
- c 语言差错编码实验结果,C语言程序设计实验报告(四).doc11111111111111111.doc
C语言程序设计实验报告(四).doc11111111111111111 C语言程序设计实验报告 姓 名吴文重学 号52系 别数学系班级2班主讲教师徐时芳指导教师徐时芳实验日期2011-11-8专业10 ...
- matlab m文件的编写,Matlab实验报告(四)M文件的编写.doc
Matlab实验报告(四)M文件的编写.doc 实验目的 学习MATLAB屮的关系运算和逻辑运算,掌握它们的表达形式和川法. 掌握MATLAB中的选择结构和循环结构. 学会用MATLAB进行M文件的编 ...
- 离散数学实验报告四——图的应用
离散数学实验报告四--图的应用 预习内容: 1.图的基本概念 1.1图的定义:现实世界中许多现象能用某种图形表示,这种图形是由一些点和一些连接两点间的连线所组成. 1.2邻接点: 同一条边的两个端点. ...
- 计算机组织与结构实验报告,计算机组织与结构实验报告四
计算机组织与结构实验报告四 (3页) 本资源提供全文预览,点击全文预览即可全文预览,如果喜欢文档就下载吧,查找使用更方便哦! 9.9 积分 实验四.数据通路实验一. 实验目的及要求1. 进一步熟悉TE ...
最新文章
- 工作中使用计算机的经验,事业单位考试中计算机工作经历是什么意思
- 【MATLAB】进阶绘图 ( Boxplot 箱线图 | boxplot 函数 | Error Bar 误差条线图 | errorbar 函数 )
- MySQL的进阶实战篇
- 2022-03-22
- 停用nfs导致cacti无法抓取snmp数据
- python代码变成运行程序_用Python脚本转换成windows的可执行程序
- IDEA同时使用maven和gradle
- 对比,还原真实的GPU池化
- AD放置过孔按TAB键使过孔大小为设置值0.6/0.3
- 数据库下午怎么插入_数据库中日期时间用法
- 如何正确地使用#region指令
- QuickServer开发指南(1)- 介绍
- 计算机平均分函数a,平均值计算函数Average、Averagea、AverageIfs、Trimmean
- HQChart使用教程60-新版k线训练使用教程
- java读书网站课程设计_Java课程设计
- autoJS 网易公开课app封装函数
- oracle事务之oracle读一致性
- 可观测白皮书 part2/2
- 修改Arduino IDE背景和字体颜色
- 为什么要配置Java环境变量以及Java环境变量的配置
热门文章
- spyder python_spyder python2.7下载
- JavaScript实现在线Cron表达式生成器、预览工具 -toolfk程序员在线工具网
- 2021-08-23
- 我的职业规划500字计算机范文,职业生涯规划自我分析(职业生涯规划500字)
- 手游最佳搭档:高续航音质卓越,高颜值精品蓝牙耳机推荐
- excel宏教程_用Excel做个年会抽奖软件,老板惊呆了!
- #边学边记 必修4 高项:对事的管理 第六章 项目质量管理 质量管理基础
- 数学分析—集合与映射
- 单片机lcd1602程序 c语言,单片机I2C通信及LCD1602显示C程序
- C++实现简单贪吃蛇代码