AI学习笔记--skLearn--FiniteStateMachine

本文介绍了有限状态机,它是表示有限个状态及状态转换和动作的数学模型。以坦克大战游戏为例,阐述了其在游戏精灵AI中的应用,如坦克在巡逻、追杀等状态间转换。还说明了有限状态机的设计模式让精灵有自己的逻辑系统,最后给出了测试用例结果。
  • 概述  

        有限状态机(FiniteStateMachine),用来表示有限个状态以及这些状态之间的转换和动作等行为的数学模型。类似下一种设计思维图:

        

有限状态机的使用常常出现在游戏的精灵AI当中。我们举例来说一下这个数学模型,假如一款AI坦克游戏,坦克大战。坦克默认状态是巡逻(状态),在发现有敌人时(条件),转换成追杀(状态),在敌人逃脱或死掉了之后(条件),又变成巡逻(状态)。

游戏场景:绿色标签为巡逻点。蓝色标签为玩家出生点。红色为AI出生点。(如图玩家被两个AI追杀。)

对于每个AI对象来说,都有一个状态控制器的组件,内部包含了本对象的当前状态,并且状态包含需要执行的动作和转换需要满足的硬性条件等成员。总的来说,一个FSM包含有以下几个成员:

对于每个精灵来说,都具有以下几种逻辑结果:

  • 第一种,巡逻->发现目标->追杀->目标死亡->巡逻。

        第二种,巡逻->发现目标->追杀->目标死亡->旋转扫描目标->{两种情况:1. 发现目标,回到第二步。2. 超过扫描时间,回到第一步(巡逻)。(颜色配合下图样例使用。)

有限状态机的设计模式,使得每个精灵、对象都有自己的一套逻辑系统,依据不同的状态,决策树有不同的执行逻辑。大体上的设计思路即使如此。

Demo:



# coding=utf-8

from statemachinesa import StateMachine



# 有限状态集合

positive_adjectives = ["great", "super", "fun", "entertaining", "easy"]

negative_adjectives = ["boring", "difficult", "ugly", "bad"]





# 自定义状态转变函数

def start_transitions(txt):

    # 过指定分隔符对字符串进行切片,默认为空格分割,参数num指定分割次数

    # 将"Python is XXX"语句分割为"Python"和之后的"is XXX"

    splitted_txt = txt.split(None, 1)

    word, txt = splitted_txt if len(splitted_txt) > 1 else (txt, "")

    if word == "Python":

        newState = "Python_state"  # 如果第一个词是Python则可转换到"Python状态"

    else:

        newState = "error_state"  # 如果第一个词不是Python则进入终止状态

    return (newState, txt)  # 返回新状态和余下的语句txt





def python_state_transitions(txt):

    splitted_txt = txt.split(None, 1)

    word, txt = splitted_txt if len(splitted_txt) > 1 else (txt, "")

    if word == "is":

        newState = "is_state"

    else:

        newState = "error_state"

    return (newState, txt)





def is_state_transitions(txt):

    splitted_txt = txt.split(None, 1)

    word, txt = splitted_txt if len(splitted_txt) > 1 else (txt, "")

    if word == "not":

        newState = "not_state"

    elif word in positive_adjectives:

        newState = "pos_state"

    elif word in negative_adjectives:

        newState = "neg_state"

    else:

        newState = "error_state"

    return (newState, txt)





def not_state_transitions(txt):

    splitted_txt = txt.split(None, 1)

    word, txt = splitted_txt if len(splitted_txt) > 1 else (txt, "")

    if word in positive_adjectives:

        newState = "neg_state"

    elif word in negative_adjectives:

        newState = "pos_state"

    else:

        newState = "error_state"

    return (newState, txt)





if __name__ == "__main__":

    m = StateMachine()

    m.add_state("Start", start_transitions)  # 添加初始状态

    m.add_state("Python_state", python_state_transitions)

    m.add_state("is_state", is_state_transitions)

    m.add_state("not_state", not_state_transitions)

    m.add_state("neg_state", None, end_state=1)  # 添加最终状态

    m.add_state("pos_state", None, end_state=1)

    m.add_state("error_state", None, end_state=1)



    m.set_start("Start")  # 设置开始状态

    m.run("Python is great")

    m.run("Python is not fun")

    m.run("Perl is ugly")

    m.run("Pythoniseasy")

        函数处理,statemachines.py

# coding=utf-8



class StateMachine:

    def __init__(self):

        self.handlers = {}  # 状态转移函数字典

        self.startState = None  # 初始状态

        self.endStates = []  # 最终状态集合



    # 参数name为状态名,handler为状态转移函数,end_state表明是否为最终状态

    def add_state(self, name, handler, end_state=0):

        name = name.upper()  # 转换为大写

        self.handlers[name] = handler

        if end_state:

            self.endStates.append(name)



    def set_start(self, name):

        self.startState = name.upper()



    def run(self, cargo):

        try:

            handler = self.handlers[self.startState]

        except:

            print("must call .set_start() before .run()")

            # raise InitializationError("must call .set_start() before .run()")

        if not self.endStates:

            print("at least one state must be an end_state")

            # raise InitializationError("at least one state must be an end_state")



        # 从Start状态开始进行处理

        while True:

            (newState, cargo) = handler(cargo)  # 经过状态转移函数变换到新状态

            if newState.upper() in self.endStates:  # 如果跳到终止状态,则打印状态并结束循环

                print("reached ", newState)

                break

            else:  # 否则将转移函数切换为新状态下的转移函数

                handler = self.handlers[newState.upper()]

        结果:

('reached ', 'pos_state')

('reached ', 'neg_state')

('reached ', 'error_state')

('reached ', 'error_state')

        测试用例以输入字符串作为结果导向,输入对应的训练关键词给决策器,决策器处理完结果输出。

 

 

 

 

 

 

 

 

 

 

 

 

FSM - YOLO(Finite State Machine - You Only Look Once)是一种结合了有限状态机(FSM)和YOLO目标检测算法的技术。 ### 原理 FSM - YOLO的核心原理在于将有限状态机与YOLO算法相结合。YOLO算法本身是一种高效的目标检测算法,能够在单帧图像中快速准确地检测出多个目标及其位置和类别。有限状态机则用于描述系统在不同状态之间的转换规则。在FSM - YOLO中,YOLO负责对输入的单帧图像进行目标检测,获取检测到的所有对象及其置信度,就如同`process_single_frame`函数中描述的那样,接收一帧图像,调用YOLO模型进行推理 [^1]。而有限状态机根据这些检测结果以及预先设定的规则,对目标的状态进行更新和判断,例如目标的出现、消失、移动轨迹等状态变化。通过有限状态机,可以实现对目标在一段时间内的行为进行建模和分析,从而更好地处理复杂场景下的目标检测和跟踪问题。 ### 应用 - **智能视频监控**:在安防监控领域,FSM - YOLO可以实时监测监控画面中的目标。通过有限状态机对目标状态的跟踪和判断,能够实现异常行为检测,如人员的徘徊、非法入侵等。例如,当检测到人员在特定区域内长时间徘徊时,系统可以及时发出警报。 - **自动驾驶**:在自动驾驶场景中,FSM - YOLO可以帮助车辆快速检测周围的物体,如其他车辆、行人、交通标志等。有限状态机可以根据这些物体的状态变化,预测它们的运动轨迹,为自动驾驶决策提供更准确的信息,提高行车安全性。 - **工业检测**:在工业生产线上,FSM - YOLO可以用于产品质量检测和生产过程监控。对生产线上的产品进行实时检测,通过有限状态机判断产品是否符合生产标准,以及是否存在生产异常,如零部件缺失、产品损坏等情况。 ### 特点 - **高效性**:继承了YOLO算法的高效性,能够在短时间内处理大量的图像数据,实现实时目标检测。这使得FSM - YOLO在对实时性要求较高的场景中具有很大优势。 - **状态感知**:引入有限状态机后,FSM - YOLO能够对目标的状态进行持续跟踪和分析,不仅仅关注目标在单帧图像中的位置和类别,还能考虑目标在一段时间内的状态变化,从而提供更丰富的信息。 - **适应性强**:可以根据不同的应用场景和需求,灵活调整有限状态机的状态转换规则。对于不同的目标和任务,可以设计不同的状态模型,使系统具有更强的适应性和扩展性。 ```python # 以下是一个简单的伪代码示例,模拟FSM - YOLO的处理过程 class FSM_YOLO: def __init__(self): # 初始化YOLO模型和有限状态机 self.yolo_model = YOLO() self.fsm = FiniteStateMachine() def process_frame(self, frame): # 调用YOLO模型进行目标检测 detections = self.yolo_model.detect(frame) # 根据检测结果更新有限状态机 self.fsm.update_state(detections) # 进行规则检查和状态判断 results = self.fsm.check_rules() return results ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值