type
status
date
slug
summary
tags
category
icon
password
逻辑推理 - 八皇后问题1. 实验介绍
1.1 实验背景
逻辑编程是一种编程典范,它设置答案须匹配的规则来解决问题,而非设置步骤来解决问题。过程是“事实+规则=结果”。
人工智能的发展与逻辑编程的发展是一个相辅相成的过程,早期的人工智能以规则和逻辑推理作为主要研究方向,这在逻辑编程的发展中发挥了重要的影响,另外更好更快的逻辑编程也推动了人工智能的发展,例如专家系统、知识图谱和自动定理证明。
Python 是一种解释型、面向对象、动态数据类型的高级程序设计语言。
在数据驱动学习时代,Python 的崛起已经是一个不争的事实,并且成为人工智能算法的第一语言。
在本次实验中,我们学习将 Python 应用于逻辑编程,并尝试自主撰写逻辑规则解决斑马问题以及八皇后问题。
1.2 实验内容
八皇后问题: 如何能在 8*8 的国际象棋棋盘上放置八个皇后,使得任何一个皇后都无法直接吃掉其他的皇后?为了到达此目的,任两个皇后都不能处于同一条横行、纵行或斜线上。
参考资料:八皇后问题-百度百科
1.3 实验要求
- 基本掌握逻辑编程的思想,了解逻辑编程与命令式编程的区别
- 能够依据给定的事实以及规则编写代码,解决逻辑约束问题(CLP)
- 使用 Python 语言
1.4 注意事项
- Python 与 Python Package 的使用方式,可在右侧
API文档中查阅。
- 当右上角的『Python 3』长时间指示为运行中的时候,造成代码无法执行时,可以重新启动 Kernel 解决(左上角『Kernel』-『Restart Kernel』)。
1.5 作业提交
- 在左侧
提交作业的标签中,把整个 Game 转化为 main.py 文件进行系统测试。
- 能通过测试就可以提交作业。
请在指定区域内完成作答(可自由定义需要的函数),Game Cell模块通过get_results函数进行输出,输出格式要求如下:
- 以序列格式存储结果输出,例如 [0,6,4,7,1,3,5,2] 指代在第 0-7 行依次在指定列落子;
- 给出尽可能多的求解,按解的数量按百分比给分,给出全部解此题满分
- 通过 self.solves.append([0,6,4,7,1,3,5,2]) 添加求解结果
- 最后结果以解的 list 格式输出
2. 实验内容
2.1 棋盘类
Chessboard 类来自当前目录下的文件 board.py,主要功能:
- 八皇后棋盘绘制
- 胜负条件判定
- 合法落子点判定
- 玩家互动接口
import numpy as np # 提供维度数组与矩阵运算 import copy # 从copy模块导入深度拷贝方法 from board import Chessboard
2.2 棋盘展示
2.2.1 棋盘类的初始化
# 初始化8*8八皇后棋盘 chessboard = Chessboard()
0 1 2 3 4 5 6 7 0 - - - - - - - - 1 - - - - - - - - 2 - - - - - - - - 3 - - - - - - - - 4 - - - - - - - - 5 - - - - - - - - 6 - - - - - - - - 7 - - - - - - - -
# 在棋盘上的坐标点(4,4)落子 chessboard.setQueen(4,4)
0 1 2 3 4 5 6 7
0 x - - - x - - -
1 - x - - x - - x
2 - - x - x - x -
3 - - - x x x - -
4 x x x x o x x x
5 - - - x x x - -
6 - - x - x - x -
7 - x - - x - - xOut[3]:
True2.2.3 胜利条件
# 方法一,逐子落子 # 选择False不打印中间过程棋盘 # 完成八皇后落子 # 终局胜负条件判定及输出 chessboard.boardInit(False) chessboard.setQueen(0,0,False) chessboard.setQueen(1,6,False) chessboard.setQueen(2,4,False) chessboard.setQueen(3,7,False) chessboard.setQueen(4,1,False) chessboard.setQueen(5,3,False) chessboard.setQueen(6,5,False) chessboard.setQueen(7,2,False) chessboard.printChessboard(False) print("Win? ---- ",chessboard.isWin())
0 1 2 3 4 5 6 7 0 o - - - - - - - 1 - - - - - - o - 2 - - - - o - - - 3 - - - - - - - o 4 - o - - - - - - 5 - - - o - - - - 6 - - - - - o - - 7 - - o - - - - - Win? ---- True
# 方法二,序列落子 # 选择False不打印中间过程棋盘 # 完成八皇后落子 # 终局胜负条件判定及输出 chessboard.boardInit(False) Queen_setRow = [0,6,4,7,1,3,5,2] for i,item in enumerate(Queen_setRow): chessboard.setQueen(i,item,False) chessboard.printChessboard(False) print("Win? ---- ",chessboard.isWin())
0 1 2 3 4 5 6 7
0 o - - - - - - -
1 - - - - - - o -
2 - - - - o - - -
3 - - - - - - - o
4 - o - - - - - -
5 - - - o - - - -
6 - - - - - o - -
7 - - o - - - - -
Win? ---- True2.2.4 玩家试玩
# 开放接口 # 让玩家自行体验八皇后游戏 chessboard = Chessboard() chessboard.play()
0 1 2 3 4 5 6 7
0 - - - - - - - -
1 - - - - - - - -
2 - - - - - - - -
3 - - - - - - - -
4 - - - - - - - -
5 - - - - - - - -
6 - - - - - - - -
7 - - - - - - - -2.3 八皇后搜索-游戏类
- 完成 Game Cell 后,在左侧
提交作业的标签中,把整个 Game Cell 转化为 main.py 文件进行系统测试
- 能通过测试就可以提交作业。
请在指定区域内完成作答(可自由定义需要的函数),Game Cell 模块通过 get_results 函数进行输出,输出格式要求如下:
- 以序列格式存储结果输出,例如 [0,6,4,7,1,3,5,2] 指代在第 0-7 行依次在指定列落子;
- 给出尽可能多的求解,按解的数量按百分比给分,给出全部解此题满分
- 通过 self.solves.append([0,6,4,7,1,3,5,2]) 添加求解结果
- 最后结果以解的list格式输出
import numpy as np # 提供维度数组与矩阵运算 import copy # 从copy模块导入深度拷贝方法 from board import Chessboard # 基于棋盘类,设计搜索策略 class Game: def __init__(self, show = True): """ 初始化游戏状态. """ self.chessBoard = Chessboard(show) self.solves = [] self.gameInit() # 重置游戏 def gameInit(self, show = True): """ 重置棋盘. """ self.Queen_setRow = [-1] * 8 self.chessBoard.boardInit(False) def check(self, position, row, column): # row: current row for i in range(row): if position[i] == column or position[i] - i == column - row or position[i] + i == column + row: return False return True def putQueen(self, position, row): if(row==8): self.solves.append(copy.deepcopy(position)) else: for column in range(8): if self.check(position, row, column): position[row]=column self.putQueen(position, row+1) def run(self, row=0): # self.solves.append([0,6,4,7,1,3,5,2]) position=[-1] * 8 self.putQueen(position, 0) def showResults(self, result): """ 结果展示. """ self.chessBoard.boardInit(False) for i,item in enumerate(result): if item >= 0: self.chessBoard.setQueen(i,item,False) self.chessBoard.printChessboard(False) def get_results(self): """ 输出结果(请勿修改此函数). return: 八皇后的序列解的list. """ self.run() return self.solves
2.4 八皇后搜索
game = Game() solutions = game.get_results() print('There are {} results.'.format(len(solutions))) game.showResults(solutions[0])
0 1 2 3 4 5 6 7 0 - - - - - - - - 1 - - - - - - - - 2 - - - - - - - - 3 - - - - - - - - 4 - - - - - - - - 5 - - - - - - - - 6 - - - - - - - - 7 - - - - - - - - There are 92 results. 0 1 2 3 4 5 6 7 0 o - - - - - - - 1 - - - - o - - - 2 - - - - - - - o 3 - - - - - o - - 4 - - o - - - - - 5 - - - - - - o - 6 - o - - - - - - 7 - - - o - - - -
- 作者:yushimingyu
- 链接:https://yushi.com/article/1238
- 声明:本文采用 CC BY-NC-SA 4.0 许可协议,转载请注明出处。
相关文章
