有限状态机(FSM)

有限状态机FSM详解(一) 有限状态机在维基百科中的解释是: 有限状态机(英语:finite-state machine,缩写:FSM)又称有限状态自动机,简称状态机,是表示有限个状态以及在这些状态之间的转移和动作等行为的数学模型。 至于为什么要学FSM,FSM可以把模型的多状态、多状态间的转换条件解耦。可以使维护变得容易,代码也更加具有可读性,也更加艺术。 理解有限状态机首先需要理解整个模型。我们把灯的开关作为示例,... 阅读详情

Finite State Machine(FSM)是一种人工智能的实现方式,对象在不同的状态间转换,且某一时刻只能处于一个状态;FSM中对象的行为是由我们自己设置的流程, 在加入消息功能后, 不同对象之间可以通过消息通信的方式来完成互动, 因此会显然非常只能;


案例

参考<<游戏人工只能编程案例精粹>>,这里写了一个类似的渔夫与妻子的一天的简单生活案例;

状态 state

单例模板如下, 程序中状态都设计为单例,这样转换过程不用重新生成释放对象;

template<typename T>
class Singleton
{
protected:
    Singleton(){};
    ~Singleton(){};
    static T* pInstance;
public:
    static T* Instance()
    {
        if(!pInstance)
            pInstance = new T();
        return pInstance;
    }
};
template<typename T>
T* Singleton<T>::pInstance = 0;

参考<<设计模式>>状态模式, 设计了了state基类, 考虑到状态对于渔夫和妻子会不同,所以这里的state采用模板类;

template<typename T>
class State
{
public:
    State(void){};
    virtual ~State(void){};
    virtual void vExecute(T* afisher)=0;
    virtual void vEnter(T* afisher)=0;
    virtual void vExit(T* afisher)=0;
};

基于上面的基类, 我们可以将渔夫与妻子的不同具体状态继承于base;如:

// 渔夫的状态
class FishingState : public State<Fisher>,public Singleton<FishingState>
{
public:
    virtual void vExit(Fisher* afisher);
    virtual void vExecute(Fisher* afisher);
    virtual void vEnter(Fisher* afisher);
};
class EatFoodState :public State<Fisher>,public Singleton<EatFoodState>
{
public:
    //....
};
class GoHomeState : public State<Fisher>,public Singleton<GoHomeState>
{
public:
    //....
};

// 渔夫妻子的状态
class WfWashState : public State<FisherWife>,public Singleton<WfWashState>
{
public:
    virtual void vExit(FisherWife* afisher);
    virtual void vExecute(FisherWife* afisher);
    virtual void vEnter(FisherWife* afisher);
};
class WfCookState : public State<FisherWife>,public Singleton<WfCookState>
{
public:
    //....
};
class WfBashRoom : public State<FisherWife>,public Singleton<WfBashRoom>
{
public:
    //....
};

状态管理类

一个对象身上只要有一个状态管理类, 里面放者当前状态, 全局状态, 上一个状态;之所以要全局状态, 是为了处理一些全程可能转换的状态,如渔夫唱歌, 在家可以, 打渔也可以, 如果在每个状态中写上唱歌的状态转换就重复也比较麻烦, 添加全局状态可以在tick函数中直接使用, 就免去了上面的麻烦,; 而上一个状态则可以用来处理返回, 即如唱完歌应当回到当前状态而不是直接进入下一个状态;
statemachine采用模板来处理, 对于渔夫与妻子传入相应的类型进去:

// StateMachine.h
template<typename T>
class StateMachine
{
    public:
        inline State<T>* GetCurState() { return mCurState; }
        // .... another get set function
        void ChangeState(State<T>* pst);
        void Tick();
    private:
        T* mOwner;
        State<T>* mCurState;
        State<T>* mPreState;
        State<T>* mGlobalState;
};
// template function need defined in the .h file
template<typename T>
void StateMachine<T>::ChangeState(State<T>* pst)
{e->vExit(mOwner);
    mCurState = pst;
    mCurState->vEnter(mOwner);
}
template<typename T>
void StateMachine<T>::Tick()
{
    if(mGlobalState)
        mGlobalState->vExecute(mOwner);
    if(mCurState)
        mCurState->vExecute(mOwner);
}

对象基类

