开发日志 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(),这样的方式。

  另外一点就是在这样的机制上,如果是数据驱动的思想,还缺少一个状态转换表(规则表),加入规则表以后,系统就能够更加智能的工作了。

posted @ 2010-06-03 13:48  向恺然  阅读(197)  评论(0)    收藏  举报

我必须说的是:我崇尚开源,但鄙视剽窃。本博客所有引用的图片,文章,和代码,均只作为研究学习使用,不作为商业应用。如果我无意中冒犯了您,请发消息留言,我将立即删除。