【愚公系列】2023年08月 .NET CORE工具案例-XStateNet状态机


前言

状态机是一种抽象的机器模型,用于描述事物在不同状态之间的转移过程。它由一组状态、一组事件和一组转移规则组成。在状态机中,每个状态代表一种特定的情况,每个事件触发一次状态转移,每个转移规则描述了一个状态到另一个状态的转移条件和动作。状态机可以描述许多系统的行为模型,例如计算机程序、网络协议和物理系统等。

一、XStateNet状态机

1.有限状态机

有限状态机(Finite State Machine,FSM),也称为有限状态自动机(Finite State Automaton,FSA),是一种常见的状态机模型,它包含有限个状态,以及在这些状态之间转移的规则。FSM可以描述系统在一个确定的状态集合和输入的有限集合之间的转移过程,每个转移规则描述了当系统处于某一状态并接收到某一输入时应该转移到哪个状态。

FSM可以分为确定性状态机(Deterministic Finite State Machine,DFSM)和非确定性状态机(Nondeterministic Finite State Machine,NFSM)两种,其中DFSM的转移规则是确定唯一的,而NFSM的转移规则可能不唯一。FSM在计算机科学、电子工程和控制工程等领域有广泛的应用。

FSM它在编程中被广泛用于建模、设计和实现各种系统,例如软件应用、硬件控制、游戏逻辑等。

FSM有限状态机主要由以下几个要素组成:

1.状态(States):状态是系统可能处于的不同情况或阶段。每个状态代表系统的一个特定状态或配置。

2.转换(Transitions):转换定义了在一个状态下系统如何根据输入、事件或条件切换到另一个状态。转换通常与特定的操作或行为相关联。

3.事件(Events):事件是触发状态转换的信号。当系统接收到一个事件时,它可能会从当前状态转移到一个新的状态。

4.动作(Actions):动作是在状态转换发生时执行的操作。这些操作可以包括计算、输出、状态更新等。

任何系统都是状态和转移的组合,或者至少可以表示为状态图。状态机的每个状态都是一个原子执行上下文。

2.XStateNet简介

XStateNet是一种基于有限状态机(FSM)的神经网络结构,它结合了FSM和深度学习的优势,可以应用于各种任务,例如序列建模、图像处理和自然语言处理等。

XStateNet使用有限状态机来描述模型的状态转移,其中每个状态表示神经网络的隐藏状态。在每个时间步,XStateNet将当前的输入和前一个隐藏状态作为输入,并根据当前状态转移函数计算新的隐藏状态,同时输出相应的预测。

XStateNet的关键优势是它可以很好地处理长序列和复杂的上下文依赖关系。相比于传统的递归神经网络(RNN)和长短期记忆网络(LSTM),XStateNet的计算成本和内存开销更小,同时也更易于训练和调整。

XStateNet目前仍处于研究阶段,但已经在一些任务上展现了出色的性能,例如语言建模、图像描述和语义分割等。

项目地址:https://github.com/serge-sedelnikov/xstate.net

在这里插入图片描述

3.XStateNet的使用

3.1 安装包

通过 Nuget 安装并引用 XStateNet

XStateNet

在这里插入图片描述

3.2 使用

using XStateNet;
//1.定义四个状态,红灯,绿灯,黄灯,还有一个异常状态。
State redLight = new State("红灯");
State amberLight = new State("黄灯");
State greenLight = new State("绿灯");
State errorBlinkingAmber = new State("error");
bool isError = false;
int fixAttempt = 1;

//2.每个状态进行配置
redLight.WithInvoke(async (callback) => {
    
    

    Console.ForegroundColor = ConsoleColor.Red;
    Console.WriteLine("红灯亮!!! STOP!");
    await Task.Delay(1000);

    if (isError)
    {
    
    

        await callback("ERROR");
    }
    else
    {
    
    
        await callback("红灯结束");
    }
})

.WithTransition("ERROR", "error")
.WithTransition("红灯结束", "黄灯");


amberLight.WithInvoke(async (cancel) => {
    
    

    Console.ForegroundColor = ConsoleColor.Yellow;
    Console.WriteLine("黄灯亮! 注意!");


    await Task.Delay(3000, cancel);


}, "绿灯", "error");


greenLight.WithTimeout(5000, "红灯")
.WithActionOnEnter(() => {
    
    

    Console.ForegroundColor = ConsoleColor.Green;
    Console.WriteLine("绿灯亮! Go go go!");
})
.WithActionOnExit(() => {
    
    

    isError = new Random().NextDouble() > 0.5;

});


errorBlinkingAmber.WithInvoke(async (callback) => {
    
    
    Console.WriteLine("发生错误!");
    Console.WriteLine($"尝试修复... 第 {
      
      fixAttempt} 次");
    await Task.Delay(1000);
    isError = new Random().NextDouble() > 0.5;
    if (isError)
    {
    
    
        Interlocked.Increment(ref fixAttempt);
        await callback("未修复");
    }
    else
    {
    
    
        Interlocked.Exchange(ref fixAttempt, 1);
        await callback("已修复");
    }
})
.WithTransition("未修复", "error")
.WithTransition("已修复", "红灯");

//3.启动状态机
StateMachine machine = new StateMachine("红绿灯", "红绿灯状态机", redLight.Id);

machine.States = new[]
{
    
    
    redLight, amberLight, greenLight, errorBlinkingAmber
};
Interpreter interpreter = new Interpreter(machine);
await interpreter.StartStateMachineAsync();

在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/aa2528877987/article/details/132562011