struct Telegram; //通信包结构
class GameObject
{
private:
    int mId; //每个对象的唯一识别ID
public:
    GameObject(int Id):mId(Id){};
    virtual ~GameObject(void);
    inline int GetId(){return mId;}
    virtual void Tick() = 0; //每帧调用的函数
    virtual void HandleMessage(const Telegram& pMsg) = 0; //消息处理函数
};

渔夫与妻子都继承并实现该类:

// fisher
class Fisher:public GameObject
{
private:
    State<Fisher>* mCurState; //当前状态
    int mNumFish; // 鱼数量
    int mMoney; 
    int mFatigue; // 体力
public: 
    void FindFish(); // 打渔
    void SaleFish(); // 卖鱼
    inline bool  FishBinFull(){return mNumFish >= MAX_NUM_FISH;}
    void ChangeState(State<Fisher>* st);
    /* 其它函数 */
    virtual void Tick();
    virtual void HandleMessage(const Telegram& pMsg);
    Fisher(int id);
};
// fisherwife
class FisherWife : public GameObject
{
    public:
        FisherWife(int id);
        virtual void Tick();
        inline StateMachine<FisherWife>* GetFSM(){return mFSM;}
        virtual void HandleMessage(const Telegram& pMsg);
    private:
        StateMachine<FisherWife>* mFSM;
};

渔夫和妻子的实现代码如下:

// fisher
void Fisher::Tick()
{
 #ifdef _WIN32
    SetTextColor(FOREGROUND_RED|FOREGROUND_INTENSITY);
 #endif
    if(mCurState)
        mCurState->vExecute(this);
 #ifndef _WIN32
    cout<<endl;
 #endif
}
/* other function */
// state change
void Fisher::ChangeState(State<Fisher>* st)
{
    mCurState->vExit(this);
    mCurState = st;
    mCurState->vEnter(this);
}
// msg is dealed in fisher class but state class
void Fisher::HandleMessage(const Telegram& pMsg)
{
    switch(pMsg.Id)
    {
    case MSG_BACKHOME:
        break;
    case MSG_BREADOK:
        break;
    case MSG_FOODREADY:
        cout<<"Thank you my  dear for making the meal!"<<endl;
        ChangeState(GEatFoodState);
        break;
    default:
        cout<<"Can't deal MSG"<<endl;
    }
}
// fisher wife
void FisherWife::Tick()
{
 #ifdef _WIN32
    SetTextColor(FOREGROUND_GREEN|FOREGROUND_INTENSITY);
 #endif
    GetFSM()->Tick();
 #ifndef _WIN32
    cout<<endl;
 #endif
}
void FisherWife::HandleMessage(const Telegram& pMsg)
{
    switch(pMsg.Id)
    {
    case MSG_BACKHOME:
        cout<<"o my dear, you are back home!, you must be hungry, let me make meal for you !"<<endl;
        GetFSM()->ChangeState(GWfCookState);
        break;
    case MSG_BREADOK:
        cout<<"oh, my dear, the bread is OK!"<<endl;
        GMsgDisptchr->DispatchMessage(0, FISHER_WIFE,FISHER,MSG_FOODREADY,NULL, 0);
        break;
    case MSG_FOODREADY:
        break;
    default:
        cout<<"Can't deal MSG"<<endl;
    }
}

全局对象管理

该类是单例类, 管理了所有的对象,通过ID来识别; 有了这个管理类, 在派发消息时就可以通过ID来获得对象指针, 从而通知对象;

class ObjectManager : public Singleton<ObjectManager>
{
    public:
        ObjectManager();
        virtual ~ObjectManager();
        GameObject* FindObjpt(int id);
        void Remove(GameObject* ply);
        void RegisterObj(GameObject* ply); // 生成新对象时调用这个注册到管理器
    private:
        std::map<int,GameObject*> AllGmObjMap;
};

消息类

消息结构

struct Telegram
{
    MSG_ID Id; //the defined msg id in a enum structure
    int Receiver;
    int Sender;
    int MsgLen;
    int DispatchTime; // mark the time that the msg is send (for delay send msg)
    void* Data;
    Telegram(MSG_ID id):Id(id), Receiver(-1), Sender(-1), MsgLen(0), DispatchTime(0), Data(NULL)
    { }
    // overload the ==,  > symbol because the msg will put in a priority queue
    inline bool operator==(const Telegram& t1)
    {
        return DispatchTime ==  t1.DispatchTime;
    }
};
// 由于比较, 以时间为优先队列的排列顺序
inline bool operator<(const Telegram& t1,const Telegram& t2)
{
        return t1.DispatchTime < t2.DispatchTime;
}

