抽象的艺术 - 状态机

简介: 道林.格雷 : "你喜欢什么类型的音乐 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.

目录
相关文章
|
4月前
|
设计模式 API 数据安全/隐私保护
探索设计模式的魅力:外观模式简化术-隐藏复杂性,提供简洁接口的设计秘密
外观模式是一种关键的设计模式,旨在通过提供一个简洁的接口来简化复杂子系统的访问。其核心价值在于将复杂的内部实现细节封装起来,仅通过一个统一的外观对象与客户端交互,从而降低了系统的使用难度和耦合度。在软件开发中,外观模式的重要性不言而喻。它不仅能够提高代码的可读性、可维护性和可扩展性,还能促进团队间的协作和沟通。此外,随着业务需求和技术的发展,外观模式能够适应变化,通过修改外观对象来灵活调整客户端与子系统之间的交互方式。总之,外观模式在软件设计中扮演着举足轻重的角色,是构建高效、稳定且易于维护的软件系统的关键
125 1
探索设计模式的魅力:外观模式简化术-隐藏复杂性,提供简洁接口的设计秘密
|
2月前
领域驱动设计问题之状态机模型可能不是最佳选择如何解决
领域驱动设计问题之状态机模型可能不是最佳选择如何解决
|
9月前
|
人工智能 安全 图形学
有限状态机的概念
有限状态机的概念
124 0
|
设计模式
面向对象方法-抽象
面向对象方法-抽象
|
存储 算法 异构计算
状态机的概念与设计
⭐本专栏针对FPGA进行入门学习,从数电中常见的逻辑代数讲起,结合Verilog HDL语言学习与仿真,主要对组合逻辑电路与时序逻辑电路进行分析与设计,对状态机FSM进行剖析与建模。
264 0
状态机的概念与设计
|
测试技术 uml
【UML建模】(6) UML建模之状态机图
状态机图展示了一个对象如何根据当前状态对不同事件做出反应的动态行为。状态机图是一种行为图。
923 0
【UML建模】(6) UML建模之状态机图
|
测试技术 uml 数据安全/隐私保护
【UML 建模】UML建模语言入门-视图,事物,关系,通用机制(二)
【UML 建模】UML建模语言入门-视图,事物,关系,通用机制(二)
276 0
【UML 建模】UML建模语言入门-视图,事物,关系,通用机制(二)
|
测试技术 uml
【UML 建模】UML建模语言入门-视图,事物,关系,通用机制(三)
【UML 建模】UML建模语言入门-视图,事物,关系,通用机制(三)
297 0
【UML 建模】UML建模语言入门-视图,事物,关系,通用机制(三)
|
运维 测试技术 uml
【UML 建模】UML建模语言入门-视图,事物,关系,通用机制(一)
【UML 建模】UML建模语言入门-视图,事物,关系,通用机制(一)
380 0
【UML 建模】UML建模语言入门-视图,事物,关系,通用机制(一)
|
Oracle Java 关系型数据库
高度概括艺术-初识抽象类 | 带你学《Java面向对象编程》之五十二
本节为读者展示了Java编程中不可缺失的新角色-抽象类,并介绍了抽象类的编写与继承实现规则。