这是对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

Keras Dense层输入未被展平

这是我的测试代码: from keras import…

无法将分类变量输入随机森林

我有10个分类变量和3个数值变量。我在分割后直接将它们…

如何在Keras中对每个输出应用Sigmoid函数?

这是我代码的一部分。 model = Sequenti…

如何选择类概率的最佳阈值?

我的神经网络输出是一个用于多标签分类的预测类概率表: …

在Keras中使用深度学习得到不同的结果

我按照一个教程使用Keras中的深度神经网络进行文本分…

‘MatMul’操作的输入’b’类型为float32,与参数’a’的类型float64不匹配

我写了一个简单的TensorFlow代码,但不断遇到T…

发表回复

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