消息派发类
将需要立即处理的消息在当前帧就调用; 将延迟发送的消息存储到一个消息队列中,在每个主循环中遍历一遍,如果时间过期了则立刻处理;

class GameObject;
class MessageDispatcher : public Singleton<MessageDispatcher>
{
    public:
        MessageDispatcher();
        virtual ~MessageDispatcher();
        // immediate msg be send
        void DispatchMessage(const int delay, const int Sender,
                             const int Receiver, const MSG_ID msg, void* pInfo, const int len);
        // delay send msg , detected in each main tick
        void DispatchDelayMessage();
        void Discharge(GameObject* pRecv, const Telegram& msg);
    protected:
    private:
        std::set<Telegram>  mMsgQueue; //use as a priority queue
};

下面是几个个主要的消息处理派发函数:

// 通过对象指针, 让对象调用消息处理函数来处理当前的消息
void MessageDispatcher::Discharge(GameObject* pRecv, const Telegram& msg)
 {
        assert(pRecv);
        pRecv->HandleMessage(msg);
 }
// immediate msg be send
void MessageDispatcher::DispatchMessage(const int delay, const int Sender,
                     const int Receiver, const MSG_ID msgId, void* pInfo, const int len)
{
    GameObject* pReceiver = GObjMgr->FindObjpt(Receiver);
    if(!pReceiver)
    {
        cout<<"Not Find Message Receiver!"<<endl;
        return;
    }
    Telegram msg(msgId);
    msg.MsgLen = len;
    msg.DispatchTime = -1;
    msg.Receiver = Receiver;
    msg.Sender = Sender;
    msg.Data = pInfo;
    // not delay
    if(delay <= 0)
    {
        cout<<" receiver: "<<Receiver<<" get a imme msg from "<< Sender<<endl;
        Discharge(pReceiver, msg);
    }
    else
    {
        msg.DispatchTime = NowTime + delay;
        mMsgQueue.insert(msg);
    }
}
// delay send msg , detected in each tick
void MessageDispatcher::DispatchDelayMessage()
{
    std::set<Telegram>::iterator itr = mMsgQueue.begin();
    // loop will be break once when the dispatchtime is bigger than nowtime
    // because the set is a priority queue sorted by time
    while(itr!=mMsgQueue.end() && itr->DispatchTime >= NowTime
        && itr->DispatchTime > 0)
    {
        Discharge(GObjMgr->FindObjpt(itr->Receiver),*itr);
        mMsgQueue.erase(itr);
        itr = mMsgQueue.begin();
    }
}

全局变量

// define the Global Singleton class object
 #define GFishingState FishingState::Instance()
 #define GEatFoodState EatFoodState::Instance()
// other fisher state...
 #define GWfWashState WfWashState::Instance()
// other fisher wife state...
 #define GObjMgr ObjectManager::Instance()
 #define GMsgDisptchr MessageDispatcher::Instance()
const int MAX_NUM_FISH = 150;
// Gameobject id
enum ObjPly
{
    FISHER,
    FISHER_WIFE,
};
extern unsigned long NowTime; // gloabl current time, update at each loop
// cross platform at linux or windows with different header
 #ifdef _WIN32
 #include <windows.h>
 #include <time.h>
 #include <conio.h>
//default text colors can be found in wincon.h
inline void SetTextColor(WORD colors)
{
    HANDLE hConsole=GetStdHandle(STD_OUTPUT_HANDLE);
    SetConsoleTextAttribute(hConsole, colors);
}
 #else
 #include <unistd.h>
 #include <sys/time.h>
 #define Sleep(s) sleep(s/1000)
 #endif
// msg defined
enum MSG_ID
{
    MSG_BACKHOME,
    MSG_BREADOK,
    MSG_FOODREADY,
};

main

// update global time
unsigned long NowTime = 0;
void UpdateTIme()
{
 #ifdef _WIN32
    NowTime = GetTickCount();
 #else
    struct timeval ts;
    struct timezone tus;
    gettimeofday(&ts,&tus);
    NowTime = ts.tv_sec*1000 + ts.tv_usec/1000;
 #endif
}
// main
int main()
{
    UpdateTIme();
    Fisher fisr(FISHER);
    GObjMgr->RegisterObj(&fisr);
    FisherWife wife(FISHER_WIFE);
    GObjMgr->RegisterObj(&wife);
    fisr.ChangeState(GFishingState);
    while(1)
    {
        fisr.Tick();
        wife.Tick();
    GMsgDisptchr->DispatchDelayMessage(); // msg  traversal
        Sleep(1000);
    }
}
【算法】有限状态机FSM 使用C++实现一套简单的状态机模型——实例:https://fangliang.blog.youkuaiyun.com/article/details/44042287 使用C++实现一套简单的状态机模型——原理解析:https://fangliang.blog.youkuaiyun.com/article/details/44120809 阅读详情

