用Python写八数码问题

本文介绍了作者使用Python实现八数码问题的广度优先搜索算法,通过评估节点以提高搜索效率,目前仅找到正确解,未来计划研究A*算法以寻找最优解。
摘要由CSDN通过智能技术生成

这两天学习了下Python这个脚本语言,语法简单且丰富。

尝试用Python写了个八数码问题的算法,很方便就写出来了。

使用广度优先算法,改进了下,搜索下一个节点时评估一下,这样速度会快很多。

# coding=utf-8
'''
Created on 2014年12月18日

@author: osborn
'''
#实现字符串任两个位置的字符交换
def switchchar(str, p1, p2):
    left = p1
    right = p2
    if(p1 > p2):
        left = p2
        right = p1
    elif(p1 == p2):
        return str
    lstr = ""
    rstr = ""
    mstr = ""
    if(left == 0):
        lstr = ""
    else:
        lstr = str[:left]
    if(right == len(str) - 1):
        rstr = ""
    else:
        rstr = str[right + 1:]
    if((right - left) == 1):
        mstr = ""
    else:
        mstr = str[left + 1: right]
    return lstr + str[right] + mstr + str[left] + rstr

# 用对象表示状态点    
class Sta
  • 2
    点赞
  • 29
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
这里我提供一种使用A*算法的解法。 首先,八数码游戏是一种“滑块游戏”,在一个3×3的方格内,滑动8个数字方块以及一个空格,将数字方块移到正确的位置上。我们可以用一个3×3的二维数组表示八数码游戏。 算法步骤: 1. 定义八数码类,包括以下方法: - `__init__(self, puzzle, parent=None, move=None)`:构造方法,puzzle是3×3的二维数组表示状态矩阵,parent是父节点,move是当前状态与父节点状态不同的移动。 - `successor(self)`:扩展当前状态,返回所有可行的下一步状态。 - `heuristic(self)`:计算当前状态到目标状态的估价函数值。 - `get_path(self)`:返回从根节点到当前节点的路径。 - `__eq__(self, other)`:判断当前状态与另一个状态是否相等。 - `__lt__(self, other)`:用于堆排序。 2. 定义状态矩阵,包括以下方法: - `__init__(self, start_state, goal_state)`:构造方法,start_state是起始状态,goal_state是目标状态。 - `solve(self)`:解题主方法,使用A*算法求解八数码问题。 3. 定义A*算法,包括以下步骤: - 初始化open_list和closed_list,将起始状态加入open_list。 - 当open_list不为空时,取出f值最小的状态作为当前状态。 - 如果当前状态是目标状态,则返回解路径。 - 扩展当前状态,计算每个扩展状态的f值和g值,如果扩展状态已经存在于open_list或closed_list,比较g值,选取较小的g值存入open_list;否则将扩展状态加入open_list。 - 将当前状态加入closed_list。 4. 使用tkinter库实现可视化界面。利用Canvas绘制九宫格。 代码如下:
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值