开发日志 6-3
Wisdom in the mind is better than money in the hand.
........... * * *...................... * * *....................................
1) FSM 的数学描述:
数学语言描述如下:
一个有限状态机M是一个五元组,M=(K,E,T,S,Z)。
(1)K是一个有穷集,其中的每个元素称为状态
(2) E是一个有穷字母表,它的每个元素称为一个输入字符(特化,输入被定位为字符集)
(3)T是转换函数,是K×E->K上的映射
(4) S是K中的元素,是唯一的一个初态
(5) Z是K的一个子集,是一个终态集,或者叫结束集。
状态改变的时候没有额外动作发生。
以前碰到这样的数学,总是会莫名其妙的恐惧起来,直接就略过去了,现在仔细看看,发现还是很简洁优雅的,有点美感。
进一步向软件领域靠拢,写更通用和更复杂的状态机:
一个通用有限状态机M是一个七元组,M={K,E,T,M,F,S,Z}。
(1)K是一个有穷集,其中的每个元素称为状态
(2)E是一个有穷集,它的每个元素称为一个事件
(3)T是转换函数,是K×E->K上的映射
(4)M是一个有穷集,它的每个元素称为动作
(5)F是动作映射函数,是K×E->M上的映射
(6)S是K中的元素,是唯一的一个初态
(7) Z是K的一个子集,是一个终态集,或者叫结束集。
可以做进一步的优化,首先,可以把 (3)(5)整合在一起,做一个K×E->{K,M}的映射,其次从实用性的角度出发,禁止状态接收空事件(无输入的情况下,状态发生改变),作为弥补,为每个状态增加进入动作和离开动作,鉴于定时器在系统中,尤其是在状态机中的重要性,可以为每个状态增加定时器以及超时后的状态转换。
这样将是一个更普遍应用的状态机。
(1)常规状态机。状态机中的所有状态是不相交的、互斥的。
(2)层次状态机。状态机中的状态之间要么是互斥的,要么是真包含的,可以用树性结构来描述这些状态集,包含其它状态的状态称为枝节点,不包含其它状态的状态称为叶节点,为方便单树描述,总是设计一个状态包含所有的状态节点,称为根节点。状态机的状态只能停留在叶节点,而不能停留在枝节点,每个枝节点需要指定一个子节点为它的默认子节点,以便状态机进入枝节点的时候能够停留到叶节点。
在开发过程中倒是有类似的感觉,对众多状态之间的关系感到疑惑,在前面的开发日志中也提到过,后面状态把前面的状态冲抵了的情况;也设想过设置状态的优先级来解决。
在开发的实践中,M(K,E,T,M,F,S,Z)中的,E:输入--->事件,这种用法没有做过,采用的是判断条件,然后调用ChangeState(),这样的方式。
另外一点就是在这样的机制上,如果是数据驱动的思想,还缺少一个状态转换表(规则表),加入规则表以后,系统就能够更加智能的工作了。

浙公网安备 33010602011771号