在寬度優先解決八數碼問題基礎上對節點類增加深度屬性
import copy
import numpy as np
from datetime import datetime
# 字串列表化
defstring_to_ls
(str):
return
[i.split(
' ')
for i in
str.split(
',')
]# 獲取位置
defget_loacl
(arr, target)
:# r, c = np.where(arr == target)
# return r, c
for i in arr:
for j in i:
if j == target:
return arr.index(i)
, i.index(j)
# 獲取可以和0交換位置的元素
defget_elements
(arr)
: r, c = get_loacl(arr,
'0')
elements =
if r >0:
1][c])
# 上面的元素
if r <2:
1][c])
# 下邊的元素
if c >0:
[c -1]
)# 左面的元素
if c <2:
[c +1]
)# 右面的元素
return elements
defget_child
(arr, e)
:# 深拷貝與淺拷貝!!
arr_new = copy.deepcopy(arr)
r, c = get_loacl(arr_new,
'0')
r1, c1 = get_loacl(arr_new, e)
arr_new[r]
[c], arr_new[r1]
[c1]
= arr_new[r1]
[c1]
, arr_new[r]
[c]return arr_new
defis_goal
(arr, goal)
:return arr == goal
class
state
:def
__init__
(self, state, deep, parent)
:# state是乙個3x3的ls矩陣
self.state = state
self.deep = deep
self.parent = parent
defchidren
(self)
: chidren =
for i in get_elements(self.state)
: child = state(state=get_child(self.state, i)
, deep=self.deep +
1, parent=self)
return chidren
# 列印求解路徑
defprint_path
(n):
if n.parent ==
none
:return
else
:print
('↑'
)print
(np.array(n.parent.state)
) print_path(n.parent)
if __name__ ==
'__main__'
:# initial = '0 1 3,4 2 5,7 8 6'
# goal = '4 1 3,7 0 5,8 2 6'
# initial = '0 7 8,2 5 4,3 6 1'
# goal = '7 5 8,2 4 1,3 6 0'
initial =
'4 0 1,6 8 5,7 3 2'
goal =
'5 8 2,1 0 4,6 3 7'
initial_arr = state(string_to_ls(initial)
, deep=
0, parent=
none
) goal_arr = string_to_ls(goal)
start = datetime.now(
)open
=[initial_arr]
close =
# limit = eval(input('請輸入要搜尋的深度:'))
limit =
20while
len(
open
)>0:
open_tb =
[i.state for i in
open
] close_tb =
[i.state for i in close]
n =open
.pop(0)
if is_goal(n.state, goal_arr)
:print
(np.array(n.state)
) print_path(n)
print
('求解過程如上'
)break
else
:if n.deep < limit:
for i in n.chidren():
if i.state not
in open_tb:
if i not
in close_tb:
open
.insert(
0, i)
else
:print
('該深度下無解'
) end = datetime.now(
)print
('深度為{}下的搜尋步數為:{}'
.format
(close[-1
].deep,
len(close)-2
))print
('共耗時:'
, end - start)
廣度優先搜尋解決八數碼問題
程式描述 基於盲目搜尋策略的寬度優先搜尋方法 include include include include include include include using namespace std define n 9 九宮格總數字 陣列定義 0 9階乘定義 const int jc n 1 0 9...
八數碼寬度優先演算法
相關 要感謝網上的一些大神給予的分享 用來作為乙個結點的資料結構。struct map 用來列印乙個結點 cout函式用來擴充套件乙個結點的後繼結點 上 下 左 右 if hasgetblankcell break 移動數字,t i,t j為移動後0的座標 int t i i,t j j bool ...
深度優先搜尋解決八皇后問題
八皇后問題是什麼 八皇后問題,是乙個古老而著名的問題,是回溯演算法的典型案例。該問題是國際西洋棋棋手馬克斯 貝瑟爾於1848年提出 在8 8格的西洋棋上擺放八個皇后,使其不能互相攻擊,即任意兩個皇后都不能處於同一行 同一列或同一斜線上,問有多少種擺法。高斯認為有76種方案。1854年在柏林的象棋雜誌...