首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >【愚公系列】2023年08月 .NET CORE工具案例-XStateNet状态机

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

作者头像
愚公搬代码
发布2025-05-31 16:16:02
发布2025-05-31 16:16:02
8800
代码可运行
举报
文章被收录于专栏:历史专栏历史专栏
运行总次数:0
代码可运行

前言

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

一、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

代码语言:javascript
代码运行次数:0
运行
复制
XStateNet
3.2 使用
代码语言:javascript
代码运行次数:0
运行
复制
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();
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2023-08-30,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 前言
  • 一、XStateNet状态机
    • 1.有限状态机
    • 2.XStateNet简介
    • 3.XStateNet的使用
      • 3.1 安装包
      • 3.2 使用
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档