#############################################Python实现传教士和野人过河问题:#################################
# -*- coding:utf-8 -*-
import itertools
class m_c():
#定义操作算符,10种。来回各5种
def operators(self,s):
p01=[s[0],s[1]-1,0]
p10=[s[0]-1,s[1],0]
p11 =[s[0]-1,s[1]-1,0]
p02 =[s[0],s[1]-2,0]
p20 =[s[0]-2,s[1],0]
p =[p01,p10,p11,p02,p20]
q01=[s[0],s[1]+1,1]
q10=[s[0]+1,s[1],1]
q11 =[s[0]+1,s[1]+1,1]
q02 =[s[0],s[1]+2,1]
q20 =[s[0]+2,s[1],1]
q =[q01,q10,q11,q02,q20]
operators= [q,p]
return operators
#判断条件制约
def enable(self,b,operator):
#制约1,两岸人数不能为负数
if operator[0]<0 or operator[1]<0 or m-operator[0]<0 or c-operator[1]<0:
return False
#制约2,传教士在左岸时,不许传教士人数小于狼数
if operator[0]<operator[1] and operator[0]!=0:
return False
#制约3,传教士在右岸时,不允许传教士人数小于狼数
if (m-operator[0])<(c-operator[1]) and (m-operator[0])!=0 :
return False
#制约4,不许船停靠在无人的岸边,下同
if b==1 and operator ==[0,0]:
return False
if b==0 and operator ==[m,c]:
return False
return True
def trun(self,states,operatorindex,roads,b):
indexs =[]
sign =0
a =0
tem = []
for s in states:
#遍历操作算符
for operator in self.operators(s)[b]:
#对于满足操作允许的算符
if self.enable(b,operator):
#如果操作之后的状态和之前的状态没有重复
if operator not in roads:
indexs.append(self.operators(s)[b].index(operator))
tem.append(operator)
roads.append(operator)
a =1
if a ==1:
pass
else:
#如果操作不成功,则表明这个状态已经截止,没有下节点。
roads.append(['no way'])
operatorindex =indexs
states =tem
b = abs(b-1)
return states,operatorindex,roads,b
[m,c,b]=[3,3,1]
app =m_c()
operatorindex =['']
states =[[m,c,b]]
roads = [[m,c,b]]
while roads[-1] !=[0,0,0]:
[states,operatorindex,roads,b]=app.trun(states,operatorindex,roads,b)
Tree = []
#格式化输出
for i in xrange(len(roads)):
Tree.append(roads[i][-1])
num_times = [(k,len(list(v))) for k,v in itertools.groupby(Tree)]
leiji = 0
for i in num_times:
if i[0] ==1 or 'no way' :
print roads[leiji:leiji+i[1]]
else:
print roads[leiji:leiji+i[1]]
leiji +=i[1]
人工智能—状态空间法(state space)[二]
最新推荐文章于 2024-07-09 23:20:01 发布