人工智能—状态空间法(state space)[二]

#############################################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]

猜你喜欢

转载自blog.csdn.net/hust_a/article/details/60321401