知识表示-基本概念
- 状态空间法:问题状态描述
- 状态:为描述某类不同事物间的差别而引入的一组最少变量的有序集合。
其矢量形式如下:
Q=[q0,q1…qn]^T - 操作符/算符:使问题从一种状态变化为另一种状态的手段。操作符可为走步、过程、规则、数学算子、运算符号或逻辑符号等。
- 问题的状态空间:表示该问题全部坑状态及其关系的图。它包含三种集合:初始状态集合S,运算符集合F以及目标状态集合G,把状态空间记为三元空间(S,F,G)。
- 三数码问题:
- 状态空间法通常用状态图来表述问题
- 状态图
把初始状态通过操作符作用可达到的各种状态所组成的空间设想为一副由各种状态对应的节点组成的图,就称为状态图。 - 状态空间法
从某个初始状态开始,每次加一个操作符,递增地建立起操作符号的试验序列,直到达到目标状态为止。 - 状态图示法
用四元表列(a,b,c,d)来表示这个问题的状态。
其中,a,b,c,d分别表示
a-猴子的水平位置
b-当猴子在箱子顶上时取x=1;否则取x=0
c-箱子的水平位置
d-当猴子摘到香蕉时取z=1;否则取z=0
初始状态(a,0,b,0)------->目标状态(c,1,c,1)
定义这个问题中的操作符(算符)如下:
1、goto(U)猴子走到水平位置U,表示为
goto(U)
(W,0,Y,0) ------------>(U ,0 ,Y ,0)
状态(W,0,Y,0)变换为状态(U,0,Y,0)。
2、pushbox(V)猴子把箱子推到水平位置V,即有
pushbox(V)
(W,0,W,0)------------->(V ,0 ,V ,0 )
条件:猴子与箱子必须在同一位置上,并且,猴子不
在箱子顶上。
3、climbbox猴子爬上箱子,即有
climbbox
(W,0,W,0)------------>(W,1,W,0)
条件:猴子和箱子应当在同一位置上,而且猴子不在箱子上。
4、grasp猴子摘到香蕉,即有
grasp
(c,1,c,0 )------------>(c,1,c,1)
条件:猴子和箱子都在位置c上,并且猴子已在箱子上。其中,c是香蕉正下方的地板位置。
该初始状态变换为目标状态的操作序列为:
{goto(b),pushbox(c),climbbox,grasp}.
- 问题归约法
问题归约法的组成部分
(1)一个初始问题描述;
(2)一套把问题变换为子问题的操作符;
(3)一套本原问题描述。
问题归约的实质:从问题的目标出发逆向推理,建立子问题以及子问题的子问题,直至最后把初始问题归约为一个平凡的本原问题集合。
可用C语言迭代法求解汉诺塔问题:
#include <stdio.h>
void hanoi(int n, char A, char B, char C) {
if(n == 1) {
printf("Move sheet %d from %c to %c\n", n, A, C);
}
else {
hanoi(n-1, A, C, B);
printf("Move sheet %d from %c to %c\n", n, A, C);
hanoi(n-1, B, A, C);
}
}
int main() {
int n;
printf("请输入汉诺塔层数:");
scanf("%d", &n);
hanoi(n, 'A', 'B', 'C');
return 0;
}
结果如下:
- 问题归约法—与或图表示
- 解图
被定义为那些可解节点的子图,这些节点能够证明其初始节点是可解的。
当与或图中某些非终叶节点完全没有后继节点时,说它是不可解的。
这种不可解节点的出现可能意味着另外一些节点,甚至是起始节点也是不可解的。 - 不可解节点
不可解节点的一般定义归纳于下:
1、没有后裔的非终叶节点为不可解节点。
2、如果某个非终叶节点含有或后继节点,那么只有当其全部后裔为不可解时,此非终叶节点才是不可解的。
3、如果某个非终叶节点含有与后继节点,那么只要当其后裔至少有一个为不可解时,此非终叶节点才是不可解的。