以下是人工智能状态空间搜索方法的一次实例,使用python语言编写。
#!usr/bin/python 2.7
#状态空间法
class Shoreside:
"这是状态空间类"
def __init__(self, parent):
if parent!= None:
self.f=parent.f # 爸爸
self.m=parent.m # 妈妈
self.g1=parent.g1 # 女儿1
self.g2=parent.g2 # 女儿2
self.b1=parent.b1 # 儿子1
self.b2=parent.b2 # 儿子2
self.po=parent.po # 警察
self.pr=parent.pr # 犯人
self.st=parent.st + 1 #步数
else:
# 1 在初始岸边,0 另一边
self.f=1 # 爸爸
self.m=1 # 妈妈
self.g1=1 # 女儿1
self.g2=1 # 女儿2
self.b1=1 # 儿子1
self.b2=1 # 儿子2
self.po=1 # 警察
self.pr=1 # 犯人
self.st=0 # 步数
self.parent=parent
# 判读状态是否相同
def EqualStatus(self,other):
return (self.f==other.f) and (self.m==other.m)\
and (self.g1==other.g1) and (self.g2==other.g2)\
and (self.b1==other.b1) and (self.b2==other.b2)\
and (self.po==other.po) and (self.pr==other.pr)\
and (self.st%2==other.st%2)
#打印状态
def PrintStatus(self):
info = '[f:'+ str(self.f)+ '][m:'+ str(self.m)+\
'][g1:'+ str(self.g1)+ '][g2:'+ str(self.g2)+\
'][b1:'+ str(self.b1)+ '][b2:'+ str(self.b2)+\
'][po:'+ str(self.po)+ '][pr:'+ str(self.pr)+\
']step='+ str(self.st)
print info
#判断是否成功过河
def Succeed(self):
return (self.f+self.m+self.g1+self.g2+self.b1+self.b2+self.po+self.pr)==0
#可以产生的状态转变
def NextStatus(self,index):
if index==1: #爸爸过河
if self.st%2==1:
if self.f==1:
self.f=0
return True
else:
if self.f==0:
self.f=1
return True
elif index==2: #爸爸和儿子1过河
if self.st%2==1:
if self.f==1 and self.b1==1:
self.f=0
self.b1=0
return True
else:
if self.f==0 and self.b1==0:
self.f=1
self.b1=1
return True
elif index==3: #爸爸和儿子2过河
if self.st%2==1:
if self.f==1 and self.b2==1:
self.f=0
self.b2=0
return True
else:
if self.f==0 and self.b2==0:
self.f=1
self.b2=1
return True
elif index==4: #妈妈过河
if self.st%2==1:
if self.m==1:
self.m=0
return True
else:
if self.m==0:
self.m=1
return True
elif index==5: #妈妈和女儿1过河
if self.st%2==1:
if self.m==1 and self.g1==1:
self.m=0
self.g1=0
return True
else:
if self.m==0 and self.g1==0:
self.m=1
self.g1=1
return True
elif index==6: #妈妈和女儿2过河
if self.st%2==1:
if self.m==1 and self.g2==1:
self.m=0
self.g2=0
return True
else:
if self.m==0 and self.g2==0:
self.m=1
self.g2=1
return True
elif index==7: #爸爸和妈妈过河
if self.st%2==1:
if self.f==1 and self.m==1:
self.f=0
self.m=0
return True
else:
if self.f==0 and self.m==0:
self.f=1
self.m=1
return True
elif index==8: #警察过河
if self.st%2==1:
if self.po==1:
self.po=0
return True
else:
if self.po==0:
self.po=1
return True
elif index==9: #警察和犯人过河
if self.st%2==1:
if self.po==1 and self.pr==1:
self.po=0
self.pr=0
return True
else:
if self.po==0 and self.pr==0:
self.po=1
self.pr=1
return True
elif index==10: #警察和爸爸过河
if self.st%2==1:
if self.f==1 and self.po==1:
self.f=0
self.po=0
return True
else:
if self.f==0 and self.po==0:
self.f=1
self.po=1
return True
elif index==11: #警察和妈妈过河
if self.st%2==1:
if self.m==1 and self.po==1:
self.m=0
self.po=0
return True
else:
if self.m==0 and self.po==0:
self.m=1
self.po=0
return True
elif index==12: #警察和女儿1过河
if self.st%2==1:
if self.po==1 and self.g1==1:
self.po=0
self.g1=0
return True
else:
if self.po==0 and self.g1==0:
self.po=1
self.g1=1
return True
elif index==13: #警察和女儿2过河
if self.st%2==1:
if self.po==1 and self.g2==1:
self.po=0
self.g2=0
return True
else:
if self.po==0 and self.g2==0:
self.po=1
self.g2=1
return True
elif index==14: #警察和儿子1过河
if self.st%2==1:
if self.po==1 and self.b1==1:
self.po=0
self.b1=0
return True
else:
if self.po==0 and self.b1==0:
self.po=1
self.b1=1
return True
elif index==15: #警察和儿子2过河
if self.st%2==1:
if self.po==1 and self.b2==1:
self.po=0
self.b2=0
return True
else:
if self.po==0 and self.b2==0:
self.po=1
self.b2=1
return True
else:
return False
#检测当前状态是否合法
def CheckStatus(self):
if(self.po+self.pr)==1:
if self.pr==1 and (self.m+self.f+self.b1+self.b2+self.g1+self.g2)>0:
return False
elif self.pr==0 and (self.m+self.f+self.b1+self.b2+self.g1+self.g2)<6:
return False
if (self.m+self.f)==1:
if self.m==1 and ((self.b1+self.b2)>0 or (self.g1+self.g2)!=2):
return False
elif self.m==0 and ((self.b1+self.b2)!=2 or (self.g1+self.g2)>0):
return False
return True
#打印成功信息
def PrintSucceed(suc):
if suc!= None:
PrintSucceed(suc.parent)
suc.PrintStatus()
#主运行逻辑
#活跃列表
openList=[]
#关闭列表
closedList=[]
#初始根节点
openList.append(Shoreside( None))
for it in openList:
#判断是否成功
if it.Succeed():
PrintSucceed(it)
break
#移入closedList
closedList.append(it)
#扩展状态空间
for index in range(1,16):
newIt=Shoreside(it)
#扩展,判断是否冲突
if newIt.NextStatus(index) and newIt.CheckStatus():
#判断是否曾经出现过
for openIt in openList:
if openIt.EqualStatus(newIt):
newIt= None
break
#插入openList
if newIt!= None:
openList.append(newIt)
输出结果:
[f:1][m:1][g1:1][g2:1][b1:1][b2:1][po:1][pr:1]step=0
[f:1][m:1][g1:1][g2:1][b1:1][b2:1][po:0][pr:0]step=1
[f:1][m:1][g1:1][g2:1][b1:1][b2:1][po:1][pr:0]step=2
[f:1][m:1][g1:0][g2:1][b1:1][b2:1][po:0][pr:0]step=3
[f:1][m:1][g1:0][g2:1][b1:1][b2:1][po:1][pr:1]step=4
[f:1][m:0][g1:0][g2:0][b1:1][b2:1][po:1][pr:1]step=5
[f:1][m:1][g1:0][g2:0][b1:1][b2:1][po:1][pr:1]step=6
[f:0][m:0][g1:0][g2:0][b1:1][b2:1][po:1][pr:1]step=7
[f:1][m:0][g1:0][g2:0][b1:1][b2:1][po:1][pr:1]step=8
[f:1][m:0][g1:0][g2:0][b1:1][b2:1][po:0][pr:0]step=9
[f:1][m:1][g1:0][g2:0][b1:1][b2:1][po:0][pr:0]step=10
[f:0][m:0][g1:0][g2:0][b1:1][b2:1][po:0][pr:0]step=11
[f:1][m:0][g1:0][g2:0][b1:1][b2:1][po:0][pr:0]step=12
[f:0][m:0][g1:0][g2:0][b1:0][b2:1][po:0][pr:0]step=13
[f:0][m:0][g1:0][g2:0][b1:0][b2:1][po:1][pr:1]step=14
[f:0][m:0][g1:0][g2:0][b1:0][b2:0][po:0][pr:1]step=15
[f:0][m:0][g1:0][g2:0][b1:0][b2:0][po:1][pr:1]step=16
[f:0][m:0][g1:0][g2:0][b1:0][b2:0][po:0][pr:0]step=17