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

来源:互联网 发布:5g网络手机 编辑:程序博客网 时间:2024/05/01 23:03
#############################################Python实现传教士和野人过河问题:################################## -*- coding:utf-8 -*-import itertoolsclass 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]
0 0
原创粉丝点击