相关推荐

【有限状态机】- FSM详细讲解 【附Autoware有限状态机模型代码讲解】

本文详细介绍了有限状态机的三种实现方式:分支、状态模式、查表法

BigDavid123的博客 6449

AI自主决策——有限状态机

本文章参考自Unity3D人工智能编程精粹,转载请注明出处。 有限状态机的FSM图   有限状态机(FSM)由一组状态(包括一个初始状态)、输入和根据输入及现有状态转换为下一个状态的转换函数组成。   什么是状态?     飞翔,行走,攻击,跑步,游泳,这些动词是状态。高兴,伤心,生气这些形容词也是状态,一些名词也能表示状态。状态的关键意义是:不同的状态对应不同的行为。   关于有限状态...

weixin_34194087的博客 507

【Unity 笔记】有限状态机 FSM

【Unity】 有限状态机 FSM 游戏引擎:Unity 版本:2019.4.6f1 【2017版本以上均可】 编译平台:Visual Studio 2019   一、什么是FSM   FSM 全名 [Finite State Machine]。中文名 [有限状态机],又称 [有限状态自动机],简称 [状态机]。 1.1 了解Animator组件   Unity为我们提供了Animator组件,便利开发者更加自主的实现更多动画的控制方式。   快捷链接:Unity Animator官方文档介绍 2.2 有

Mr.River的博客 1851

游戏开发中的人工智能(九):有限状态机

接上文 游戏开发中的人工智能(八):描述式 AI 及描述引擎本文内容:有限状态机是游戏软件 AI 的基本要素。本章探讨有限状态机的基础,以及如何予以实现。有限状态机有限状态机是一种抽象机制,是处在各种不同的预定状态下的其中一种状态。有限状态机也可以定义一组条件,以确认何时应该改变状态。实际的状态会决定状态机的行为。本章我们要讨论有限状态机的基础,教你如何实现它。状态机的基本模型有限状态机模型,如图9

学愈进而愈惘 4693

有限状态机(Finite State Machine, FSM)详解

本篇博客将详细介绍 FSM 的概念、基本组成、应用场景,以及如何在。,帮助开发者组织复杂的状态切换,使代码更清晰、可维护。是最常见的 AI 逻辑控制方式之一。FSM 是游戏开发中最常用的状态管理工具,适用于。掌握 FSM,能让你的游戏角色更具智能化!,使 AI 具有逻辑性和可控性。在 Unity 中,我们可以通过。有限状态机(FSM)是一种。组件中,我们可以使用。

weixin_42216813的博客 3080

FSM 有限状态机框架

