用反射算法实现五子棋的基本思路【人工智能吧】_百度贴吧
2024.12.16 自动机理论 & 常见自动机 讲课笔记 - Hstry - 博客园
自动机,状态机,有限自动机,有限状态机,有限状态自动机,非确定下有限状态自动,确定性有限状态自动机的区别于联系-CSDN博客
自动机理论_百度百科
对于一个智能体,顶层架构是什么,如何描述这个智能体究竟要干什么?
对于这样的描述,执行流程是什么,如何调度让单线程处理器执行任务?
刘老师问我:你想要干什么?(丛老师好像也问过呢)
其实我自己也不明白,甚至从一个文件看不明白我编程的小机器人到底在干什么。于是在反复的重构折磨中逼疯。其实对一个机器人的编程,就是对一个智能体的编程,就是对任何自主的事物的编程。
在人生的旷野上,为自己编程,找到局部最优的方向
当年在Action还没有这个意识(那时候连编程的意识都没怎么系统化吧),竞技机器人,参加的比赛是竞技比赛,本身不也是游戏么?RoboMaster那简直就是明面上的电子竞技了啊!
所以,机器人控制逻辑的设计,和游戏AI智能体的设计,如出一辙。
游戏AI入门指南(Part 1) - LimboNova
(50 封私信 / 8 条消息) 决策树、状态机、行为树之间的区别 - 知乎
游戏人工智能开发之6种决策方法 - Bill Yuan - 博客园
(47 封私信) 【伏羲讲堂】游戏AI行为选择算法一览 - 知乎
如何选择游戏AI架构 - LimboNova
(47 封私信) AI算法--通过实例探讨分层任务网络规划(HTN) - 知乎
通常一个机器人的控制芯片是PLC、小电脑或者MCU。现在,给一个嵌入式MCU和MainLoop。我要怎么写控制逻辑,判断和执行?
支持游戏运行的的支柱——游戏循环 - 知乎
游戏主循环(Game Loop)的详细解析-CSDN博客
(47 封私信 / 48 条消息) 【Qt 底层之事件驱动系统】深入理解 Qt 事件机制:主事件循环与工作线程的交互探究,包括 QML 的视角 - 知乎
空闲循环处理 | Microsoft Learn
一看就懂的事件循环机制(event loop)事件循环是单线程的JavaScript在处理异步事件时进行的一种循环过程, - 掘金
JavaScript 事件循环(Event Loop)机制详解-CSDN博客
Linux主循环与rest_init() - 武平宁 - 博客园
Linux事件循环 - X__cicada - 博客园
windows消息的循环机制 - yskn - 博客园
chu's blog - 管中窥豹从Event看WinNT内核线程唤醒机制
决策树
字面意思,一个个因素分析,不断分叉最后找到解决方案,其实就是if语句的不断分支。
游戏运行时的每帧Update:
if 球在球拍的左边:
左移球拍
else if 球在球拍的右边:
右移球拍
略过~
决策树(Decision Tree) | 菜鸟教程
(47 封私信) 机器学习入门(十一):决策树——既能分类又能回归的模型 - 知乎
这么简单的模型居然可以训练?可以优化?不过不是这里考虑的了
状态机
UE5 StateTree_ue statetree-CSDN博客
(50 封私信 / 8 条消息) BitcoinSV从入门到精通:12.有限状态机、无限状态机与图灵完备 - 知乎
在Action重构代码时候初步接触,想用但没用明白;在Robocup也想用;
在数电课上用上了但是理解不透:

