【定义】

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

【例题讲解】

【例题1】

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

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

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

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

猎人




0

0

0

0

0

0

0

1

0

0

1

0

0

0

1

1

0

1

0

0

0

1

0

1

0

1

1

0

0

1

1

1

1

0

0

0

1

0

0

1

1

0

1

0

1

0

1

1

1

1

0

0

1

1

0

1

1

1

1

0

1

1

1

1

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

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

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

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

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

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

猎人




0

0

0

0

0

0

0

1

0

0

1

0

0

1

0

0

0

1

0

1

1

0

1

0

1

0

1

1

1

1

0

1

1

1

1

0

1

1

1

1

第三步:定义操作集合,就是可能出现的所有操作。
过河问题一般定义两个大操作:P、Q。
P代表从左岸到右岸。
Q代表从右岸到左岸。

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

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

操作

前提

结果

Pr

r=1且l≠y且y≠c

r=0

Pl

r=l=1且y≠c

r=l=0

Py

r=y=1

r=y=0

Pc

r=c=1且l≠y

r=c=0

Qr

r=0且l≠y且y≠c

r=1

Ql

r=l=0且y≠c

r=l=1

Qy

r=y=0

r=y=1

Qc

r=c=0且l≠y

r=c=1

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

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

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

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

猎人




0

0

0

0

0

0

0

1

0

0

1

0

0

1

0

0

0

1

0

1

1

0

1

0

1

0

1

1

1

1

0

1

1

1

1

0

1

1

1

1

比如初始状态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
0 0 0
0 0 1
0 1 0
0 1 1
1 0 0
1 0 1
1 1 0
1 1 1
第二步:删去不可能出现的、不合法的状态。

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

第三步:定义操作集合。

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

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

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

初始状态:000
目标状态:111
状态空间图如下:

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

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

【例题3】

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

假设关0开1。

琴键1 琴键2 琴键3
0 0 0
0 0 1
0 1 0
0 1 1
1 0 0
1 0 1
1 1 0
1 1 1
题目中说:每次必须按下且只能按下一个开关。
所以操作有: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)状态空间图

————————————————