人工智能-爬山法解决八皇后问题-python源码

article/2025/11/9 11:36:25

问题简述:

八皇后问题,一个古老而著名的问题,是回溯算法的典型案例。该问题由国际西洋棋棋手马克斯·贝瑟尔于 1848 年提出:在 8×8 格的国际象棋上摆放八个皇后,使其不能互相攻击,即任意两个皇后都不能处于同一行、同一列或同一斜线上,问有多少种摆法。

01

算法的逻辑流程图如下所示:

八皇后爬山法流程图

源代码为:

import copy
import numpy as np
import random
import time# 爬山法解决八皇后问题# 八皇后初始化函数
def init():cache = {}m = np.zeros((8, 8), dtype=int)for i in range(0, 8):temp = random.randrange(0, 8)m[temp, i] = 1cache["queen" + str(i)] = [temp, i]return m, cache# 计算当前状态碰撞数量
def compute_weight_single(coord_cache):weight = 0for i in range(0, 8):x, y = coord_cache["queen" + str(i)]for j in range(i + 1, 8):_x, _y = coord_cache["queen" + str(j)]if _x - x == j - i or _x - x == i - j:weight += 1if _x == x:weight += 1return weight# 计算8X8的碰撞矩阵
def compute_weight_matrix(coord_cache):weight_matrix = np.zeros((8, 8))for i in range(0, 8):for j in range(0, 8):# fix bug# 此处需用dict.copy函数,直接写赋值会导致仅仅建立了一个引用,改变引用也会改变原来的值temp_coord_cache = coord_cache.copy()temp_coord_cache["queen" + str(i)] = [j, i]weight = compute_weight_single(temp_coord_cache)weight_matrix[j, i] = weightreturn weight_matrix# 根据碰撞矩阵调整皇后的位置
def next_move(cache, weight_matrix):coord_cache = cachemin = np.min(weight_matrix)for i in range(0, 8):for j in range(0, 8):if weight_matrix[j, i] == min:# 调整皇后的位置coord_cache["queen" + str(i)] = [j, i]return coord_cache# 把当前的皇后状态画出来
def draw(coord_cache):m = np.zeros((8, 8), dtype=int)for i in range(8):row, column = coord_cache["queen" + str(i)]row, column = int(row), int(column)m[row][column] = 1return m# 爬山算法
def climbing_algorithm():m, coord_cache = init()while True:weight = compute_weight_single(coord_cache)  # 计算当前状态的碰撞值# print("当前的八皇后状态为:\n", draw(coord_cache))# print("当前的八皇后状态的碰撞度为\n", weight)if weight == 0:  # 碰撞值为零,为目标状态,算法结束return Trueweight_matrix = compute_weight_matrix(coord_cache)  # 计算8*8的碰撞矩阵# print("当前的碰撞矩阵为:\n", weight_matrix)# 如果碰撞矩阵的最小值都大于等于当前状态的碰撞值,则不能找到一个更好的解if weight_matrix.min() >= weight:return Falseelse:coord_cache = next_move(coord_cache, weight_matrix)  # 移动皇后def climbing_algorithm_test(num):tic = time.time()success_case = 0fail_case = 0for i in range(num):if climbing_algorithm():print("第{0}个例子成功找到最优解".format(i))success_case += 1else:print("第{0}个例子失败".format(i))fail_case += 1toc = time.time()print("{0}个例子中成功解决的例子为:{1}".format(num, success_case))print("{0}个例子成功解决的百分比为:{1}".format(num, success_case / num))print("{0}个例子中失败的例子为:{1}".format(num, fail_case))print("{0}个例子失败的百分比为:{1}".format(num, fail_case / num))print("{0}个例子运行算法所需的时间为:{1}秒".format(num, toc - tic))climbing_algorithm_test(10000)

 

测试结果:

各算法解决八皇后八数码成功率:

比较图

 

 


http://chatgpt.dhexx.cn/article/gdCO2ec3.shtml

相关文章

