抽象的艺术 - 状态机

简介: 道林.格雷 : "你喜欢什么类型的音乐 What sort of music would you like?" 温妮莎·艾芙斯 : "看这一刻我想成为什么样的人 Meaning who do I want to be at this moment." ## FSM 有限状态机 Finite State Machine,又称有限状态自动机Finite State Automaton,又

道林.格雷 : "你喜欢什么类型的音乐 What sort of music would you like?"

温妮莎·艾芙斯 : "看这一刻我想成为什么样的人 Meaning who do I want to be at this moment."

FSM

有限状态机 Finite State Machine,又称有限状态自动机Finite State Automaton,又称有限自动机Finite Automaton,简称状态机 State Machine。简单的讲,状态机描述的是:有限个状态以及状态迁移过程中条件、事件、动作之间关系的一种数学模型。状态机可以分为很多种类型:

  • Acceptors and recognizers

    • 原理:产生一个二元输出,说要么“是”要么“否”来回答输入是否被机器接受。所有FSM的状态被称为要么接受要么不接受。在所有输入都被处理了的时候,如果当前状态是接受状态,输入被接受,否则被拒绝。
    • 606px-Fsm_parsing_word_nice.svg.png
  • Classifiers

    • 原理:和Acceptor类似,但是有超过二元以上的输出。
  • Transducers

    • 原理:基于输入的动作和状态决定下一个状态。
    • Fsm_Moore_model_door_control.svg.png
  • Others

状态机的应用范围很广:分布式数据一致性(Paxos,Raft)、Akka框架、神经网络的动态模型、语言识别器。

业务开发中用得比较多的是Transducer模式,用来管理事件和状态之间的迁移关系,与业务代码解耦合。

Mathematical model

Transducer的数学模型是一个六元组 :screenshot.png

  • screenshot.png 是输入字母表(符号的非空有限集合)。
  • screenshot.png 是输出字母表(符号的非空有限集合)。
  • S 是状态的非空有限集合。
  • s0 是初始状态,它是S的元素。在非确定有限状态自动机中,是初始状态的集合。
  • screenshot.png 是状态转移函数: screenshot.png
  • screenshot.png 是输出函数。

Code

使用Python编写一个简单的FSM框架(Python用得还不太6,看官请见谅)。

State

class State(object):
    def __init__(self, name):
        if name is None:
            raise RuntimeError('State name is none')
        self.name = name

Event

class Event(object):
    def __init__(self, name):
        self.name = name
        self.transitions = []

    def add_transition(self, transition):
        self.transitions.append(transition)

    def get_transition(self, state):
        for transition in self.transitions:
            if transition.sourceState.name == state.name:
                return transition

Transition

class Transition(object):
    def __init__(self, sourceState, targetState, event):
        self.sourceState = sourceState
        self.targetState = targetState
        self.event = event

Machine

class Machine(object):
    def __init__(self, name, initialState, transitions):
        self.name = name
        self.initialState = initialState
        self.currentState = initialState
        self.transitions = transitions
        self.states = []
        self.init_states()
        self.events = []
        self.init_events()

    def init_states(self):
        for transition in self.transitions:
            self.states.append(transition.sourceState)
            self.states.append(transition.targetState)

    def init_events(self):
        for transition in self.transitions:
            event = transition.event
            event.add_transition(transition)
            self.events.append(event)
            logger.info("event: %s", event.name)

    def get_event(self, name):
        for event in self.events:
            if event.name == name:
                return event

    def transit(self, event):
        cevent = self.get_event(event)
        transition = cevent.get_transition(self.currentState)
        self.currentState = transition.targetState
        print ("transit from %s to %s on %s " % (
            transition.sourceState.name, transition.targetState.name, transition.event.name))


if __name__ == "__main__":
    t1 = Transition(State('CLOSED'), State('OPENED'), Event('open'))
    t2 = Transition(State('OPENED'), State('HEATED'), Event('heat'))
    t3 = Transition(State('HEATED'), State('CLOSED'), Event('cool'))
    transitions = []
    transitions.append(t1)
    transitions.append(t2)
    transitions.append(t3)
    machine = Machine('Coffee Machine No.1', State('CLOSED'), transitions)
    machine.transit('open')
    machine.transit('heat')
    machine.transit('cool')

Penny Dreadful - S01E06

你喜欢什么类型的音乐 What sort of music would you like?

看这一刻我想成为什么样的人 Meaning who do I want to be at this moment.

道林.格雷,你想成为什么样的人 Dorian Gray,who do you want to be?

我自己,不受限制的自己 Myself,without limits.

那就放舞曲吧 Then put on music for dancing.

你还真是异常的冷靜 You have exceptional composure.

是吗 Do I?

我是说,镇静 Poise, I mean.

自制力 Control.

对 Yes.

如果没了自制力,你会怎样 What if you were to abandon it?

不可能的 I couldn't.

为什么 Why?

我们内心总有一些东西不会被释放出来 There are things within us all that can never be unleashed.

如果释放了会怎样 And what would happen if they were?

他们会吞噬我们 They would consume us.

我们将不复存在,不受控制的自我会取而代之 We would cease to be and another would exist in our place, without control.

无法无天 Without limits.

目录
相关文章
|
3月前
|
uml
建模底层逻辑问题之在建模时,对现实进行抽象该如何操作
建模底层逻辑问题之在建模时,对现实进行抽象该如何操作
|
4月前
领域驱动设计问题之状态机模型可能不是最佳选择如何解决
领域驱动设计问题之状态机模型可能不是最佳选择如何解决
|
6月前
|
存储 SQL 程序员
【0到1的设计之路】计算机系统的状态机模型
【0到1的设计之路】计算机系统的状态机模型
164 0
|
11月前
|
人工智能 安全 图形学
有限状态机的概念
有限状态机的概念
142 0
|
数据可视化 uml
【UML】之简单概括
【UML】之简单概括
67 0
【UML】之简单概括
|
设计模式
面向对象方法-抽象
面向对象方法-抽象
|
存储 算法 异构计算
状态机的概念与设计
⭐本专栏针对FPGA进行入门学习,从数电中常见的逻辑代数讲起,结合Verilog HDL语言学习与仿真,主要对组合逻辑电路与时序逻辑电路进行分析与设计,对状态机FSM进行剖析与建模。
284 0
状态机的概念与设计
|
测试技术 uml
【UML建模】(6) UML建模之状态机图
状态机图展示了一个对象如何根据当前状态对不同事件做出反应的动态行为。状态机图是一种行为图。
975 0
【UML建模】(6) UML建模之状态机图
|
BI 程序员
透过文学经典理解软件设计的抽象思想
透过文学经典理解软件设计的抽象思想
|
uml
UML面向对象分析与建模-【5】交互图
一、概述 交互图是用来表达系统的各个对象之间如何交互,如何合作完成某个行为的动态模型工具,它与用例图、状态图、活动图等共同构成了系统的行为视图。 交互图主要用于对用例图中的控制流进行建模,它包括序列图和协作图,其中,序列图按时间次序描述系统中各对象如何通过消息交互,协作图从空间上描述收发消息的对象的结构关系。
1213 0