人工智能实验二:约束满足问题

news2025/1/17 23:00:47

一、实验目的

  1. 求解约束满足问题;
  2. 使用回溯搜索算法求解八皇后问题。

二、实验平台

课程实训平台https://www.educoder.net/paths/369

三、实验内容及步骤

实训内容:2-4 第六章 约束满足问题

1.问题描述

八皇后问题是指在一个 8×8 的棋盘上摆放八个皇后,使得任意两个皇后都不能处于同一行、同一列或同一对角线上。因此,每行只能放一个皇后。

2.算法步骤

  1. 从第一行开始,枚举每个位置,判断该位置是否可以放置皇后,如果可以,则将皇后放置在该位置。
  2. 标记该列、主对角线和副对角线已被占用。
  3. 如果已经放置了8个皇后,增加计数器,回溯到上一行,将上一行皇后的位置改变,继续搜索下一列。
  4. 如果当前行没有找到合适的位置,回溯到上一行,将上一行皇后的位置改变,继续搜索下一列。
  5. 如果已经搜索完所有情况,结束搜索。

3.算法原理

回溯法是一种通过不断试错来解决问题的算法。在八皇后问题中,算法通过枚举每个位置,判断该位置是否可以放置皇后,如果可以则继续搜索下一行,否则回溯到上一行。在回溯的过程中,算法撤销之前放置的皇后和标记数组,继续搜索下一列。通过不断尝试,最终找到符合要求的解。回溯算法虽然简单,但是效率较低,因为需要穷举所有可能的情况

4.代码实现

该代码中的 searchh 函数用于在第 i 行搜索可以放置皇后的位置。在每一行中,每个皇后都有 8 个位置(列)可以试放。在尝试放置一个皇后时,需要检查该列、主对角线和副对角线是否已经被占用。

其中,b 数组记录了每一列是否已经有皇后占据,c 数组记录了主对角线是否已经有皇后占据,d 数组记录了副对角线是否已经有皇后占据。主对角线和副对角线的编号分别为 i+j 和 i-j+7。

如果已经放置了 8 个皇后,则增加计数器 sum 的值。如果没有放置完 8 个皇后,则继续在下一行搜索可行的位置。在回溯时,需要撤销之前放置的皇后和标记数组

核心代码如下:

void searchh(int i)
{
    for (int j = 1; j <= 8; j++)
    {
        if ((!b[j]) && (!c[i + j]) && (!d[i - j + 7]))//每个皇后都有八个位置(列)可以试放
        {
            /********** Begin **********/
            // 在(i,j)位置放置一个皇后
            a[i] = j;
            // 标记该列、主对角线、副对角线已被占用
            b[j] = c[i + j] = d[i - j + 7] = 1;
            // 如果已经放置了8个皇后
            if (i == 8)
            {
                // 增加计数器
                sum++;
            }
            else
            {
                // 在下一行搜索可行的位置
                searchh(i + 1);
            }
            // 回溯时撤销之前放置的皇后和标记数组
            b[j] = c[i + j] = d[i - j + 7] = 0;

            /********** End **********/
        }
    }
}

5.源程序

#include<iostream>
using namespace std;

int a[9];
int b[9] = { 0 };
int c[16] = { 0 };
int d[16] = { 0 };
int sum = 0;

void searchh(int i)
{
    for (int j = 1; j <= 8; j++)
    {
        if ((!b[j]) && (!c[i + j]) && (!d[i - j + 7]))//每个皇后都有八个位置(列)可以试放
        {
            /********** Begin **********/
            // 在(i,j)位置放置一个皇后
            a[i] = j;
            // 标记该列、主对角线、副对角线已被占用
            b[j] = c[i + j] = d[i - j + 7] = 1;
            // 如果已经放置了8个皇后
            if (i == 8)
            {
                // 增加计数器
                sum++;
            }
            else
            {
                // 在下一行搜索可行的位置
                searchh(i + 1);
            }
            // 回溯时撤销之前放置的皇后和标记数组
            b[j] = c[i + j] = d[i - j + 7] = 0;

            /********** End **********/
        }
    }
}

int main()
{
    searchh(1);
    cout << sum;
    return 0;
}

6.运行结果分析

在这里插入图片描述

运行结果92表示八皇后问题共有92种不同的解法。每个解法对应着八个皇后在棋盘上不同的摆放位置,满足每个皇后都不在同一行、同一列或同一对角线上的要求。由于八皇后问题的对称性,解法数量为92种。这个结果也可以通过计算八皇后问题的总解数来得到,其总解数为92。说明程序运行正确。

四、实验总结

