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

本文通过编程方式解决了一个经典的逻辑谜题——农夫如何安全地带狼、羊及菜过河而不发生损失。利用Python语言实现了状态转移,找到了安全运送所有物品到对岸的方法。

这个题目是课上老师留下来的问题,然后借用之前传教士和狼的套路,将这个问题用编程实现。

题目描述:农夫需要把狼、羊、菜和自己运到河对岸去,只有农夫能够划船,而且船比较小,除农夫之外每次只能运一种东西,还有一个棘手问题,就是如果没有农夫看着,羊会偷吃菜,狼会吃羊。请考虑一种方法,让农夫能够安全地安排这些东西和他自己过河。

最终得出两套方案:

这里写图片描述

#以左岸为例
a=1#农夫在左岸
b=1#狼在左岸
c=1#羊在左岸
d=1#白菜在左岸
class nongfu():
    def __init__(self):
        pass
    def operations(self,s):
        p1 =[s[0]-1,s[1]-1,s[2],s[3],0]
        p2 =[s[0]-1,s[1],s[2]-1,s[3],0]
        p3 =[s[0]-1,s[1],s[2],s[3]-1,0]
        p4 =[s[0]-1,s[1],s[2],s[3],0]
        p = [p1,p2,p3,p4]
        q1 =[s[0]+1,s[1]+1,s[2],s[3],1]
        q2 =[s[0]+1,s[1],s[2]+1,s[3],1]
        q3 =[s[0]+1,s[1],s[2],s[3]+1,1] 
        q4 =[s[0]+1,s[1],s[2],s[3],1]   
        q = [q1,q2,q3,q4]
        operators =[q,p]
        return operators 
    def enable(self,operator):

        if operator[0]<0 or operator[1]<0 or operator[2]<0 or operator[3]<0:
            return False
        if a-operator[0]<0 or b-operator[1]<0 or c-operator[2]<0 or d-operator[3]<0:
            return False
        if ((b-operator[1])==1 and (c-operator[2])==1) and operator[0]==1:
            return False
        if ((c-operator[2])==1 and (d -operator[3])==1) and operator[0]==1:
            return False
        if operator[1] ==1 and operator[2] ==1 and operator[0]==0:
            return False
        if operator[2] ==1 and operator[3]==1 and operator[0]==0:
            return False        
        return True  

    def trun(self,states,operatorindex,roads,e):
            indexs =[]
            sign =0
            a =0
            tem = []
            for s in states:             
                for operator in self.operations(s)[e]: 
                    if self.enable(operator) :
                        if operator not in roads:
                           indexs.append(self.operations(s)[e].index(operator))
                           tem.append(operator)
                           roads.append(operator)
                           a =1
                if a ==1:
                   pass
                else:
                   roads.append(['no way'])      
            operatorindex =indexs
            states =tem
            e = abs(e-1)
            return states,operatorindex,roads,e

e =1#初始状态左岸
operatorindex =[' ']
states =[[1,1,1,1,1]]
roads = [[1,1,1,1,1]]
nongfupro=nongfu()
while roads[-1] !=[0,0,0,0,0]:
      [states,operatorindex,roads,e]=nongfupro.trun(states,operatorindex,roads,e)
print roads

