# -*- 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 八個數碼 每個數碼佔一格 且有乙個空格。這些數碼可以在棋盤上移動,其移動規則是 與空格相鄰的數碼方格可以移入空格。現在的問題是 對於指定的初始棋局和目標棋局,給出數碼的移動序列。該問題稱八數碼難題或者重排九宮問題。原始碼 ...