这是对FuSM(模糊状态机)的正确实现吗?

我非常困惑这是否真的可以算作FuSM,因为最终它只是一个if-else条件,很多人说这不足以成为模糊逻辑?我也搞不清楚模糊AI和模糊状态机是否被认为是同一事物?FuSM是否必须支持多个状态同时执行才能被称为FuSM?这个实现确实做到了这一点,但我不知道它是否正确实现了。

希望我的问题没有太模糊,也许我问得太早了。我确实很困惑,希望能得到一些启发。

// 某些状态可能不能同时执行
public enum StateType{
    MovementXZ, // 可以在执行其他所有操作时移动
    MovementY, // 可以在执行其他所有操作时跳跃和爬行
    Action // 可以在执行其他所有操作时使用双手(射击等)
}
public class FuzzyStateMachine{
    private readonly Dictionary<StateType, List<IFuzzyState>> _states;
    public void AddState(IFuzzyState state)
    {
        _states[state.StateType].Add(state);
    }
    public void ExecuteStates()
    {
        foreach (List<IFuzzyState> states in _states.Values)
        {
            // 选择“DOA”值最大的状态。
            IFuzzyState state = states.MaxBy(x => x.CalculateDOA());
            state.Execute();
        }
    }
}
public interface IFuzzyState{
    StateType StateType { get; }
    /// <summary>
    /// 计算激活度(一个介于[0, 1]之间的值)
    /// </summary>
    /// <returns></returns>
    double CalculateDOA();
    // TODO: 实现:OnEnterState, OnExitState 和 OnStay 而不是仅仅Execute()
    void Execute();
}

两个简单的例子:

public class SeekCoverState : IFuzzyState{
    public StateType StateType
    {
        get { return StateType.MovementXZ; }
    }
    public double CalculateDOA()
    {
        return 1 - Agent.Health / 100d;
    }
    public void Execute()
    {
        // 移动到掩体
    }
}
public class ShootAtEnemyState : IFuzzyState{
    public StateType StateType
    {
        get { return StateType.Action; }
    }
    public double CalculateDOA()
    {
        // 返回击中目标的概率或其他。
    }
    public void Execute()
    {
        // 射击
    }
}

回答:

对于同样感到困惑的任何人。我认为这不被视为模糊逻辑,尽管你可以找到类似的脚本自称是模糊逻辑。一个例子是:http://xbox.create.msdn.com/en-US/education/catalog/sample/fuzzy_logic

问题在于当你有许多变量,如健康值、弹药、视野中的敌人、速度、攻击性、伤害、命中几率… 并且你需要根据所有这些变量决定AI是应该攻击、防御还是逃跑时,你需要创建的if语句数量将是pow(numOfVariables, numOfStates)。解决这个问题的其中一种方法是使用模糊逻辑,它根据当前输入值和为你的规则集指定的权重计算最佳输出/状态。

我推荐查看这篇文章,它解释得很好,并且通过一个有用且实用的例子进行了说明。http://www.byond.com/forum/?post=37966

Related Posts

使用LSTM在Python中预测未来值

这段代码可以预测指定股票的当前日期之前的值,但不能预测…

如何在gensim的word2vec模型中查找双词组的相似性

我有一个word2vec模型,假设我使用的是googl…

dask_xgboost.predict 可以工作但无法显示 – 数据必须是一维的

我试图使用 XGBoost 创建模型。 看起来我成功地…

ML Tuning – Cross Validation in Spark

我在https://spark.apache.org/…

如何在React JS中使用fetch从REST API获取预测

我正在开发一个应用程序,其中Flask REST AP…

如何分析ML.NET中多类分类预测得分数组?

我在ML.NET中创建了一个多类分类项目。该项目可以对…

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注