知识表示 状态空间表示法 人工智能概论知识表示(状态空间表示法)全文共14页,当前为第1页。 状态空间表示法 现实世界中的问题求解过程实际上可以看做是一个搜索或者推理的过程。 推理过程实际上也是一个搜索过程,它要在知识库中搜索和前提条件相匹配的规则,而后利用这些规则进行推理,所以任何问题求解的本质都是一个搜索过程。 为了进行有效的搜索,对所求解的问题要以适当的形式表示出来,其表示的方法直接影响到搜索效率。状态空间表示法就是用来表示问题及其搜索过程的一种方法。 状态空间表示法人工智能中最基本的形式化方法,也是讨论问题求解技术的基础。 人工智能概论知识表示(状态空间表示法)全文共14页,当前为第2页。 1、问题状态空间的构成 状态空间表示法就是以"状态空间"的形式对问题进行表示。 状态空间表示法的定义。 (1)状态 状态是描述问题求解过程中不同时刻状况的数据结构。一般用一组变量的有序集合表示: Q=(q0,q1,…,qn)其中每个元素qi(i=0,1,2,…,n)为集合的分量,称为状态变量。 当给每一个分量以确定的值时,就得到了一个具体的状态。 人工智能概论知识表示(状态空间表示法)全文共14页,当前为第3页。 1问题状态空间的构成 (2)算符 引起状态中某些分量发生变化,从而使问题由一个状态变为另一个状态的操作称为算符。 算符可分为走步、过程、规则、数学算子、运算符号或逻辑符号等。 例如: 在产生式系统中,每一条产生式规则就是一个算符; 在下棋程序中,一个算符就是一个走步; 人工智能概论知识表示(状态空间表示法)全文共14页,当前为第4页。 1问题状态空间的构成 (3)状态空间 由表示一个问题的全部状态及一切可用算符构成的集合称为该问题状态空间。它一般由三部分构成: 问题的所有可能初始状态构成的集合S; 算符集合F; 目标状态集合G。 用一个三元组表示如下: (S,F,G) 状态空间的图示形式称为状态空间图。其中,节点表示状态;有向边(弧)表示算符。 人工智能概论知识表示(状态空间表示法)全文共14页,当前为第5页。 1问题状态空间的构成 (4)问题的解 从问题的初始状态集S出发,经过一系列的算符运算,到达目标状态。 由初始状态到目标状态所用算符的序列就构成了问题的一个解。 人工智能概论知识表示(状态空间表示法)全文共14页,当前为第6页。 2 用状态空间表示问题的步骤 用状态空间方法表示问题时的步骤如下: (1)定义状态的描述形式。 (2)用所定义的状态描述形式把问题的所有可能的状态都表示出来,并确定出问题的初始状态集合描述和目标状态集合描述。 (3)定义一组算符,使得利用这组算符可把问题由一种状态转变为另一种状态。 人工智能概论知识表示(状态空间表示法)全文共14页,当前为第7页。 3 利用状态空间求解问题的过程 问题的求解过程是一个不断把算符作用于状态的过程。 首先,将适用的算符作用于初始状态,以产生新的状态; 然后,再把一些适用的算符作用于新的状态; 这样继续下去,直到产生的状态为目标状态为止。 这时,就得到了问题的一个解,这个解是从初始状态到目标状态所用算符构成的序列。 人工智能概论知识表示(状态空间表示法)全文共14页,当前为第8页。 3 利用状态空间求解问题的过程 说明: 可能有多个算符序列都可使问题从初始状态变到目标状态,这就得到了多个解。其中有的使用算符较少,有的较多,把使用算符最少的解称为最优解。这里只是从解中算符的个数来评价解的优劣,评价解的优劣主要是看使用算符时所付出的代价,只有总代价最小的解才是最优解。 对任何一个状态,可使用的算符可能不止一个,这样由一个状态所生成的后继状态就可能有多个。当对这些后继状态使用算符生成更进一步的状态时,首先应对哪一个状态进行操作呢?这属于搜索策略的问题,不同的搜索策略其操作的顺序是不相同的。 人工智能概论知识表示(状态空间表示法)全文共14页,当前为第9页。 3 利用状态空间求解问题的过程 例1:二阶Hanoi塔问题。 已知:3个柱子1、2、3和两个盘子A、B(A比B小)。 初始状态:A、B依次放在1柱上。 目标状态:A、B依次放在柱子3上。 条件:每次可移动一个盘子,盘子上方是空顶方可移动,而且任何时候都不允许大盘在小盘之上。 人工智能概论知识表示(状态空间表示法)全文共14页,当前为第10页。 3 利用状态空间求解问题的过程 解: 按照上面给出的步骤,将问题状态空间的形式表示出来。 第一步:定义问题状态的描述形式:设用 Sk=(SkA,SkB)表示问题的状态,SkA表示盘子A所在的柱号,SkB表示盘子B所在的柱号。 第二步:用所定义的状态描述形式把问题的所有可能的状态都表示出来,并确定出问题的初始状态集合描述和目标状态集合描述。 人工智能概论知识表示(状态空间
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值