树的搜索问题1(深度优先、广度优先,爬山法和best-first)

前言 我们在解决问题中经常使用到的数据结构一定少不了树,在数据结构这一大块中,我们对每一个结构都会讲各种形形色色的操作,比如栈的压栈出栈,树的各种遍历,但其实数据结构最重要的操作其实是搜索。如果我们不知道链…

TSP问题解决:模拟退火、贪心法、爬山法,Python实现

TSP问题解决:模拟退火、贪心法、爬山法,Python实现这里写目录标题 一、TSP问题二、简单介绍:贪心法、爬山法、模拟退火三、python代码实现四、分别用这三种方法得出结果,进行比较 一、TSP问题 1、TSP问题描述 简单来说&#xff0…

爬山法实现 八皇后问题 (Python 实现)

本文主要简单阐述爬山法的基本算法思想,并给出用此算法实现八皇后问题详细过程 最基本的爬上搜索算法表示:(节选自《人工智能》第二版): function HILL-CLIMBING(problem) return a state thate is a locak maximum inputs: problem …

爬山法求解八皇后问题的全部解法

爬山法求解八皇后问题的全部解法 程序的概要设计思想初始状态冲突函数寻找邻居状态寻找全部解集 程序主要函数的作用运行结果截图Python源代码 程序的概要设计思想 爬山算法是一种局部贪婪算法,每次更新一次状态,都对相邻状态的冲突状态进行排序&#x…

Python启发式算法中爬山法的讲解及解方程问题实战(超详细 附源码)

一、启发式算法 还有一类重要的迭代法,它的迭代关系式不依赖问题的数学性能,而是受某种自然现象的启发而得到,称为启发式算法(Heuristic Algorithm),如爬山法、遗传算法、模拟退火算法、蚁群算法等。 启发…

人工智能:爬山法、随机重启爬山法、模拟退火算法、遗传算法、启发式搜索方法解决八数码和八皇后问题

摘要 本文主要分为两个部分,分别采用实验对比对不同的方法进行分析。第一,以八数码问题和八皇后问题为例,对比爬山法,随机重启爬山法,模拟退火算法,遗传算法的搜索性能。第二,以八数码问题为例…

进化优化算法--第二章:爬山法

算法2.1&#xff1a; 最快上升爬山法 x0 <- 随机生成的个体 while not ( 终止准则)计算x0的适应度f(x0)For 每一个解的特征 q1,2,,...nxq <- x0 用一个随机变异替换xq的第q个特征计算xq的适应度f(xq)获取下一个更优的解:寻找使f(xq)最大的xq, 令其等于x, x <- argma…

Python:爬山法/随机重启爬山法/允许侧移的爬山法解决八皇后问题

文章目录 1 八皇后问题2 程序代码2.1 程序12.2 程序22.3 程序32.3.1 爬山法2.3.2 随机重启爬山法2.3.3 允许皇后侧移的爬山法 3 评价 1 八皇后问题 有一个8乘8的棋盘&#xff0c;现在要将八个皇后放到棋盘上&#xff0c;满足&#xff1a;对于每一个皇后&#xff0c;在自己所在…

爬山法和模拟退火

文章目录 前言一、爬山法1.算法步骤2.算法局限性 二、模拟退火1.算法步骤2.注意点3.例题求费马点保龄球均分数据 总结 前言 爬山法和模拟退火都为随机化算法&#xff0c;考场想不到正解时可用来骗分&#xff0c;通常效果较好。模拟退火是基于爬山法的优化。 一、爬山法 爬山法是…

搜索算法——爬山法

不断更新中...... 一、 爬山算法&#xff1a;爬山算法是一种简单的贪心搜索算法&#xff0c;该算法每次从当前位置的临近空间中选择一个最优解作为当前解&#xff0c;直到达到一个局部最优解。爬山算法可以类比成一个有失忆的人在浓雾中爬山。这里就揭示了爬山算法的两个问题…

搜索 —— 启发式搜索 —— 爬山法

