这是 FuSM(模糊状态机)的正确实现吗
Is this a correct implementation of a FuSM (Fuzzy State Machine)
我非常困惑这是否真的算作 FuSM,因为最后,它只是一个 if else 条件,很多人说这还不足以成为模糊逻辑?我也很困惑模糊 AI 和模糊状态机是否被认为是一样的? FuSM 必须支持同时执行多个状态才能成为 FuSM 吗?此实现执行此操作,但我不确定它是否正确。
希望我的问题不是太不清楚,也许我现在问还为时过早。我肯定很困惑,如果能对此有所了解,我将不胜感激。
// Some states may not be executed simultaneously
public enum StateType
{
MovementXZ, // Can move while doing everything else
MovementY, // Can jump & crawl while doing everything else
Action // Can use his hands (shoot & stuff) while doing everything else
}
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)
{
// Selects the state with the maximum "DOA" value.
IFuzzyState state = states.MaxBy(x => x.CalculateDOA());
state.Execute();
}
}
}
public interface IFuzzyState
{
StateType StateType { get; }
/// <summary>
/// Calculates the degree of activation (a value between [0, 1])
/// </summary>
/// <returns></returns>
double CalculateDOA();
// TODO: implement: OnEnterState, OnExitState and OnStay instead of just 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()
{
// Move twoards cover
}
}
public class ShootAtEnemyState : IFuzzyState
{
public StateType StateType
{
get { return StateType.Action; }
}
public double CalculateDOA()
{
// Return the properbility of hidding the target or something.
}
public void Execute()
{
// Shoot
}
}
外面的人也很困惑。我不认为这被认为是模糊逻辑,即使您可以在那里找到自称为模糊逻辑的模拟脚本。
一个例子蜜蜂:
http://xbox.create.msdn.com/en-US/education/catalog/sample/fuzzy_logic
问题是当你有很多变量,比如生命值、弹药、视线内的敌人、速度、攻击性、伤害、命中率......你需要决定 AI 应该攻击、防御还是逃跑考虑到上述所有变量,您需要进行的 if 语句的数量为 pow(numOfVariables, numOfStates)
。解决该问题的一种方法是使用模糊逻辑,它根据当前输入值和为规则集指定的权重计算最佳输出/状态。
我建议您查看此 post,它解释得非常好,并且提供了一个有用且实用的示例。
http://www.byond.com/forum/?post=37966
我非常困惑这是否真的算作 FuSM,因为最后,它只是一个 if else 条件,很多人说这还不足以成为模糊逻辑?我也很困惑模糊 AI 和模糊状态机是否被认为是一样的? FuSM 必须支持同时执行多个状态才能成为 FuSM 吗?此实现执行此操作,但我不确定它是否正确。
希望我的问题不是太不清楚,也许我现在问还为时过早。我肯定很困惑,如果能对此有所了解,我将不胜感激。
// Some states may not be executed simultaneously
public enum StateType
{
MovementXZ, // Can move while doing everything else
MovementY, // Can jump & crawl while doing everything else
Action // Can use his hands (shoot & stuff) while doing everything else
}
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)
{
// Selects the state with the maximum "DOA" value.
IFuzzyState state = states.MaxBy(x => x.CalculateDOA());
state.Execute();
}
}
}
public interface IFuzzyState
{
StateType StateType { get; }
/// <summary>
/// Calculates the degree of activation (a value between [0, 1])
/// </summary>
/// <returns></returns>
double CalculateDOA();
// TODO: implement: OnEnterState, OnExitState and OnStay instead of just 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()
{
// Move twoards cover
}
}
public class ShootAtEnemyState : IFuzzyState
{
public StateType StateType
{
get { return StateType.Action; }
}
public double CalculateDOA()
{
// Return the properbility of hidding the target or something.
}
public void Execute()
{
// Shoot
}
}
外面的人也很困惑。我不认为这被认为是模糊逻辑,即使您可以在那里找到自称为模糊逻辑的模拟脚本。 一个例子蜜蜂: http://xbox.create.msdn.com/en-US/education/catalog/sample/fuzzy_logic
问题是当你有很多变量,比如生命值、弹药、视线内的敌人、速度、攻击性、伤害、命中率......你需要决定 AI 应该攻击、防御还是逃跑考虑到上述所有变量,您需要进行的 if 语句的数量为 pow(numOfVariables, numOfStates)
。解决该问题的一种方法是使用模糊逻辑,它根据当前输入值和为规则集指定的权重计算最佳输出/状态。
我建议您查看此 post,它解释得非常好,并且提供了一个有用且实用的示例。 http://www.byond.com/forum/?post=37966