一、实验目的

  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)最佳调度方案
    提示:算法复杂度为O(n!),建议在测试的时候n值不要太大,可以考虑不要超过12。
  3. 数字全排列问题
    任意给出从1到N的N个连续的自然数,求出这N个自然数的各种全排列。如N=3时,共有以下6种排列方式:123,132,213,231,312,321。
    注意:数字不能重复,N由键盘输入(N<=9)。

三、算法思想分析

  1. 8皇后问题
    基本思想为一个基本的回溯,从最开始的空棋盘先放一个棋子,然后根据放置的棋子推演出一个新的局面,然后下下一行的棋子,一直递归的下下去直到最后一行下好,这样一个情况就产生成功;如果在中途的某一行没有地方可以下子,则恢复上一局面,在上一行重新下子,这样通过树形的穷举,即回溯的状态空间树,就可以将所有可能都推演一遍。
    实现时的算法描述为:

    安全算法描述:
    判断竖直线,主对角线,副对角线是否有棋子
  2. 批处理作业调度问题
    基本思想为一个排序树,根据排序树每次推演的情况得到该情况所需调度时间,并与当前最优方案比较,如果调度时间更小,则将当前最小时间与当前情况储存,直到所有情况都已经推演完毕,最后输出结果。
    排列树思想基于一个交换的过程,每次推演时将当前结点与未使用的结点进行交换,得到多种情况,每种情况同样递归调用算法进行推演,最后每个结点都推演过自己的子集,这样所有的情况就能推演全。
    算法描述
  3. 数字全排列问题
    基本思想完全就是一个排列树,每次完成一次推演输出当前情况即可。
    排列树算法描述请见第二题算法思想概述,在这里不再赘述。

四、实验过程分析
本次实验重点练习了回溯的相关内容,而回溯算法由于其有线索的性质,可以通过一个线索递归调用函数将所有情况推演出,而非单纯的去穷举,这样在穷举过程中就可以有条理地交与机器去执行。在实验中由于理解不够,在做皇后问题时忘记了对现场的恢复,一度导致整个局面十分混乱,归根结底是对回溯的思想理解的不透,在将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. 算法分析与设计课程复习之回溯法

    算法分析与设计课程复习之回溯法 一.基本思想 1.解空间 设问题的解向量为X=(x1,x2,-,xn) ,xi的取值范围为有穷集Si .把xi的所有可能取值组合,称为问题的解空间.每一个组合是问题的一 ...

  2. 矩形法求定积分公式MATLAB,Matlab实验报告四(矩形法梯形法抛物线法求定积分).doc...

    Matlab实验报告四(矩形法梯形法抛物线法求定积分) 数学与信息科学系实验报告 实验名称 定积分的近似计算 所属课程 数学软件与实验 实验类型 综合型实验 专 业 信息与计算科学 班 级 学 号 姓 ...

  3. 算法分析与设计——回溯法实验报告

       算法导论  课程设计 成 绩 题    目:    回 溯 法 学院班级:        1613013         学    号:      16130130216       姓     ...

  4. 模型机设计计算机组成原理报告,计算机组成原理 实验报告四 基本模型机设计与实现...

    计算机组成原理 实验报告四 基本模型机设计与实现 计算机组成原理实验报告学院:计算机科学与信息 专业: 班级:姓名 学号 实验组实验时间 指导教师 成绩实验项目名称 实验四.基本模型机设计与实现实验目 ...

  5. 算法分析与设计 西工大 noj 第二次实验

    算法分析与设计 西工大 noj 第二次实验 Problem A 0-1背包问题 时限:1000ms 内存限制:10000K 总时限:3000ms 描述: 需对容量为c 的背包进行装载.从n 个物品中选 ...

  6. mysql实验报告四_实验报告四

    实 实 验 报 告 课程名称 数据库实验及课程设计 实验项目 数据查询 实验 仪器 ___________________________ 系 别______信息管理学院______ 专 业_____ ...

  7. c 语言差错编码实验结果,C语言程序设计实验报告(四).doc11111111111111111.doc

    C语言程序设计实验报告(四).doc11111111111111111 C语言程序设计实验报告 姓 名吴文重学 号52系 别数学系班级2班主讲教师徐时芳指导教师徐时芳实验日期2011-11-8专业10 ...

  8. matlab m文件的编写,Matlab实验报告(四)M文件的编写.doc

    Matlab实验报告(四)M文件的编写.doc 实验目的 学习MATLAB屮的关系运算和逻辑运算,掌握它们的表达形式和川法. 掌握MATLAB中的选择结构和循环结构. 学会用MATLAB进行M文件的编 ...

  9. 离散数学实验报告四——图的应用

    离散数学实验报告四--图的应用 预习内容: 1.图的基本概念 1.1图的定义:现实世界中许多现象能用某种图形表示,这种图形是由一些点和一些连接两点间的连线所组成. 1.2邻接点: 同一条边的两个端点. ...

  10. 计算机组织与结构实验报告,计算机组织与结构实验报告四

    计算机组织与结构实验报告四 (3页) 本资源提供全文预览,点击全文预览即可全文预览,如果喜欢文档就下载吧,查找使用更方便哦! 9.9 积分 实验四.数据通路实验一. 实验目的及要求1. 进一步熟悉TE ...

最新文章

  1. 工作中使用计算机的经验,事业单位考试中计算机工作经历是什么意思
  2. 【MATLAB】进阶绘图 ( Boxplot 箱线图 | boxplot 函数 | Error Bar 误差条线图 | errorbar 函数 )
  3. MySQL的进阶实战篇
  4. 2022-03-22
  5. 停用nfs导致cacti无法抓取snmp数据
  6. python代码变成运行程序_用Python脚本转换成windows的可执行程序
  7. IDEA同时使用maven和gradle
  8. 对比,还原真实的GPU池化
  9. AD放置过孔按TAB键使过孔大小为设置值0.6/0.3
  10. 数据库下午怎么插入_数据库中日期时间用法
  11. 如何正确地使用#region指令
  12. QuickServer开发指南(1)- 介绍
  13. 计算机平均分函数a,平均值计算函数Average、Averagea、AverageIfs、Trimmean
  14. HQChart使用教程60-新版k线训练使用教程
  15. java读书网站课程设计_Java课程设计
  16. autoJS 网易公开课app封装函数
  17. oracle事务之oracle读一致性
  18. 可观测白皮书 part2/2
  19. 修改Arduino IDE背景和字体颜色
  20. 为什么要配置Java环境变量以及Java环境变量的配置

热门文章

  1. spyder python_spyder python2.7下载
  2. JavaScript实现在线Cron表达式生成器、预览工具 -toolfk程序员在线工具网
  3. 2021-08-23
  4. 我的职业规划500字计算机范文,职业生涯规划自我分析(职业生涯规划500字)
  5. 手游最佳搭档:高续航音质卓越,高颜值精品蓝牙耳机推荐
  6. excel宏教程_用Excel做个年会抽奖软件,老板惊呆了!
  7. #边学边记 必修4 高项:对事的管理 第六章 项目质量管理 质量管理基础
  8. 数学分析—集合与映射
  9. 单片机lcd1602程序 c语言,单片机I2C通信及LCD1602显示C程序
  10. C++实现简单贪吃蛇代码