Python实现BFS和DFS搜索算法
一、题目
如下重排九宫问题:
初
始
状
态
S
0
:
2
8
3
1
4
7
6
5
目
标
状
态
S
g
:
1
2
3
8
4
7
6
5
初始状态S_0:\begin{matrix}2&8&3\\1&&4\\7&6&5\end{matrix}\ \ \ \ \ \ \ \ \ \ \ 目标状态S_g:\begin{matrix}1&2&3\\8&&4\\7&6&5\end{matrix}
初始状态S0:21786345 目标状态Sg:18726345
二、代码
import numpy as np
import copy
class Node(object):
def __init__(self,item) -> None:
self.pre = []
self.item = item
self.next = []
item_temp = np.array(self.item)
index_0 = np.where(item_temp == 0)
self.x,self.y = np.dstack((index_0[0], index_0[1])).squeeze()
def CreatNewNode(self):
NewNodeList = []
for delta_x,delta_y in [[-1,0],[1,0],[0,1],[0,-1]]:
x = self.x + delta_x
y = self.y + delta_y
if x<0 or x>2 or y<0 or y>2:
continue
else:
temp = copy.deepcopy(self.item)
t = temp[x][y]
temp[x][y] = 0
temp[self.x][self.y] = t
NewNodeList.append(temp)
return NewNodeList
class TreeStruct(object):
def __init__(self,RootNode,Target) -> None:
self.head = RootNode
self.Target = Target
def CreatTreeStruct(self):
visited = []
present = [self.head]
future = []
flag = True
while present and flag:
for i in present:
Temp_NewNodeList = i.CreatNewNode()
for j in Temp_NewNodeList:
if j not in visited:
temp = Node(j)
temp.pre.append(i)
future.append(temp)
visited.append(j)
i.next.append(temp)
if self.Target in Temp_NewNodeList:
flag = False
present = future
future = []
class BFS(object):
def __init__(self,Target,TreeStruct) -> None:
self.Target = Target
self.TreeStruct = TreeStruct
self.Preresult = []
self.Finaresult = []
def search(self):
L1 = [self.TreeStruct.head]
L2 = []
index = 0
while True:
if self.Compare(L1[0]) == True:
L2.append(L1[0])
L1.pop(0)
self.Preresult = L2
return 1
else:
L2.append(L1[0])
L1.extend(L1[0].next)
L1.pop(0)
def Compare(self,PresentNode):
for i in range(3):
for j in range(3):
if PresentNode.item[i][j] != self.Target[i][j]:
return False
return True
def PrintResult(self):
FinaNode = self.Preresult[-1]
self.Finaresult.insert(0,FinaNode)
present = FinaNode
while len(present.pre) == 1:
present = present.pre[0]
self.Finaresult.insert(0,present)
for i in range(len(self.Finaresult)):
for j in range(3):
print(self.Finaresult[i].item[j][0],self.Finaresult[i].item[j][1],self.Finaresult[i].item[j][2])
print("——>")
print("总计步骤:",len(self.Finaresult))
class DFS(object):
def __init__(self,Target,TreeStruct) -> None:
self.Target = Target
self.TreeStruct = TreeStruct
self.Preresult = []
self.Finaresult = []
def search(self):
L1 = [self.TreeStruct.head]
L2 = []
while True:
if self.Compare(L1[0]) == True:
L2.append(L1[0])
L1.pop(0)
self.Preresult = L2
return 1
else:
L2.append(L1[0])
temp = copy.deepcopy(L1[0].next)
L1.pop(0)
temp.extend(L1)
L1 = copy.deepcopy(temp)
del temp
def Compare(self,PresentNode):
for i in range(3):
for j in range(3):
if PresentNode.item[i][j] != self.Target[i][j]:
return False
return True
def PrintResult(self):
FinaNode = self.Preresult[-1]
self.Finaresult.insert(0,FinaNode)
present = FinaNode
while len(present.pre) == 1:
present = present.pre[0]
self.Finaresult.insert(0,present)
for i in range(len(self.Finaresult)):
for j in range(3):
print(self.Finaresult[i].item[j][0],self.Finaresult[i].item[j][1],self.Finaresult[i].item[j][2])
print("——>")
print("总计步骤:",len(self.Finaresult))
if __name__ == "__main__":
Root = [[2,8,3],[1,0,4],[7,6,5]]
Target = [[1,2,3],[8,0,4],[7,6,5]]
RootNode = Node(Root)
Tree = TreeStruct(RootNode,Target)
Tree.CreatTreeStruct()
print("广度优先搜索:")
BFS = BFS(Target,Tree)
BFS.search()
BFS.PrintResult()
print("深度优先搜索:")
DFS = DFS(Target,Tree)
DFS.search()
DFS.PrintResult()