FSM 有限状态机框架 State using UnityEngine; using System.Collections.Generic; using System; namespace FSM_Frame { //状态 public class State { #region Constructor 构造 public State(string stateName){ this.stateName =

SaitamaTeacher的博客 562

TypeScript实现一个有限状态机

开放封闭原则: 开发过程中,因为变化、升级和维护等原因需要对原有逻辑进行修改时,很有可能会给旧代码中引入错误,也可能会使我们不得不对整个功能进行重构,并且需要原有功能新测试。 我们应该尽量通过扩展实体的行为来实现变化,而不是通过修改已有的代码来实现变化 具体一点呢 —— 类、模块和函数应该对扩展开放,对修改关闭。模块应该尽量在不修改原代码的情况下进行扩展。 核心 —— 用抽象构建框架,用实现扩展细节。 总结一下 —— 开发人员应该对程序中呈现的频繁变化的那些部分作出抽象,然后从抽象派生的实现类来

qq_40648045的博客 1670

自动驾驶决策算法 —— 有限状态机 FSM

有限状态机(FSM)是自动驾驶决策层的核心算法之一,通过离散状态描述车辆行为。其核心思想是"在不同状态下执行不同动作,并根据事件触发状态切换"。FSM由状态集合、事件集合、动作集合和状态转移函数组成,适用于高速公路巡航、变道、避障等场景。相比行为树和规则引擎,FSM具有高可读性但灵活性较低。设计时需明确场景需求、定义状态集合、提取触发事件并制定转移规则。为防止状态爆炸,可采用层次化FSM或模块化设计。典型的应用包括高速公路巡航决策和变道控制,通过状态转移实现安全驾驶。FSM为自动驾驶提供

swaggytiger的博客 2010

Ts有限状态机

ts版本的有限状态机 最近做小游戏要做切换人物状态,花点时间写了一个有限状态机,使用语言为Ts,也可改成自己的语言 按照目前的逻辑,这个可以继续横向扩展,某些做流程管理 先上预览图 Fsm:状态机类 FsmBase:状态机基类 FsmManager:状态机管理类 FsmState:状态类 FsmIdle FsmRun角色Ctrl测试用状态机类 代码:FsmBase//状态机基类 ...

nuolo 857

StateJS.ts Cocos Creator状态机,单机多人

使用例子参考Creator官方21点项目

fsm.js:JavaScript 中的有限状态机

fsm.js JavaScript 中的有限状态机

游戏中的状态机

游戏中的状态机基本上所有的软件都是有限状态机(finite-state machine,FSM)。什么是FSM呢?它是一个有向图,由一组节点和一组相应的转移函数组成。这句话是在写作这篇文章前刚从书上抄来的。通俗一点讲,它是一个事件驱动系统的模型,这个模型由有限数目的状态,若干输入和状态与状态之间转换的规则组成。在某一时刻,有一个或一组状态是FSM的当前状态,FSM接收输入事件并根据转换规则,将当前状态转为新的状态。正是由于这三个元素的组合,使得FSM具备了自己的行为特点。在游戏开发中,FSM被用来实现人工智

托尼的博客 7511

python后端的支付宝小程序用户认证问题(alipay-sdk-python、pycrypto无法安装)

python后端的支付宝小程序用户认证问题(alipay-sdk-python、pycrypto无法安装) 写在前面 事先说明,本人不是大佬,我只是在不断探索的途中找到了解决这个问题的方法,之前在网上搜索的时候没有看到相关文章,所以就来简单讲一下。 正文 借着蚂蚁金服小程序大赛开通了支付宝小程序个人开发者,尝试将一个微信小程序的项目移植到支付宝上,支付宝对于用户唯一id的获取比微信要复杂很多,微信...

weixin_43102379的博客 3643

有限状态机FSM

有限状态机,也称为FSM(Finite State Machine),其在任意时刻都处于有限状态集合中的某一状态。当其获得一个输入字符时,将从当前状态转换到另一个状态,或者仍然保持在当前状态。任何一个FSM都可以用状态转换图来描述,图中的节点表示FSM中的一个状态,有向加权边表示输入字符时状态的变化。如果图中不存在与当前状态与输入字符对应的有向边,则FSM将进入“消亡状态(Doom State)”,此后FSM将一直保持“消亡状态”。状态转换图中还有两个特殊状态:状态1称为“起始状态”,表示FSM的初始状态。

程序狗的成长之路 1458

Cadence 中Cutout、Design_Outline 和 Outline的区别

摘要: 在PCB设计中,Cutout、Design_Outline和Outline都与电路板外形相关但用途不同。Cutout用于定义切割区域(如孔、槽),直接影响制造;Design_Outline仅标记设计边界,作为参考不影响切割;Outline则是实际切割轮廓层,用于制造。三者区别在于:Cutout针对具体切割区域,Design_Outline是设计参考,Outline是最终切割依据。设计时需根据需求选择合适层:外形参考用Design_Outline/Outline,切割区域用Cutout。

卤煮小鱼的博客 1791

如何从Matlab工作区读取数据,并按时序将数据输入Simulink中

如何从Matlab工作区读取数据,并按时序将数据输入Simulink中 例如:一周掌握 Java 入门知识 学习内容: 提示:这里可以添加要学的内容 例如: 1、 搭建 Java 开发环境 2、 掌握 Java 基本语法 3、 掌握条件语句 4、 掌握循环语句 学习时间: 提示:这里可以添加计划学习的时间 例如: 1、 周一至周五晚上 7 点—晚上9点 2、 周六上午 9 点-上午 11 点 3、 周日下午 3 点-下午 6 点 学习产出: 提示:这里统计学习计划的总量 例如: 1、 技术笔记 2 遍

weixin_44899540的博客 1万+

有限状态机FSM(finite state machine) 一

有限状态机FSM(finite state machine) 一 有限状态机又称有限自动状态机,它拥有有限数量的状态,每个状态代表不同的意义,每个状态可以切换到 零-多 个状态。任意时刻状态机有且只能处在一个状态。 有限状态机可以表示为一个有向图。 如下图 从图中可以看出一个学生包含四个状态:吃饭、休息、打篮球、写作业 每种带有箭头的连线,表示可以从当前状态切换到其他的状态,以及切换的条件 吃饭 休息 打篮球 写作业 吃饭 吃饱了 休息 饿了 想打球 该写作业 打篮球 饿

lq 2万+

RK3568平台(KBuild篇)KBuild编译体系

从Linux内核2.6开始,Linux内核的编译采用Kbuild系统,这和过去的编译系统有很大的不同,尤其对于Linux内核模块的编译。在新的系统下,Linux编译系统会两次扫描Linux的Makefile:首先编译系统会读取Linux内核顶层的Makefile,然后根据读到的内容第二次读取Kbuild的Makefile来编译Linux内核。kbuild,即 kernel build,用于编译 Linux 内核文件。

weixin_49303682的博客 349

有限状态机(FSM)golang的实现

有限状态机,也称为FSM(Finite State Machine),其在任意时刻都处于有限状态集合中的某一状态。当其获得一个输入字符时,将从当前状态转换到另一个状态,或者仍然保持在当前状态。任何一个FSM都可以用状态转换图来描述,图中的节点表示FSM中的一个状态,有向加权边表示输入字符时状态的变化。如果图中不存在与当前状态与输入字符对应的有向边,则FSM将进入“消亡状态(Doom State)”...

weixin_42117918的博客 4249

基于Django+Vue3的智能目标检测系统设计与实现,Vue3前台系统+Django后台管理系统开发,Web前后端分离,YOLOv8 Web目标检测,实现图片、视频和摄像头检测等功能,全网独发

目标检测是计算机视觉中的重要任务,广泛应用于安防监控、自动驾驶、智能家居等领域。YOLO系列模型由于其高效的检测速度和较高的准确率,成为目标检测任务的首选算法之一。本项目结合 YOLOv8 与 Django + Vue3,构建一个Vue3前台系统+Django后台管理系统开发,便于用户进行目标检测的操作和展示,实现对图片、视频实时目标检测,不仅可以用于大论文的工作量展示,还可以作为毕业设计。支持更换自己模型、图片检测、实时视频检测、置信度调节和IoU参数调节。同时支持目标检测、实例分割、关键点检测等任务

在职AI算法工程师,擅长计算机视觉,YOLO目标检测、分割等,擅长web、pyqt界面可视化,好内容持续更新中,来这里跟大家一起学习,共同进步 5434

Ubuntu上通过FinalShell或Asbru访问CentOS虚拟机

使用FinalShell或Asbru远程连接虚拟机

howard2005的专栏 2279

有限状态机FSM的理解

有限状态机FSM思想广泛应用于硬件控制电路设计,也是软件上常用的一种处理方法(软 件上称为FMM--有限消息机)。它把复杂的控制逻辑分解成有限个稳定状态,在每个状态 上判断事件,变连续处理为离散数字处理,符合计算机的工作特点。同时,因为有限状 态机具有有限个状态,所以可以在实际的

lisa0220的专栏 3751

【OpenClaw从入门到精通】第12篇:OpenClaw 2026子代理实战全攻略:用ACP架构搭建多智能体协作网络(附完整代码)

本文聚焦OpenClaw 2026.3.2版本默认启用的ACP(Agent Communication Protocol)子代理机制,从核心概念、底层原理到企业级实操全流程拆解。先解析子代理的定义、ACP协议通信原理及主从代理分工逻辑,再提供环境准备的详细步骤(版本验证、配置调整、技能安装);随后通过三个递进式虚拟案例(客服分流、智能文档处理、企业级招聘全流程),提供可直接运行的完整代码、执行结果及技术要点解析;最后补充子代理管理运维、性能优化与避坑指南。

专注于人工智能、软件开发、工控自动化、工厂数字化及智能化等领域,希望和大家共同进步! 2382
上一篇: VS 工具 BUG 集
下一篇: 经验总结
呵离
博客等级 码龄12年 18粉丝 86原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值