本次实验中,我们使用回溯法解决了八皇后问题。通过枚举每个位置,判断该位置是否可以放置皇后,如果可以,则将皇后放置在该位置,并标记该列、主对角线和副对角线已被占用。如果已经放置了8个皇后,则增加计数器,回溯到上一行,将上一行皇后的位置改变,继续搜索下一列。如果当前行没有找到合适的位置,则回溯到上一行,将上一行皇后的位置改变,继续搜索下一列。最终,找到所有符合要求的解法。

在实验中,我们编写了八皇后问题的回溯法算法,并通过编写测试用例对算法进行了验证。测试结果表明,该算法能够正确地解决八皇后问题,并得到了92种不同的解法。算法的时间复杂度为 O(8^8),由于其需要枚举所有情况,所以效率相对较低,但对于八皇后问题这种规模较小的问题,仍然可以得到较好的解决。

在实验中,我们编写了八皇后问题的回溯法算法,并通过编写测试用例对算法进行了验证。测试结果表明,该算法能够正确地解决八皇后问题,并得到了92种不同的解法。算法的时间复杂度为 O(8^8),由于其需要枚举所有情况,所以效率相对较低,但对于八皇后问题这种规模较小的问题,仍然可以得到较好的解决。

在本次实验中,我深刻理解了回溯法算法的原理和实现过程,同时也了解到了八皇后问题这一经典问题。通过编写代码和测试用例,我掌握了如何使用回溯法算法解决问题,并在调试过程中积累了一定的编程经验。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/422906.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Spark运行模式介绍

文章目录1. Local运行模式1.1 基本运行情况介绍1.2 角色划分1.3 Spark 任务提交与解释器对比2. StandAlone运行模式2.1 StandAlone介绍2.2 StandAlone架构2.3 Spark应用架构2.4 StandAlone HA 运行原理3. Spark on YARN3.1 Spark on Yarn 本质3.2 部署模式3.3 两种部署模式运行…

stata变量引用

stata变量引用–潘登同学的stata笔记 文章目录stata变量引用--潘登同学的stata笔记变量生成gen命令通配符&#xff1a;*, ?, -因子变量时间序列变量命名、前缀与标签变量命名、添加前缀通配符与批量重命名变量标签数字-文字对应表CSMAR数据处理查看、查找变量单值、暂元单值暂…

TCP网络连接的书写

TCP网络连接的书写 文章目录TCP网络连接的书写服务器端书写进程sock创建创建bind进行端口绑定(进行bind的初始化)监听socket获取链接用户端创建sock套接字connect进行连接服务器端书写 为TCP是面向连接,所有需要进行对于端口进行监控&#xff0c;另外的UDP的服务器就不需要进行…

洛克菲勒:世界上只有两种人头脑聪明...

洛克菲勒&#xff1a;被人称为“石油大王”、美国第一位十亿富豪与全球首富、创办芝加哥大学。洛克菲勒写给儿子的信共有38封&#xff0c;这些信真实记录了洛克菲勒创造财富神话的种种业绩。从这些信中我们不仅可以看到洛克菲勒优良的品德、卓越的经商才能&#xff0c;还可窥见…

Spring面向切面编程AOP使用介绍

文章目录AOPAOP核心概念AOP快速入门AOP工作流程AOP切入点表达式AOP通知类型AOP通知获取数据AOP总结AOP AOP核心概念 AOP(Aspect Oriented Programming)面向切面编程&#xff0c;一种编程范式&#xff0c;指导开发者如何组织程序结构 OOP(Object Oriented Programming)面向对象…

Web自动化测试的详细流程和步骤,一篇足矣

Web自动化测试是软件测试中非常重要的一种测试方法&#xff0c;它通过编写脚本来模拟人工操作网页&#xff0c;从而实现对Web应用程序进行自动化测试的过程。为了保证测试质量和效率&#xff0c;我们需要遵循一定的流程和步骤来完成Web自动化测试。 一、测试环境准备 在进行W…

webp怎么转换成png,4个方法教你快速处理

webp怎么转换成png&#xff1f;目前在一些比较大的图片素材网站下载的图片都是webp格式的。我们都知道webp格式图片&#xff0c;它在正常的图片浏览器中是无法打开的。 所以说我们要把webp图片转变成png格式&#xff0c;正常来说我们常用的图片处理软件也能进行格式转换&#x…

都说互联网不行了,真的是这样吗?

最近在马士兵教育的课堂上经常会听到学员说这样的话&#xff1a; 现在公司都不招人&#xff0c;程序员根本找不到工作 早知道IT行业这么难&#xff0c;当初就不学编程了 简历石沉大海、面试机会也没有&#xff0c;互联网是不是不行了 互联网行情到底如何&#xff1f; 作为…

从此告别写SQL!DataLeap帮你零门槛完成“数据探查”

