一、问题描述
数码问题又称9宫问题,与游戏“华容道”类似。意在给定的3*3棋格的8个格子内分别放一个符号,符号之间互不相同,余下的一格为空格。并且通常把8个符号在棋格上的排列顺序称作8数码的状态。开始时,规则给定一个初始状态和一个目标状态,并要求被试者对棋格内的符号经过若干次移动由初始状态达到目标状态,这个过程中只有空格附近的符号以朝空格的方向移动,且每次只能移动一个符号。
问如何使空格移动最少次数到达目标状态。
二、启发式搜索
三、代码实现
# -*- coding: utf-8 -*-
"""
Created on Sun May 16 20:07:59 2021
@author: DJ MR.L
"""
"""A星算法解决八数码问题"""
import numpy as np
import copy
import time
from operator import itemgetter
goal = {
}
def get_location(vec, num): #找到num对应的位置
row_num = vec.shape[0] #行
line_num = vec.shape[1] #列
for i in range(row_num):
for j in range(line_num):
if num == vec[i][j]:
return i, j
def get_actions(vec): #判断下一步能移动的位置
row_num = vec.shape[0]
line_num = vec.shape[1]
(x, y) = get_location(vec, 0) #获取0的位置
action = [(0, 1), (0, -1), (1, 0), (-1, 0)]
#判断下一步可以移动的位置
if x == 0: #0在第一行,不能上移
action.remove((-1, 0))
if y == 0: #不能左移
action.remove((0, -1))
if x == row_num - 1: #不能下移
action.remove((1, 0))
if y == line_num - 1: #不能右移
action.remove((0, 1))
return list(action)
def