【概述】 爬山法&#xff08;Hill Climbing&#xff0c;HC&#xff09;是一种局部择优的贪心搜索算法&#xff0c;其本质上是梯度下降法。 该算法每次从当前的节点开始&#xff0c;与周围的邻接点进行比较&#xff1a; 若当前节点是最大的&#xff0c;那么返回当前节点&…

Linux:快速查看IP地址及修改IP地址

导读Linux下如何快速查看IP地址及修改IP地址&#xff0c;有一个方法供参考 查ip 方法/步骤1: 打开linux操作系统在进入到界面 方法/步骤2: 在桌面右击打开终端。 方法/步骤3: 终端里输入ifconfig -a命令在回车键 方法/步骤4: 如下图可以看到了ip地址。 修改ip 方法/…

Linux Ubuntu查看IP信息的两种方式Ubuntu中检查你的 IP 地址

论使用什么系统&#xff0c;都有用到ip地址的时候&#xff0c;习惯了windows系统的人很容易就能查找出系统的ip&#xff0c;但是在linux系统如何查看ip呢&#xff1f;作为Linux新手&#xff0c;以Ubuntu的使用经验&#xff0c;我知道Ubuntu查看IP有两种方式。 第一种是在终端中…

Linux查询出口IP

查询的方式是通过Linux的curl访问查询ip的网站进行查询 具体步骤&#xff1a; 1.查询查询ip网站的ip 2.配置Linux的hosts文件 在/etc中的hosts文件增加上面的域名和ip&#xff08;注意&#xff1a;是ifconfig&#xff0c;不是ipconfig&#xff09; 3.在ssh命令下执行 curl ifc…

Linux 查看本地ip

Linux 查看本地ip 终端中输入指令ifconfig -a终端中输入指令hostname -I通过图形界面查看IP地址&#xff08;还未试通&#xff09; 终端中输入指令ifconfig -a 弹出的IP地址有点多 。 终端中输入指令hostname -I 会直接显示本机在局域网内的IP地址&#xff0c;但可能会显示多…

Linux服务器查看Ip地址

在服务器的网络配置中&#xff0c;需要同时配置这两种网络&#xff0c;才能使服务器正常使用。使用内网是为了保证我们的服务器处在一个安全的网络环境中&#xff0c;可以减少外部病毒的影响&#xff0c;而访问外网是为了方便我们配置服务器一些资源&#xff0c;如驱动程序&…

Linux 查看IP

UBuntu 系统下 按CtrlAltT 唤出终端 在终端输入: ifconfig 命令 点击回车 就可以看到自己电脑在局域网的IP地址了 图中第二行 inet 地址&#xff1a;192.168.1.101 就是你的电脑在局域网的IP地址了 如果输入 ifconfig 提示 找不到命令 那就在终端输入&#xff1a;sudo apt-get …

linux查看本机ip地址

linux中哪个命令可以查看自己的IP地址 50 我的主机是通过宽带联网的&#xff0c;主机的IP通过那个本地连接可以看到&#xff0c;但在虚拟机Debian linux5.0终端下输入route -n显示的是destination的IP&#xff0c;怎么查看属于虚拟机linux的IP呢&#xff1f;&#xff08;linux通…

Linux系统下怎么查询自己的ip和port

Linux系统下如何查询自己的ip和port 前言&#xff1a;在Linux系统中&#xff0c;学习网络协议之后&#xff0c;就需要经常查看自己系统的ip和port是否正常开启,那么怎么快速查找它们呢&#xff1f; 我现在就把它们列出来&#xff0c;以解我的心头之恨&#xff01;&#xff01;…

Linux查看IP地址命令

Linux查看公有&#xff08;运营商&#xff09;IP地址&#xff1a;下面两个命令都可以查 curl http://ifconfig.io curl ident.me Linux查看私有IP地址&#xff1a;可以使用以下四个命令中的任一一个 ip addr hostname -I | awk {print $1} ip route get 1.2.3.4 | awk {print…