这篇文章主要介绍了大蟒广度搜索解决八数码难题。想了解算法和数据结构的同学,一定要看一下
—— 八数码难题 ——
1.题目描述
八数码问题也称为九宫问题。在33的棋盘,摆有八个棋子,每个棋子上标有一至8的某一数字,不同棋子上标的数字不相同。棋盘上还有一个空格,与空格相邻的棋子可以移到空格中。要求解决的问题是:给出一个初始状态和一个目标状态,找出一种从初始状态转变成目标状态的移动棋子步数最少的移动步骤。
代码
使用算法:广度搜索算法
大蟒
将numpy作为铭牌导入
类别状态:
def __init__(self,state,directionFlag=None,parent=None):
自我状态=状态
self.direction=['up ',' down ',' right ',' left']
如果方向标志:
自我。方向。移除(方向标志)
self.parent=parent
self.symbol=' '
定义目标方向(自身):
回归自我
def showInfo(自身):
对于范围(3)中的我:
对于范围(3)中的j:
print(self.state[i,j],end=' ')
打印(' \n ')
打印('-\n ')
返回
def getEmptyPos(self):
位置=NP。哪里(自我。状态==自我。符号)
返回位置
定义生成子对象(自身):
如果不是自我指导:
return []
subStates=[]
boarder=len(self.state) - 1
row,col=self.getEmptyPos()
如果自身方向为"左",且列0:
s=self.state.copy()
temp=s.copy()
s[行,列]=s[行,列-1]
s[行,列-1]=临时[行,列]
news=State(s,directionFlag='right ',parent=self)
subStates.append(新闻)
如果在自方向和第0行"向上":
s=self.state.copy()
temp=s.copy()
s[行,列]=s[行-1,列]
s[row-1,col]=temp[row,col]
新闻=状态(s,directionFlag='down ',父代=自身)
subStates.append(新闻)
如果在自身方向和行边界"向下":
s=self.state.copy()
temp=s.copy()
s[row,col]=s[row 1,col]
s[row 1,col]=temp[row,col]
新闻=状态(s,directionFlag='up ',父代=自身)
subStates.append(新闻)
if self.direction.count('右')和栏边界:
s=self.state.copy()
temp=s.copy()
s[行,列]=s[行,列1]
s[行,列1]=临时[行,列]
新闻=状态(s,directionFlag='左,父代=自身)
subStates.append(新闻)
返回子状态
定义求解(自身):
openTable=[]
closeTable=[]
openTable.append(self)
步骤=1
而len(openTable) 0:
n=openTable.pop(0)
closeTable.append(n)
subStates=n.generateSubStates()
路径=[]
对于子状态中的学生:
if(s state==s answer).all():
而s爸妈和s爸妈!=原始状态:
路径.追加(父)
s=s父母
path.reverse()
返回路径,步骤一
openTable.extend(子状态)
步骤=1
否则:
不返回,不返回
if __name__=='__main__ ':
symbolOfEmpty=' '
State.symbol=symbolOfEmpty
originState=State(np.array([[2,8,3],[1,6,4],[7,symbolOfEmpty,5]]))
State.answer=np.array([[1,2,3],[8,State.symbol,4],[7,6,5]])
s1=状态(state=originState.state)
path,steps=s1.solve()
如果路径:
对于路径中的节点:
node.showInfo()
打印(状态。答案)
打印('总步骤为%d' %步骤)
以上就是大蟒广度搜索解决八数码难题的详细内容,更多关于大蟒广度搜索八数码的资料请关注我们其它相关文章!
郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。