DFS和啟發式求解八皇后問題 Python

2021-09-27 09:39:06 字數 2164 閱讀 9755

# -*- coding: utf-8 -*-

import numpy as np

class eightqueens:

def __init__(self):

self.board = np.ones([8, 8])

# 解的數量

self.counter = 0

# 當前已經放置的棋子

self.chess_puted =

# 儲存選中當前行每列(m,n)中棋子後的空格數

self.colspace = np.zeros((8, 8))

def check_chess(self, m, n):

if len(self.chess_puted) == 0:

return true

else:

# 判斷點的x y 座標

coordinate = np.array([m, n])

for i in range(len(self.chess_puted)):

# 座標之差

diff = coordinate - self.chess_puted[i]

# 行、列、對角線

if diff[0] != diff[1] and diff[0] != -diff[1] and diff[

0] != 0 and diff[1] != 0:

continue

else:

return false

return true

def dfs(self, m):

if m == 8:

# 解的數量

self.counter += 1

print("第" + str(self.counter) + "個解的棋盤結果")

print(self.board)

return

for n in range(8):

# 檢查當前位置(m,n)能否放置棋子

if self.check_chess(m, n):

self.board[m, n] = 0

# 新增棋子座標到chess_puted

# 遞迴

self.dfs(m + 1)

# 恢復到之前的狀態

self.board[m, n] = 1

self.chess_puted.remove([m, n])

def findspace(self, m, n):

count = 0

row, col = m, n

# 副對角線

while row < 8 and -1 < col:

row += 1

col -= 1

count += 1

row, col = m, n

# 正對角線

while row < 8 and col < 8:

row += 1

col += 1

count += 1

return 64 - count

def evaluationfun(self, m):

if m == 8:

print("啟發式求解:")

self.counter += 1

print("第" + str(self.counter) + "個解的棋盤結果")

print(self.board)

return

for n in range(8):

if self.check_chess(m, n):

self.colspace[m, n] = self.findspace(m, n)

while self.colspace.sum(axis=1)[m] != 0:

x, y = m, np.argmax(self.colspace, axis=1)[m]

self.board[x, y] = 0

self.evaluationfun(x + 1)

self.board[x, y] = 1

self.colspace[x][y] = 0

self.chess_puted.remove([x, y])

if __name__ == '__main__':

e = eightqueens()

e.dfs(0)

八皇后(c 啟發式函式求解)

八皇后問題是回溯演算法的典型案例,在回溯法中,常常是盲目搜尋,耗費過多的搜尋時間。在本次實驗中,使用了啟發式搜尋,搜尋時不是任取乙個分支,而是選擇最佳的分支往下搜尋。通過定義狀態空間 操作規則 搜尋策略,我們可以清晰快速地得到原問題的乙個解。八皇后問題是乙個以西洋棋為背景的問題 如何能夠在 8 8 ...

啟發式搜尋之八皇后問題

主要公式fx gx hx g x 針對於初始節點,到目標節點實際所需要付出的帶價 h x 針對初始節點,到目標節點所需要的估計帶價 在八皇后問題上,估計帶價,是自己預定的,此處設定,其為皇后的碰撞對數,當然,估計是最優 的問題,就是0,無碰撞才是最優的結果。注釋都有,自行消化 package heu...

八數碼問題 啟發式搜尋

一 問題描述 在乙個3 3 的方棋盤上放置著 1,2,3,4,5,6,7,8 八個數碼 每個數碼佔一格 且有乙個空格。這些數碼可以在棋盤上移動,其移動規則是 與空格相鄰的數碼方格可以移入空格。現在的問題是 對於指定的初始棋局和目標棋局,給出數碼的移動序列。該問題稱八數碼難題或者重排九宮問題。原始碼 ...