人工智能报告:经典回溯问题——八皇后问题

写在报告前:
八皇后是经典的回溯问题,也是人工智能的入门级题目,在保证功能的前提下我尽量缩减了代码量,也在原有报告代码添加注释以方便大家快速掌握。
一.作业任务
八皇后问题,是一个古老而著名的问题,是回溯算法的典型案例。该问题是国际西洋棋棋手马克斯·贝瑟尔于1848年提出:在8×8格的国际象棋上摆放八个皇后,使其不能互相攻击,即任意两个皇后都不能处于同一行、同一列或同一斜线上,问有多少种摆法。
二.运行环境
Windows10,codeblocks。
三.算法介绍
八皇后算法是典型的回溯算法问题。回溯算法实际上一个类似枚举的搜索尝试过程,主要是在搜索尝试过程中寻找问题的解,当发现已不满足求解条件时,就“回溯”返回,尝试别的路径。回溯算法也叫试探法,它是一种系统地搜索问题的解的方法。用回溯算法解决问题的一般步骤:
1、 针对所给问题,定义问题的解空间,它至少包含问题的一个(最优)解。
2 、确定易于搜索的解空间结构,使得能用回溯法方便地搜索整个解空间 。
3 、以深度优先的方式搜索解空间,并且在搜索过程中用剪枝函数避免无效搜索。
第一步按照顺序放一个皇后,然后第二步符合要求放第2个皇后,如果没有位置符合要求,那么就要改变第一个皇后的位置,重新放第2个皇后的位置,直到找到符合条件的位置就可以了。回溯算法使用剪枝函数,剪去一些不可能到达最终状态(即答案状态)的节点,从而减少状态空间树节点的生成。
四.程序分析
程序使用的语言为c++,本代码将棋盘信息保存在c[20]中,通过全局变量n来设定皇后数量,使用search函数进行求解并用print函数打印所有可能的棋盘情况。
五.界面截图
1、八皇后问题:

人工智能报告:经典回溯问题——八皇后问题_第1张图片
此图片中黑白方格代表无棋子时的棋盘,第三种图标代表皇后棋子。
本代码在求解过程中每求解出一个解便输出此时的棋盘信息,最终输出解的数字。
2、多皇后问题
本代码参数n代表皇后数量,过输入n值改变即为求解多皇后问题:
人工智能报告:经典回溯问题——八皇后问题_第2张图片
人工智能报告:经典回溯问题——八皇后问题_第3张图片

六.结果分析
本次作业通过查询资料了解了八皇后问题的由来和含义,然后采用回溯算法来完成了这个项目的主体部分,简要输出棋盘信息的同时,拓展了多皇后问题。
七.作业体会
纸上得来终觉浅,亲手实践方能将知识真正理解。透彻八皇后算法虽然不算是难度偏高的例子,但是对于我这样刚刚了解人工智能的大学生而言,拥有恰到好处的挑战性,通过努力还是可以完成算法并实现它的展示。这个过程让我复习了回溯思想并加深了我对人工智能的理解。
八.参考资料
《人工智能(21世纪高等学校计算机专业实用规划教材)》清华大学出版社
《八皇后问题》百度百科
九.附件(源代码)

#include 
using namespace std;
int c[20], n, num=0;//c[20]保存每一行棋子的位置,n为皇后数目,num为解数
void print(){

    for(int i=0; i>n;
    search(0);
    cout<

你可能感兴趣的:(人工智能,算法,数据结构)