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

article/2025/11/10 11:43:13

问题描述:

在一个3*3的方棋盘上放置着1,2,3,4,5,6,7,8八个数码,每个数码占一格,且有一个空格。这些数码可以在棋盘上移动,其移动规则是:与空格相邻的数码方格可以移入空格。现在的问题是:对于指定的初始棋局和目标棋局,给出数码的移动序列。该问题称八数码难题或者重排九宫问题。

八数码

 

八数码问题的解决流程如下图所示:

八数码爬山流程图

 

算法源代码为:

import copyimport numpy as np
import random
import time
import math# 爬山法解决八皇后问题
# 八数码初始化函数,返回一个初始状态和一个目标状态,这里0代表八数码中的空格
def init():init_state = np.array([0, 1, 2, 3, 4, 5, 6, 7, 8])target_state = np.array([0, 1, 2, 3, 4, 5, 6, 7, 8])np.random.shuffle(init_state)np.random.shuffle(target_state)init_state = np.reshape(init_state, (3, 3))target_state = np.reshape(target_state, (3, 3))return init_state, target_state# 计算当前状态和目标状态下的曼哈顿距离
def compute_manhattan_distance(init_state, target_state):total_distance = 0for i in range(1, 9):(init_row, init_column) = np.where(init_state == i)(target_row, target_column) = np.where(target_state == i)total_distance += abs(target_row - init_row) + abs(target_column - init_column)return int(total_distance)# 计算接下来所有可能的行动带来的曼哈顿距离
def compute_manhattan_distance_all(init_state, target_state):distances = {}coord_cache = {}# 获取空白方块的坐标zero_row, zero_column = np.where(init_state == 0)# 计算空白方块尝试往四个方向移动后产生状态的曼哈顿距离if zero_row - 1 >= 0:  # 如果空白方块在最上边则不能往上移,下面同理up_row, up_column = zero_row - 1, zero_columncoord_cache["up"] = [up_row, up_column]if zero_row + 1 <= 2:down_row, down_column = zero_row + 1, zero_columncoord_cache["down"] = [down_row, down_column]if zero_column - 1 >= 0:left_row, left_column = zero_row, zero_column - 1coord_cache["left"] = [left_row, left_column]if zero_column + 1 <= 2:right_row, right_column = zero_row, zero_column + 1coord_cache["right"] = [right_row, right_column]for i in coord_cache.keys():  # 移动到所有可以移动的方向,然后计算移动之后的曼哈顿距离以便接下来的贪心选择计算temp = init_state.copy()temp[zero_row, zero_column] = temp[coord_cache[i][0], coord_cache[i][1]]temp[coord_cache[i][0], coord_cache[i][1]] = 0distances[i] = compute_manhattan_distance(temp, target_state)return distances# 得到distances中曼哈顿距离最小的方向
def minimal_manhattan_distance(distances):temp = copy.deepcopy(distances)minimal_value = 1000for i in temp.keys():if distances[i] < minimal_value:minimal_value = distances[i]return minimal_value# 根据得到的曼哈顿距离进行下一步移动
def next_move(init_state, distances):current_state = init_state.copy()zero_row, zero_column = np.where(current_state == 0)# 获取移动的方向minimal_value = 1000key = ""for i in distances.keys():if distances[i] < minimal_value:minimal_value = distances[i]key = iif key == "up":  # 空格向上移动,下面同理print("向上移动")up_row, up_column = zero_row - 1, zero_columntemp = current_state[up_row, up_column]current_state[zero_row, zero_column] = tempcurrent_state[up_row, up_column] = 0if key == "down":print("向下移动")down_row, down_column = zero_row + 1, zero_columntemp = current_state[down_row, down_column]current_state[zero_row, zero_column] = tempcurrent_state[down_row, down_column] = 0if key == "left":print("向左移动")left_row, left_column = zero_row, zero_column - 1temp = current_state[left_row, left_column]current_state[zero_row, zero_column] = tempcurrent_state[left_row, left_column] = 0if key == "right":print("向右移动")right_row, right_column = zero_row, zero_column + 1temp = current_state[right_row, right_column]current_state[zero_row, zero_column] = tempcurrent_state[right_row, right_column] = 0return current_state# 爬山算法
def climbing_algorithm():init_state, target_state = init()print("初始状态为:\n", init_state)print("目标状态为:\n", target_state)while True:current_manhattan_distance = compute_manhattan_distance(init_state, target_state)  # 计算当前状态与目标状态的曼哈顿距离print("当前状态距离目标的曼哈顿距离为:", current_manhattan_distance)if current_manhattan_distance == 0:  # 当前状态就是目标状态,算法结束return Truedistances = compute_manhattan_distance_all(init_state, target_state)  # 计算空白方块所有可以移动的方向和对应的曼哈顿值print("distances:", distances)print("distances里面的最小值为:", minimal_manhattan_distance(distances))if current_manhattan_distance <= minimal_manhattan_distance(distances):return False  # 即接下来无论如何移动的曼哈顿距离都大于目前的,则陷入了局部最优解init_state = next_move(init_state, distances)print("移动后的新状态为:\n", init_state)def climbing_algorithm_test(num):tic = time.time()success_case = 0fail_case = 0for i in range(num):print("第{0}个例子启动".format(i))if climbing_algorithm():success_case += 1print("第{0}个例子成功找到最优解".format(i))else:fail_case += 1print("第{0}个例子失败".format(i))toc = 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)

测试结果为:

1

 


http://chatgpt.dhexx.cn/article/5eRIPJ1y.shtml

相关文章

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

问题简述&#xff1a; 八皇后问题&#xff0c;一个古老而著名的问题&#xff0c;是回溯算法的典型案例。该问题由国际西洋棋棋手马克斯贝瑟尔于 1848 年提出&#xff1a;在 88 格的国际象棋上摆放八个皇后&#xff0c;使其不能互相攻击&#xff0c;即任意两个皇后都不能处于同一…

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

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

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

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

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

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

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

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

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

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

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

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

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

算法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;…