人工智能:状态空间图(超详细经典例题讲解,通过例题教会你如何解决状态空间图问题)

1、定义

状态空间常记为三元组:<S,F,G>。
其中,S为初始状态的集合,F为操作的集合,G为目标状态的集合。
问题的状态空间图是一个描述该问题全部可能的状态及相互关系的有向图。
如考虑操作的代价,状态空间图就是一个赋值有向图。

2、例题讲解

1、一个猎人要带着一只狼、一只羊、一捆草过河,但是人不在的时候,狼会吃羊、羊会吃草,猎人每次只能带一样东西过河。试构造状态空间图,并给出他们能顺利过河的方案。

对于这种过河的题目,我们一般默认刚开始都在左岸,也只用分析左岸的情况,因为右岸的情况可以根据左岸的情况推出,比如左岸有一个猎人和一只羊,那么右岸就肯定有一只狼和一捆草。

第一步:列出左岸猎人、狼、羊、草的所有可能出现的状态。

0代表不在,1代表在
或者
0、1都代表数量

猎人
0000
0001
0010
0011
0100
0101
0110
0111
1000
1001
1010
1011
1100
1101
1110
1111

第二步:在列出的所有状态中找出不可能出现的、不合法的状态并删去。

不可能出现的状态一般需要自己根据生活常识判断,这道例题没有不可能出现的状态,但在修道士和野人问题中有。下面我简单说一下修道士和野人问题中的一个不可能出现的状态,方便大家理解。

在这里插入图片描述

比如说,修道士、野人、船:001,这种状态是不可能出现的,因为不可能修道士和野人全都到右岸了,船却在左岸。

不合法的状态通常在题目中给出。当然了,如果题目没有规定不合法的状态,这一步可以省略。

题目给出的不合法状态:人不在的时候,狼会吃羊、羊会吃草。
意思就是,人不在的时候,狼和羊只能一者在,羊和草也只能一者在。
那么,人=0时,狼=羊=1或者羊=草=1的状态是不合法状态。
所以0011、0110、0111不合法。

在过河的题目中,一般一种状态不可能出现或者不合法,那么该状态的反面也不可能出现或者不合法。
比如0011不合法,因为猎人不在,羊会吃草。
那么1100也是不合法的,因为如果左岸是1100,那么右岸就是0011了。
再比如上面讲到的修道士和野人问题中的001是不可能出现的,那么它的反面330也是不可能出现的。

所以说0011、0110、0111不合法,那么1100、1001、1000也不合法。
删去这些状态之后得下表。

猎人
0000
0001
0010
0100
0101
1010
1011
1101
1110
1111

第三步:定义操作集合,就是可能出现的所有操作。

过河问题一般定义两个大操作:P、Q。
P代表从左岸到右岸。
Q代表从右岸到左岸。

然后再定义小操作:
Pr:人从左岸到右岸;
Pl:人带着狼从左岸到右岸;
Py:人带着羊从左岸到右岸;
Pc:人带着草从左岸到右岸;
Qr:人从右岸到左岸;
Ql:人带着狼从右岸到左岸;
Qy:人带着羊从右岸到左岸;
Qc:人带着草从右岸到左岸;

可以得出下表:猎人=r、狼=l、羊=y、草=c
r=1的意思就是人在左岸,只有人在左岸时才能进行P操作;
r=0的意思就是人在右岸。只有人在右岸时才能进行Q操作。

操作前提结果
Prr=1且l≠y且y≠cr=0
Plr=l=1且y≠cr=l=0
Pyr=y=1r=y=0
Pcr=c=1且l≠yr=c=0
Qrr=0且l≠y且y≠cr=1
Qlr=l=0且y≠cr=l=1
Qyr=y=0r=y=1
Qcr=c=0且l≠yr=c=1

我个人认为,要想全面地定义操作的前提还挺难的。
比如,对于Pr操作,一般就只能看出它的前提是r=1,其他的前提就需要仔细地考虑操作的过程了。
其实,我们可以在定义操作表时,只给出简单的前提,等画完状态空间图之后再来完善l≠y、y≠c这种更细节的前提。

第四步:画状态空间图,从初始状态开始,一步一步地利用某个操作得出新的状态,直到走到目标状态。

