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函数进行输出,输出格式要求如下:
  1. 以序列格式存储结果输出,例如 [0,6,4,7,1,3,5,2] 指代在第 0-7 行依次在指定列落子;
  1. 给出尽可能多的求解,按解的数量按百分比给分,给出全部解此题满分
  1. 通过 self.solves.append([0,6,4,7,1,3,5,2]) 添加求解结果
  1. 最后结果以解的 list 格式输出

2. 实验内容

2.1 棋盘类

Chessboard 类来自当前目录下的文件 board.py,主要功能:
  1. 八皇后棋盘绘制
  1. 胜负条件判定
  1. 合法落子点判定
  1. 玩家互动接口
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 - - x
Out[3]:
True

2.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? ---- True

2.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 函数进行输出,输出格式要求如下:
  1. 以序列格式存储结果输出,例如 [0,6,4,7,1,3,5,2] 指代在第 0-7 行依次在指定列落子;
  1. 给出尽可能多的求解,按解的数量按百分比给分,给出全部解此题满分
  1. 通过 self.solves.append([0,6,4,7,1,3,5,2]) 添加求解结果
  1. 最后结果以解的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 - - - -
算法和应用数理统计网课资源辽宁大学-人工智能-黑白棋 AI 算法实验作业