精华内容
下载资源
问答
  • 游戏AI的实现通常分为两种,有限状态机(FSM)以及行为树,我们这里首先将有限状态机应用到游戏《古月》的怪物AI设计中,在之后的版本中再用行为树替换有限状态机。 2018.1.11更新 目前正在写行为树的实现,预计本周...

    写在前面 - (更新)

    游戏AI的实现通常分为两种,有限状态机(FSM)以及行为树,我们这里首先将有限状态机应用到游戏《古月》的怪物AI设计中,在之后的版本中再用行为树替换有限状态机。
    2018.1.11更新 目前正在写行为树的实现,预计本周内完成行为树的设计,会更新在博客中,博主目前找到了武汉胡莱游戏的实习工作,预计会实习到6月份,希望能够有所提升。

    有限状态机(FSM)

    我们知道,有限状态机维护了一张图,图中的结点代表不同的状态,状态之间通过某种条件触发转换,如果不满足条件则维持原状态。这里以一个简单的例子来说明。
    下图为游戏中使用的怪物AI有限状态机。
    怪物AI状态机

    从图中可以看出,有限状态机表示的AI不可能同时处于图示状态中的多个,而只可能处于其中一种状态,状态的转换取决于转换条件和当前所处状态。

    我们不考虑怪物的出生和死亡状态,只考虑图中列出的这几个状态,可以看出,它们的转换关系是非常显而易见的,控制状态转换的核心条件是怪物与玩家的距离,这个距离驱动了整个状态机的状态切换。

    状态模式与有限状态机

    简单的有限状态机可以用枚举+switch的方式实现,但这样的实现不可避免地会出现很多问题。首先,若状态改变需要额外的参数控制(比如巡逻状态的巡逻方向),这种处理就不得不在怪物类中增加成员,其次,这种做法也不符合面向对象思想。
    状态模式的处理就是把每一种状态都当做对象进行处理,也就是说,我们为每种状态定义一个类,这个类的实例代表了当前目标所处的状态。为了实现这个目标,我们要做下面几步:
    1. 定义一个状态基类(或状态接口)。
    2. 为每种状态定义新类别继承自基类(或实现状态接口)。
    3. 实现新的状态类中的接口。

    我们定义的状态基类包含以下接口:

    class AIState{
    publc:
        virtual void enter();
        virtual AIState* handle();
        virtual void exit();
        virtual ~AIState(){};
    }

    虚函数在这里是必要的,我们后续的状态转换完全依赖了虚函数的动态多态特性。同样的原因,析构函数必须是虚函数,这样才能够保证析构的正确性。

    我们简化问题的处理,只考虑游戏世界只存在单个玩家的情况。驱动状态转换的距离就是玩家与AI的距离。在状态中,处理转换过程的函数目前只需要一个参数,就是AI本身,我们以Enemy代表这个AI,handle函数因此需要改写成:

    virtual AIState* handle(Enemy& enemy);

    由上图的状态转换我们可以写出巡逻状态类声明(cocos2dx):

    class PatrolState :public AIState {
    
    public:
        AIState* handle(Monomer& enemy, Monomer* attacker) override;
        void exit() override;
        void update(float deltaTime) override;
        void patrol();
    };

    其中Monomer是Enemy基类。

    我们主要关注handle函数的实现。

    AIState* PatrolState::handle(Monomer& enemy, Monomer* at) {
    
        auto &en = static_cast<Enemy&> (enemy);
    
        auto player = Player::sharePlayer();
    
        auto point = MapPoint(en.getPosition());
        auto playerPoint = MapPoint(player->getPosition());
        auto distance = point.getDistance(playerPoint);
        if (distance>VISUAL_RANGE||player->getStateType() == FStateDeath)
        {
            en.patrol();
            return nullptr;
        }
        auto attacker = en.getAttackMonomerMajor();
        if (distance <= VISUAL_RANGE)
        {
            if (attacker == nullptr)
            {
                en.setAttackMonomerMajor(player);
                attacker = player;
                player->addAgainstMe(&en, 0);
            }
            auto newState = new FollowTracesState();
            enemy.followTheTracks();
            return newState;
        }
        if (attacker)
        {
            attacker->removeAgainstMe(&en);
            en.removeAttackMonomerMajor(attacker);
        }
        en.patrol();
        return nullptr;
    }

    handle类根据视野范围进行状态切换,如果满足条件就返回新的状态,如果不满足,则返回空指针,表示维持在当前状态。

    其它类的设计与patrol类的设计相似,在各自的状态类中,我们执行该状态对应的函数,或转换到其余状态。

    在怪物类 Enemy中,我们设计一个update函数,这个函数会逐帧运行(时间驱动)。

    void Enemy::update(float delta)
    {
    
        auto newState = _mCurrState->handle(*this, m_attackMonomerMajor);
        if (newState) {
            delete _mCurrState;
            _mCurrState = newState;
        }
    }

    _mCurrState是一个指向当前状态的指针(数据成员),在状态发生改变时,newState不为空,我们这时删除原状态指针,更新为新状态。

    后记

    状态机设计完成之后,下一步就是在当前状态机基础上设计更智能的AI,此外,更进一步的想法是使用行为树来代替有限状态机。

    更新 –> 行为树的实现

    好久没更新了。。事情多算是在为自己找借口吧,行为树版本的AI已经写好有一段时间了,这里做一个简单的总结。

    关于行为树

    本文中使用的行为树来自一份开源代码(行为树的开源实现),在阅读之前最好能够去看一下原作者关于行为树的简单介绍,本文会简单介绍一下使用到的几种节点。

    行为树: 行为树,英文是Behavior Tree,简称BT,是由行为节点组成的树状结构。
    节点:行为树上节点主要包括两种,一种行为节点,一种控制节点。行为节点是行为树的叶节点,非叶节点就是控制节点。行为节点真正执行了AI的行为,而控制节点则控制行为树具体自上而下的分支,行为树每次执行都会有一条自上而下的节点连起来的路径表示AI正处于的状态。

    行为树主要的控制节点:
    带优先级的选择结点:在本次应用中使用最多的控制节点。这种选择节点每次都从第一个节点开始判断前提是否满足,因此带优先级的选择节点要求各节点的前提的约束范围必须从小到大(否则后续的节点永远不可能得到执行)。

    不带优先级的选择结点:
    与带优先级选择节点不同,不带优先级的选择节点首先判断上次执行节点的前提(请仔细阅读上述博客的内容),若上次节点的前提判断为真,则继续运行该节点,否则,则依次判断所有节点的前提,选择新的节点运行。
    因为依次判断的原因,不带优先级的选择节点只要求判断条件互斥。

    顺序控制节点:按序执行的控制节点

    顺序节点是否能够执行,取决于顺序节点本身的前提以及顺序节点中当前节点的前提是否满足(evaluate方法),若是第一次执行,则取决于第一个节点前提是否满足。

    顺序节点的更新操作:顺序节点首先更新当前运行节点的运行状态,若返回完成,则执行下一节点,若为最后一个节点,则返回结束,否则仍返回运行中。

    顺序节点的清理操作:顺序节点会将所有值置为初始状态。

    关于并行节点和循环节点这里不再介绍。

    了解了行为树之后,我们可以总结出一个很重要的点,行为树的最终行为是由当前路径上所有前提条件的相与共同决定,也就是说当前路径上的前提条件必须全部满足(行为树也正是这样进行设计和运行的)。

    行为树节点的基本结构:

    class BevNode {
        BevNode* childNodeList[MAX_CHILD_NODE_CNT];
        unsigned int childNodeCount;
        BevNode* parentNode;
        BevNodePrecondition* nodePrecondition;
    
        virtual bool _DoEvaluate(const BevNodeInputParam& input)
        {
            return true;
        }
    
        virtual void _DoTransition(const BevNodeInputParam& input)
        {
    
        }
    
        virtual BevRunningStatus _DoTick(const BevNodeInputParam& input, BevNodeOutputParam& output)
        {
            return K_BRS_Finish;
        }
    };

    先看数据成员,分别代表节点的子节点、父节点、子节点数量以及前提。
    函数方面,分别代表了三种操作:判断(evaluate),更新/执行(tick),清理(transition).

    在具体控制节点实现中,判断的实现已经在上述几种控制条件中写出,更新操作基本就是自上而下进行,清理操作用于上一状态退出时的原节点的清理处理。

    针对本游戏内的AI设计,我们首先给出设计好的行为树:
    行为树

    此处红色节点代表行为节点,绿色节点代表带优先级的选择节点。我们首先按照优先级(取值范围由小到大)排列好根节点的子节点。可以看到,死亡状态节点是优先级最高的。与状态机类似,我们同样设计了逃跑节点以及跟随节点。按照设计好的行为树,我们每一帧去更新行为树的输入,并确定新的行为树状态。可以看到,与状态机相比,行为树的层次更加清晰,代码耦合度更低,同样也更容易扩展,行为树不需要考虑上次的状态,所有行为都由前提决定(所有前提都满足构成一条路径)。因此是状态机的很好替代。

    展开全文
  • 行为树(Behaviour Tree):概念,AI --掌握行为树的方法 起源,为了解决什么问题 发展历史,解决了什么问题,怎样解决的 概念,抽象出了哪些东西 应用,需要给行为树的需求分类,掌握不同类型的需要最适合的行为...

    行为树(Behaviour Tree):概念,AI

    --掌握行为树的方法

    1. 起源,为了解决什么问题
    2. 发展历史,解决了什么问题,怎样解决的
    3. 概念,抽象出了哪些东西
    4. 应用,需要给行为树的需求分类,掌握不同类型的需要最适合的行为树实现
      1. 通用的行为树工具,能力范围,扩展方式
      2. 特定游戏类型的行为树工具,能力范围,扩展方式
    5. 实现,各类行为树的实现方式
      1.通用的代码组织方式,代码能力范围
      2.特定游戏类型的代码组织方式,代码能力范围

    --认识行为树
    升级版的fsm
    更灵活,可配置性更强,可以让game designer方便的参与逻辑编写

    --实现方案
    数据结构中的行为树

    --概念收集和解读,这些概念主要来自于"ai分享站",感谢作者无私分享

    1. 决策(Decision)
      1. 根据输入选择行为
    2. 行为(Behavior)
      1. 具体输出,改变程序状态,具体来说,操作多媒体,视觉特效,和其它模块交互
    3. 逻辑动作(Logical Action),行为池(Behavior Pool)
      1. 一系列的行为
    4. 单一行为(Simple Behavior)
    5. 复合行为(Composite Behavior)
      1. 序列(Sequenece):一个个行为接着做
      2. 并行(Parallel):两个或多个行为同时进行
      3. 选择(Selector):从候选行为中选择一个执行,包括脚本选择,和随机选择
    6. 控制节点(Control Node)
      1. 同决策
    7. 行为节点(Ternimal Node)
      1. 同行为
    8. AI中的共享数据,如blackboard
      1. 共享数据方便
      2. 共享数据不容易维护
        1. 因为多人协作,变量可能重复,导致混乱
        2. 访问匿名,无法方便的找到依赖
      3. 使用共享数据需要制定使用规范
    9. AI中的LOD
      1. 不需要决策的停止
      2. 不需要频繁决策的,降低决策频率
      3. 注:lod: level of detail缩写,在渲染优化中,如果一个物体距离摄像机越近,那么就让它显示的细节越多,否则细节越少。从而减少渲染的量,提升性能。
    10. AI中的双缓冲
      1. 当事件发生,决策层进行处理,这个处理过程可以跑在别的线程
      2. 处理完的结果做完行为层的输入
    11. AI中的Lazy
      1. 当边界条件频繁变换时,ai快速响应变换,像一个傻瓜,lazy让ai淡定许多,不那么傻了
      2. 方法
        1. 定时器,ai收到world信息后过一段时间再处理
        2. 渐变阈值,world在某个边界变化的时候,让一个值不断收缩,如果边界又变化了,从新收缩,直到不再变化,收缩到一个值后,ai就会进行决策和行动
    12. AI调试
      1. 时机:调整ai行为,解决ai bug
      2. 尽量使用:脚本,参数配置
      3. 编辑器,解决编译缓慢问题,分离逻辑,运行时调整
      4. 观察器,运行时查看参数
      5. 远程命令,发送一段指令给引擎,使其执行相应的函数
      6. 回放,为了复现ai的问题,依赖引擎,需要制定良好的ai架构
      7. 游戏世界环境,决策层执行指令序列(用于分析行为)
    13. AI势力图
      1. 一般是一个二维数组
      2. 存放地图上某个格子的权值
      3. 可以过去或者不可以过去的程度
      4. 动态地图寻路算法会用到
      5. 势力图动态更新
      6. 可以用在A*算法求路径上
    14. 行为节点的状态,processing, successed, failed
    15. BT的执行流程
      1. 从根节点出发,寻找一个可执行节点,从那个节点开始执行
    16. 选择节点
      1. 优先级型,从左往右逐个测试,执行条件逐渐放宽
      2. 非优先级型,每次从上一个执行的节点开始测试准入条件,用互斥避免节点被屏蔽
      3. 权重型,根据权重做概率选择
    17. 并行节点
      1. 需要解决该父节点的状态是怎么由并行的子节点状态确定的
    18. Blackboard
      1. 封装行为树的输入
      2. 行为树间共享数据
      3. 节点间共享数据
      4. 根据上述的使用情景,一般有多个黑板
    19. 层次状态机 hfsm
      1. 解决负责状态机跳转关系混乱问题
      2. 把跳转分组,每组间相互跳转,组内状态相互跳转,如果组内还是负责,继续在组内分组
    20. 调控AI的难度
      1. 调整ai的感知能力
      2. 调整ai的决策能力
      3. 减少对特殊情况的处理
      4. 放宽条件,收窄条件,减少对玩家不利的行动
      5. 调整ai的行动能力
        1. 武器,速度,伤害,基本种类和程度的变换
    21. goai,目标导向的ai
      1. 适用于持续型的ai,不需要频繁决策
      2. 需要plan模块,分析实现目标需要做什么,检查是否做完,标记进度
    22. 游戏世界信息的收集和组织
      1. 信息图,游戏ai决策用到的世界信息图表,一般是二维数组
      2. 危险程度
      3. 优先程度
      4. lazy collect,不是每次世界更新都要更新信息图,ai用到的时候再去收集
      5. 分块,大的信息图进行分块,每次先选定要那一块的信息,然后让那一块的感知器进行收集
      6. 信息图共享,不同ai共享信息图
    23. 状态机转行为树的范式
      1. 模式1:当处在任何状态中,一旦某条件满足,即跳转到某个特定的状态:selector
      2. 模式2:对于同一个跳转条件,处在不同的状态会有不同的跳转:selector,sequence
      3. 模式3:根据条件跳转到多个状态,包括自跳转
        1. sequence selector
        2. selector
      4. 模式4:循环跳转:交替权重的selector
    24. 可预测的行为系统
      1. 某些情况下,决策层需要知道如果选择了某个行为未来某个时间的世界信息,此时需要行为层提供预测能力
      2. 基于预先设置的公式的预测
      3. 基于动画系统的预测,如果是动画系统会改变world信息,这个就需要做更多工作导出会造成的影响
    25. 被动式请求:不是玩家主动触发的行为,如:跑,跳,技能 是主动请求, 绊倒,掉血,死亡,装弹药
      处理方式
      1. 被动请求(如果有),主动请求(如果有)同时传递给选择模块,此处,选择模块在决策模块之后运行,被动请求由游戏世界直接产生
      2. 主动请求是决策的输出
      3. 在行为树的决策层中加入selector,world导致的改变不直接产生请求,而是改变决策层的状态,每次决策时决策层输出请求给行为层
    26. 设计ai中的参数系统
      1. 方便设计人员工作,减小不同工种粘合度
      2. 参数数据和文件可以互转
      3. 关联变换,静态的数据关联改变,不用计算公式运行时计算
        1. 注:这样数据的观测性好,但是不如直接提供一个查看器,我支持简单数据运行时计算的做法
    27. 共享节点型行为树
      1. 为了节约内存,行为树的逻辑结构部分抽离出来做为共享对象使用
      2. 定义一下这个共享的部分
      3. 表示行为树的结构信息,如sequence, selector, parallel的组织方式,表达了处理的流程
    展开全文
  • Behavior-Tree, 在 C 中,行为树库 新闻 !我们的书名为"机器人和人工智能中的行为树"的书在这里可以供查阅: https://arxiv.org/abs/1709.00084 BT C 中的行为树库。我正在使用 Davide Facont
  • LuaBT是一种可作为服务端AI实现的行为树方案,是NodeCanvas行为树的Lua实现,支持Unity编辑,运行时预览和前调试。 特性 NodeCanvas行为树的Lua实现(不支持状态机) 支持Unity编辑行为树,导出JSON文件 支持运行时...
  •  基于ECS模式,我们将行为树的层级结构拆分成下图  其中:   (1)NodeComponent只用来用来存储NodeData数据,不包含具体逻辑。  (2)NodeData,即多分支节点数据、单分支节点数据、叶子节点数据三种。多...

    一、设计思路

            基于ECS模式,我们将行为树的层级结构拆分成下图

            其中:       

            (1)NodeComponent只用来用来存储NodeData数据,不包含具体逻辑。

            (2)NodeData,即多分支节点数据、单分支节点数据、叶子节点数据三种。多分支节点数据对应的是组合节点,单分支节点数据对应的是装饰节点,叶子节点数据对应的是行为节点和条件节点。

           

            (3)TaskData,具体执行的任务的数据。可能是根据布尔值,可能是根据条件,可能是根据数量等数据进行具体的执行

           

            (4)BehaviorEntity,主要作为索引

            (5)BehaviorSystem,对应的轮询、节点处理、数据反序列化逻辑都在这里存放

            (6)NodeHandler,具体节点处理的逻辑

            

            (7)NodeDataSerializor,Node数据序列化/反序列化器

            

            (8)TaskDataSerilizor,Task数据序列化/反序列化器

            

     

    二、运行示例

    Git库:https://gitee.com/MK_Aliens/StarLightFramework-ECS.git

    展开全文
  • 游戏逻辑所做的许多事情(例如控制AI角色)都适合AI行为树模式。 AI行为树是组织交互逻辑的一种非常通用的方法。 它具有表示Running , Success或Failure流程的内置语义。 例如,如果您具有状态A和状态B : ...
  • 第6-2课:决策树、博弈树和行为树

    千次阅读 2020-09-22 12:17:12
    在以各种“XX学习”为代表的人工智能技术普及之前,游戏里常见的角色 AI 都是各种预设的行为逻辑,比如博弈树和行为树,当然也会用到各种专家知识库。当这些预设的行为逻辑足够复杂的时候,往往会让游戏玩家觉得游戏...

    在以各种“XX学习”为代表的人工智能技术普及之前,游戏里常见的角色 AI 都是各种预设的行为逻辑,比如博弈树和行为树,当然也会用到各种专家知识库。当这些预设的行为逻辑足够复杂的时候,往往会让游戏玩家觉得游戏里的人物很“智能”。从本质上来说,这些都还不算是真正的 AI,但也能够给游戏的体验增加很多乐趣,这一课我们就来介绍三种常见的给角色预设行为逻辑的方法,分别是决策树、博弈树和行为树。

    决策树(Decision Tree)

    在介绍决策树之前,先说一下分类算法,它是机器学习领域里的基本算法之一,常见的分类算法有贝叶斯分类算法、KNN 算法、逻辑回归算法、神经网络算法等,当然,还有各种深度学习算法。决策树是一种简单但广泛使用的分类器,因此,决策树也是一种分类算法。

    决策树长什么样

    决策树易于理解,通过解释后就能知道决策树所表达的意义了。决策树的每个内部节点表示在一个属性上的测试,每个分支代表该测试的一个输出,而每个树叶结点则代表一个分类标记,所谓的分类标记其实就是分类结果,比如“Yes”或“No”。

    21c89660-01ab-11e9-b0f4-ff31f4e5691e

    图(1)相亲决策示意图

    图(1)就是一个“疑似”决策树的示意图,这是一个姑娘的相亲决策。之所以用“疑似”来形容,是因为这个决策树上的判断条件都太主观、太抽象、没有量化。什么意思呢?比如说“年轻”这个条件,多少岁算年轻,多少岁算年老呢

    展开全文
  • UE4学习笔记--AI行为树架构

    千次阅读 多人点赞 2019-02-18 15:57:12
    虚幻4AI行为控制采用事件驱动模式,需由行为树和黑板配合使用的,行为树执行AI逻辑,黑板通过黑板变量来存储AI数据, 黑板变量的改变事件驱动AI行为树的逻辑执行。 一、控制器-行为树关联: 每个AI都有自己的控制...
  • 实验中采用某地区电信网的真实数据作为数据集,对比了决策、朴素贝叶斯、SVM等常见分类算法的实验效果,证明了所提用户行为特征的有效性与计算可行性;并以快递、航班、银行等服务号码为例,对比了不同群体通信...
  • 行为树的两种运行方式

    千次阅读 2017-08-26 12:39:00
    行为树的两种运行方式(金庆的专栏 2017.8)行为树每个Tick运行有两种实现方式: 从根节点重新开始运行 继续上次运行的节点 http://blog.renatopp.com/2014/08/15/an-introduction-to-behavior-trees-part-3/ One ...
  • 设计模式

    千次阅读 多人点赞 2019-05-15 20:52:02
    设计模式简介 1. 设计模式的定义 设计模式是在特定环境下为解决某一通用软件设计问题提供的一套定制的解决方案,该方案描述了对象和类之间的相互作用。 2.设计模式的基本要素 模式名称:模式名称通过一两个单词...
  • Unity 行为树 Behavior Designer

    万次阅读 2015-12-02 19:29:33
    目前在Unity3D游戏中一般复杂的AI都可以看到行为树的身影,简单的AI使用状态机来实现就可以了,所以这里我也是简单的学习下,为以后用到做准备。 行为树的概念出现已经很多年了,总的来说,就是使用各种经典的...
  • Unity3D项目的行为树。 使用代码驱动的方法编写,以使用构建器模式最大化大型项目的可维护性。 受流利行为树启发。 特征 可扩展,编写自己的自定义可重用节点 预先建立的任务库可启动您的AI 树可视化工具在运行时...
  • unity行为树

    千次阅读 2017-09-08 13:35:01
    浅谈游戏AI 谈到游戏AI,很明显智能体拥有的知识条目越多,便显得更智能,但维护庞大数量的知识条目是个噩梦:使用有限状态机(FSM),分层有限状态机(HFSM),决策树(Decision Tree)来...试试Next-Gen AI的行为树(Behav
  • 行为树的概念以及在游戏中的应用

    千次阅读 2020-04-22 20:03:01
    1.行为树的概念 行为树(behavior tree)是一种树状的数据结构,树上的每一个节点都是一个行为(节点必须包含函数)。每次调用会从根节点开始遍历,通过检查行为的执行状态来执行不同的节点。行为树也是一种逻辑模型,...
  • 行为树已经成为游戏AI中重要流行的实现方式,相比其他种类的ai(如神经网络,遗传算法,机器学习)更适合策划配置和控制,相比fsm更易扩展,在arpg中的怪物ai中比较流行。这里对行为树的概念做个总结。
  • 设计模式之职责链模式(行为型)

    千次阅读 2018-12-23 00:04:06
    文章目录一、行为模式二、职责链模式定义三、职责链模式角色四、简单实例 一、行为模式 介绍职责链模式之前先介绍一下行为型设计模式,因为按照GoF模式分类,职责链就是一种行为型设计模式行为型设计模式...
  • 行为树框架是经典设计模式结构的基础,通常与 AI(人工智能)领域相关,主要用于游戏行业。 这些框架是针对具有复杂逻辑基础结构并具有与神经网络类似的基于节点的结构的系统的解决方案,但返回离散布尔响应,而不是...
  • Java经典设计模式共有21中,分为三大类:创建型模式(5种)、结构型...行为模式细分为如下11种:策略模式、模板方法模式、观察者模式、迭代子模式、责任链模式、命令模式、备忘录模式、状态模式、访问者模式、中介者
  • Java经典设计模式共有21中,分为三大类:创建型模式(5种)、结构型模式(7种)和行为模式(11种)。本文主要讲行为模式,创建型模式和结构型模式可以看博主的另外两篇文章:Java经典设计模式之五大创建型模式...
  • Java知识体系最强总结(2021版)

    万次阅读 多人点赞 2019-12-18 10:09:56
    存储过程与函数 视图 MySQL优化 事务 数据备份与还原 Redis Java虚拟机 深入理解Java虚拟机 架构设计 设计模式 创建型模式 结构型模式 行为模式 J2EE模式 实践应用 应用框架 Spring 《Spring实战》读书笔记 Spring...
  • 有限状态机(英语:finite-state machine,缩写:FSM)又称有限状态自动机,简称状态机,是表示有限个状态以及在这些状态之间的转移和动作等行为的数学模型。 有限状态机算是Unity开发中一个比较重要的技巧了。在...
  • 为了观察网络用户浏览行为以研究用户偏爱的浏览模式集和个人兴趣,本文采用频繁链表结合存取的增量式结构,使用捕获的网络用户浏览轨迹构建、更新该结构并使用同类合并的思想挖掘该结构以获得用户偏爱浏览模式集。...
  • 黑板(Blackboard)是一种数据集中式的设计模式,一般用于多模块间的数据共享,我在做行为树的过程中,发现黑板非常适合作为行为树的辅助模块来使用,这次就来谈谈如何在行为树中使用黑板。 行为树的决策一般要...
  • 总体来说设计模式分为三大类... 行为模式,共十一种:策略模式、模板方法模式、观察者模式、迭代子模式、责任链模式、命令模式、备忘录模式、状态模式、访问者模式、中介者模式、解释器模式。  其实还有两类:并发
  • 设计模式(三)之行为模式

    千次阅读 2016-11-23 13:02:24
    本篇是关于设计模式的最后一讲,会讲到第三种设计模式——行为模式,共11种:策略模式、模板方法模式、观察者模式、迭代子模式、责任链模式、命令模式、备忘录模式、状态模式、访问者模式、中介者模式、解释器模式...
  •  行为树模型看似简单,但是以下几个优点让行为树目前变成了复杂AI的主流模型   A)静态性  越复杂的功能越需要简单的基础,否则最后连自己都玩不过来。即使系统需要某些"动态"性,也应该尽量使用静态...
  • 23种设计模式

    千次阅读 2014-02-18 23:17:37
    23种设计模式
  • 4.1 策略模式(strategy) 策略模式定义了一系列算法,并将每个算法封装起来,使他们可以相互替换,且算法的变化不会影响到使用算法的客户。需要设计一个接口,为一系列实现类提供统一的方法,多个实现类实现该接口...
  • 比如士兵的行为有“巡逻”,“追击敌人”,“攻击敌人”,“逃跑”等行为, 响应的事件就有“发现敌人”,“追到敌人”,“敌人逃跑”,“敌人死亡”,“自己血量不足”等。 那么可以写成这样一个状态机: 1.士兵 ...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 117,138
精华内容 46,855
关键字:

行为树模式