初始状态:1111
如果前一步的操作表你已经完善好了,那么可以直接根据该表找出符合前提的操作,并由此操作的结果得到新的状态。
由于初始状态1111中,r=l=y=1,所以只有Py操作符合前提,此操作的结果是r=y=0,因此可以得出新状态:0101
然后再接着考虑新状态0101符合前提的所有操作,并由此得到新状态,重复此步骤,直到得到了目标状态。

如果操作表还未完善,也可以直接一个一个操作地看,如果某操作能得到在第二步的状态表中的状态,那么该操作就符合前提,可以画出来。第二步得到的状态表如下:

猎人
0000
0001
0010
0100
0101
1010
1011
1101
1110
1111

比如初始状态1111中,由于r=1,所以只考虑P操作。
如果执行Pr操作,那么得到0111,0111不在状态表中,因此此操作不能执行。
如果执行Pl操作,那么得到0011,0011不在状态表中,因此此操作不能执行。
如果执行Py操作,那么得到0101,0101在状态表中,因此此操作可以执行。
如果执行Pc操作,那么得到0110,0110不在状态表中,因此此操作不能执行。

然后对于得到的新状态,再一个一个操作地考虑,最终也可以得到目标状态如下:

在这里插入图片描述

这个时候可以再去完善一下我们的操作表。
比如对于Pr操作,先找出所有执行了Pr操作的状态:
1101
1010
可以根据这些状态总结出Pr操作的前提:
r=1且l≠y且y≠c
再比如Pl操作,先找出所有执行了Pl操作的状态:
1101
1110
可以根据这些状态总结出Pl操作的前提:
r=l=1且y≠c
其他同理。

第五步:根据状态空间图回答问题。

由状态空间图可以看出,顺利过河的方案有两个:
a、Py-Qr-Pc-Qy-Pl-Qr-Py
b、Py-Qr-Pl-Qy-Pc-Qr-Py

2、设有三根头朝上的火柴,允许一次倒置两根相邻的火柴,问能否出现三根火柴的头都朝下的状态?画出状态空间图(标明状态、操作),并说明是否有解,如果有解给出解。

第一步:列出火柴所有可能出现的状态。

假设0代表头朝上,1代表头朝下。

火柴1火柴2火柴3
000
001
010
011
100
101
110
111

第二步:删去不可能出现的、不合法的状态。

题目未给出不合法状态,省略。

第三步:定义操作集合。

题目中说:允许一次倒置两根相邻的火柴。
所以可能的操作为:P12、P23
P12代表倒置前两根火柴。
P23代表倒置后两根火柴。
这道题的操作比较简单,也没有什么前提,就不画操作表了。

第四步:画状态空间图,从初始状态开始,一步一步地利用某个操作得出新的状态,直到走到目标状态。

根据我在例题1中给出的方法做即可。

初始状态:000
目标状态:111
状态空间图如下:
在这里插入图片描述
在这里插入图片描述

第五步:根据状态空间图回答问题。

可以看到,在000可以到达的状态里没有111,因此此题无解。

3、设有三个开关一字排开,初始状态为 “关,开,关”,问连按三次后是否会出现 “开,开,开”或“关,关,关”的状态?要求每次必须按下且只能按下一个开关。请画出状态空间图,并求出解的情况。

假设关0开1。

琴键1琴键2琴键3
000
001
010
011
100
101
110
111

题目中说:每次必须按下且只能按下一个开关。
所以操作有:P1、P2、P3
P1代表按下琴键1;
P2代表按下琴键2;
P3代表按下琴键3。

状态空间图如下:

在这里插入图片描述

初始状态:010
目标状态:000、111
从初始状态010开始连续按三次的所有可以得到000或111的情况如下,×表示不能得到000或111:

在这里插入图片描述

所以连按三次后可能会出现“关,关,关”的状态,不可能出现“开,开,开”的状态。

4、 在河的左岸有三个修道士、三个野人和一条船,修道士们想用这条船将所有的人都运过河去,但受到以下条件的限制:
(1)修道士和野人都会划船,但船一次最多只能运两个人;
(2)在任何岸边野人数目都不得超过修道士,否则修道士就会被野人吃掉。
假定野人会服从任何一种过河安排,试规划出一种确保修道士安全过河方案。