时序逻辑中的状态机只是用二进制数码表示状态名称。
实现
Verilog编程技巧01——如何编写三段式状态机_verilog三段式状态机写法-CSDN博客
Verilog编程技巧01——如何编写三段式状态机 – 徐晓康的博客
Spring状态机(FSM),让订单状态流转如丝般顺滑 - 码农Academy - 博客园
transitions,一个强大的 Python 库!python transitions-CSDN博客
Python状态机(transitions模块)python 状态机-CSDN博客
python 状态机设计(聊聊transitions)python状态机-CSDN博客
时序逻辑的设计:
状态转换图→状态转换真值表→状态方程→触发器的驱动方程
状态编码,可以根据每个独立因素来编码(决策树思想)
Verilog的设计:
状态转移(确定下一状态、当前状态切换)、状态执行(当前状态输出)
也就是说,触发器构成的时序逻辑,通常只是负责状态转移(状态名及其切换),状态执行可以交给其他组合电路或者时序电路
SpringBoot (Java)的设计:
【转换(确定下一状态的规则)、事件(触发当前状态转换的条件)】、状态(状态执行)
上下文StateContext:其实就是“状态执行器”,把状态套了个壳,壳里面的状态可以转换
Transitions (Python)的设计:
条件转移(执行触发在哪?)、回调(没写循环执行,触发在哪?)
看来,很重要的两大部分是(两大部分的触发执行可以不同步):
伴随条件的状态名转换规则。这是状态机的核心部分。
特定状态名下执行特定的函数。通常通过if决策分支对状态名进行判断,当然,也可以通过函数指针、回调函数等方式。
其实,状态机正是由一对决策树构成:负责执行的决策树(决策依据是状态名)、负责切换的决策树。负责切换的决策树可以放在负责执行的决策树里面,或者外面。
就像数码寄存器(存储状态名)+译码器(决策树)照样可以实现状态机。
状态机的衍生概念
分层状态机
浅显地理解,就是大状态机套小状态机,只有在特定状态小状态机才运行。
仔细地理解,大的套小的,决策树不也是这样吗?子状态机其实就是在 负责执行的决策树 和 负责切换的决策树 里添加新的分支。
在状态切换逻辑里,进入特定状态后再进行小的状态切换逻辑;
在状态执行逻辑里,进入特定状态后再运行小的状态执行函数;
基于效用的系统(Utility-Based Methods)
让我们对各种行动,使用评价模型进行打分(效用收益、代价成本)打分后,状态机再根据分数决定选择什么任务(就像中断有优先级)。
它与有限状态机非常相似,只是状态转换由每个潜在状态(包括当前状态)的分数决定。请注意,我们通常选择得分最高的动作来转换状态(或留在其中,如果已经执行了该动作的话),但是对于更多种类的选择,它也可以是加权随机(weighted random)选择(有利于得分最高的动作,但可以选择其他一些动作),或者从前5个(或任何其他数量)中选择一个随机动作等等。
典型的效用系统会为效用值设置一个范围——例如,0(完全不理想)到100(完全理想),并且每个动作可能有一组影响该值计算的考量条件 (consideration)。回到警卫的例子,我们这样来表示:
| 动作 | 效用计算 |
|---|---|
| 寻求帮助 | If 敌人可见 and 敌人太强 and 自身生命值 低 return 100 else return 0 |
| 逃跑 | If 敌人可见 and 自己生命值 低 return 90 else return 0 |
| 进攻 | If 敌人可见 return 80 |
| 空闲 | If 当前空闲 and 已处于当前状态10秒, return 0, else return 50 |
| 巡逻 | If 到达巡逻终点, return 0, else return 50 |
| 此处最要注意的重点之一就是:动作之间的转换是完全隐式的——任何状态都可以合法地跟随其它状态。同样地,动作优先级也隐含在返回的效用值中。 |
行为树
其实是一个统称的概念,无论是决策树还是状态机都可以视为行为树的特殊形式。这更像是一种图形化编程语言(!编程的终极奥义?抽象语法树?)。
一些要素:组合节点、装饰节点/条件节点、行为节点

状态树
(47 封私信 / 8 条消息) 《游戏AI系统其三:状态树StateTree》 - 知乎
外部StateTree快速入门指南 | 虚幻引擎 5.6 文档 | Epic Developer Community
UE5 StateTree_ue statetree-CSDN博客
虚幻引擎发明的新概念。


其实还是行为树,只是可以把一整层的决策依据都换成状态名(把一整层换成一层状态机),可以把一些行动换成状态转移。
这里只是给出了智能体决策的基本框架,实际上只是一个流程图和部分的代码实现。如何使用硬件驱动或者软件调度来实现各种各样的同步异步逻辑,也是很重要的课题