更多技术交流、求职机会&#xff0c;欢迎关注字节跳动数据平台微信公众号&#xff0c;回复【1】进入官方交流群 在日常数据处理工作中&#xff0c;产品、运营、研发或数据分析师经常会面临数据量大且混乱、质量参差不齐的问题&#xff0c;需要花费大量时间和精力校验表数据是否…

车企外卷:一个关于智能手机的“围城故事”

从2016年达到顶峰开始&#xff0c;全球智能手机出货量逐年下行&#xff0c;手机市场进入红海竞争逐渐成为了各界的共识。此后全球疫情与经济疲软的影响也进一步在手机市场施压&#xff0c;很多媒体认为手机产业距离“至暗时刻”已经不远。而在去年&#xff0c;新增变数&#xf…

Velocity tools进阶(下篇)

最近自己所做的项目使用到这个Velocity模板引擎&#xff0c;分享一下在互联网找的学习资料&#xff0c;仅供学习使用&#xff0c;不参与任何商业活动。 一. VelocityTools介绍 1.1 VelocityTools简介 Velocity Tools 是 Velocity模板引擎的一个子项目&#xff0c;用于将 Velo…

Excel玩转自然语言查询

ChatGPT火出圈&#xff0c;人类被人工智能替代又成为热门话题。有人欢喜&#xff0c;有人忧&#xff0c;也有人不以为意&#xff0c;觉得离自己工作远着呢&#xff0c;比如现在是用Excel做报表&#xff0c;有本事你动动嘴就直接把Excel里面的数据查询出来啊。 你可别说&#xf…

metersphere逻辑整理

整体架构 Frontend: MeterSphere 的前端工程, 基于 Vue.js 进行开发。 Backend: MeterSphere 的后端工程, 基于 Spring Boot 进行开发, 为 MeterSphere 的功能主体。 Chrome Plugin: 浏览器插件, 录制 Web 访问请求生成 JMeter 脚本并导入到 MeterSphere 中用于接口测试及性能…

阿里云产品试用更新,产品组合试用装更划算,快来免费上云吧

最近阿里云产品又上新了&#xff0c;尤其是推出了最新的产品组合试用装&#xff0c;个人觉得阿里云关于云产品的更新迭代是非常重视的&#xff0c;而且每次推出的产品不仅会惊艳到用户&#xff0c;而且产品功能也是随着一次迭代而更加完善、强大。前段时间也写了一篇关于为什么…

Nginx服务配置及相关模块

目录一、Nginx简介1、Nginx简介2、I/O模型相关概念3、Nginx事件驱动模型4、Nginx和Apache的区别二、编译安装Nginx服务1.关闭防火墙&#xff0c;将安装的Nginx软件包安装到opt目录下2、编译安装Nginx3、创建用户、组&#xff0c;以便于更好的管理4、创建软连接并启动5、停止Ngi…

FinClip 开发者工具重构升级!性能飞跃,体验有礼

一直以来不少开发者朋友在社区反馈&#xff0c;在使用 FIDE 工具的过程中&#xff0c;时常会遇到诸如加载不及时、代码预览/渲染性能不如意的情况&#xff0c;十分影响开发体验。 作为技术团队&#xff0c;我们深知一件趁手的开发工具对开发者的重要性&#xff0c;因此&#x…

企业AD域(域控服务器)的安装和配置详细教程

一、环境以及工具准备 软件&#xff1a;VMWare Workstation 2016 &#xff08; 下载链接&#xff1a;https://pan.baidu.com/s/1iX1VRilerYPGbGvX4pvaKw 提取码&#xff1a;75R6 &#xff09; 镜像&#xff1a;Windows Server 2016 &#xff08; 下载地址&#xff…

[CVPR 2020] Regularizing Class-Wise Predictions via Self-Knowledge Distillation

ContentsIntroductionClass-wise self-knowledge distillation (CS-KD)Class-wise regularizationEffects of class-wise regularizationExperimentsClassification accuracyReferencesIntroduction 为了缓解模型过拟合&#xff0c;作者提出 Class-wise self-knowledge distil…

SpringDataRedis客户端详解

SpringData是Spring中数据操作的模块&#xff0c;包含对各种数据库的集成&#xff0c;其中对Redis的集成模块就叫做SpringDataRedis&#xff0c;官网地址&#xff1a;https://spring.io/projects/spring-data-redis 提供了对不同Redis客户端的整合&#xff08;Lettuce和Jedis&…

乡村振兴吹响品牌号角——首届中国乡村振兴品牌大会成功举办

“品牌是力量&#xff0c;是变量&#xff0c;也是流量。”这是浙江省衢州市人大常委会副主任、常山县委书记潘晓辉在首届中国乡村振兴品牌大会上分享的乡村振兴实践体会&#xff0c;引发与会代表的广泛共鸣。 首届中国乡村振兴品牌大会主会场 4月10日至11日&#xff0c;以“加…