1、问题的状态
可以用一个三元数组来描述:
S=(m, c, b)
m:左岸的修道士数
c:左岸的野人数
b:左岸的船数
右岸的状态不必标出,因为:
右岸的修道士数 m’= 3-m
右岸的野人数 c’= 3-c
右岸的船数 b’= 1-b

在这里插入图片描述

图中深蓝色为不可能状态,浅蓝色为不合法状态。

2.操作集F={p01, p10,p11,p02,p20,q01,q10,q11, q02,q20}

在这里插入图片描述

pmn表示船载着m个修道士、n个野人去右岸;
qmn表示船载着m个修道士、n个野人去左岸;

3.状态空间
给出状态和操作的描述之后,该问题的状态空间是:
{{S0},{p01, p10,p11,p02,p20,q01,q10,q11, q02,q20},{S31}}。

4.状态空间图:

在这里插入图片描述

四条S0到S31长度相等的最短路径,对应的操作序列就是该问题的四个最优解。

5、翻转钱币问题。三枚钱币处于反、正、反状态,每次只许翻动一枚钱币,问连续翻动三次后,能否出现全正或全反状态。

在这里插入图片描述

引入一个三元组(q0,q1,q2)来描述总状态,钱币正面为0,反面为1,全部可能的状态为:
Q0=(0,0,0) ; Q1=(0,0,1); Q2=(0,1,0)
Q3=(0,1,1) ; Q4=(1,0,0); Q5=(1,0,1)
Q6=(1,1,0) ; Q7=(1,1,1)。

翻动钱币的操作抽象为改变上述状态的算子,
即F={a, b, c}
a:把钱币q0翻转一次
b:把钱币q1翻转一次
c:把钱币q2翻转一次
问题的状态空间为<{Q5}, {a, b, c}, {Q0 Q7}>

状态空间图:

在这里插入图片描述

翻转钱币问题状态空间图的另一种表示:

在这里插入图片描述

6、二阶梵塔问题。一号杆有A、B两个金盘,A小于B。要求将A、B移至三号杆,每次只可移动一个盘子,任何时刻B不能在A上。

(1)有关状态的知识:
用二元组(SA,SB)表示状态,SA表示A所在杆号,SB表示B所在杆号。其中: SA ,SB{1,2,3} , 则全部状态如下:
(1,1),(1,2),(1,3)
(2,1),(2,2),(2,3)
(3,1),(3,2),(3,3)
初始状态为(1,1),终止状态为:(3,3) 。

在这里插入图片描述

(2)有关操作的知识(规则):
A(i,j)表示金盘A从第I号杆移到j号杆,B(i,j)表示金盘B从第i号杆移到j号杆,其中:i,j ∈{1,2,3},但i ≠j ,全部操作为:
A(1,2),A(1,3), A(2,1)
A(2,3),A(3,1), A(3,2)
B(1,2),B(1,3), B(2,1)
B(2,3),B(3,1), B(3,2)
分析每个操作的条件和动作,得到下表:

在这里插入图片描述

(3)状态空间图

在这里插入图片描述

  • 46
    点赞
  • 267
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 8
    评论
UML是一种标准的面向对象建模语言,它以形化的方式表达软件系统的架构和设计。其中,类、用例、状态、顺序、活动是UML建模中比较常用的五种形。 类是表示类、接口、关系、属性、方法等元素之间静态关系的形。它是UML中最基础、最常用的形之一,可以用来展示系统中的实体类、抽象类、接口、关系等。 用例是表示系统功能需求的形。它主要用于分析和设计系统中的功能需求,通过展示系统的用例和参与者之间的关系来描述系统的行为和表达设计愿景。 状态是表示对象的状态及其转移关系的形。它主要用于描述对象在生命周期内多种状态之间的转移关系,以及状态变化时的行为。 顺序是描述对象之间交互顺序和消息传递的形。它主要用于表达系统中不同对象之间的交互和通信关系,以及相应的消息传递和处理过程。 活动是表示业务流程、业务逻辑或算法形。它主要用于描述系统中业务流程、业务逻辑或算法的执行过程,以及处理过程中的条件和控制流程。它强调过程中的分支和并行流程,并可用于展示详细的系统设计和实现过程。 综上所述,这五种UML形各有其独特的功能和用途,在软件设计和开发过程中都有重要的作用。掌握和应用这些形,有助于提高系统的设计质量和开发效率。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 8
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

俊夫小瞳

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值