我非常困惑这是否真的可以算作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