public Event(AIComponent.Decision decision) { m_decision = decision; m_injure = 0; m_demage = 0; m_usingActionPoint = 0; }
//改变当前状态 public override void ChangeDecision(AIComponent.Decision newDecision) { m_previsousDecsion = m_currentDecision; m_previsousDecsion.Exit(this); m_currentDecision = m_decisions [newDecision]; m_currentDecision.Enter(this); }
//默认为null状态 public Event() { m_decision = AIComponent.Decision.Null; m_injure = 0; m_demage = 0; m_usingActionPoint = 0; }
//更新静态数据 public static void UpdateStatic(AIComponent.Decision decision, float newInjure, float newDem) { float tmpInjure = StaticBayesInjure [decision] + newInjure; float tmpDem = StaticBayesDemage [decision] + newDem; StaticBayesInjure [decision] = tmpInjure / 2; StaticBayesDemage [decision] = tmpDem / 2; }
//不把attack添加入决策事件中,而是加入上一个事件中 public void AddEvent(AIComponent.Decision decision) { if (decision == AIComponent.Decision.Attack) { Debug.Log("Add Error Decision"); return; } Event e = new Event(decision); m_events [m_currentEvent] = e; m_events [m_currentEvent].m_usingActionPoint++; //m_currentEvent -1 才是真正的当前事件 m_currentEvent++; if (m_currentEvent == eventLength) { m_currentEvent = 0; } }
public float BayesInjure(AIComponent.Decision decision) { //所有的行动 int allExcute = 0; //对应行动的次数 int decisionExecute = 0; //对应行动造成伤害的次数 int executeInjure = 0; //总的进攻次数 int allInjure = 0; foreach (Event e in m_events) { if (e == null) { continue; } if (e.m_injure != 0) { allInjure++; } if (e.m_decision != AIComponent.Decision.Null) { allExcute++; if (e.m_decision == decision) { decisionExecute++; if (e.m_injure != 0) { executeInjure++; } } } } //如果还没有足够的数据,那么从静态参数中取值 if (allExcute == 0 || allInjure == 0 || decisionExecute == 0) { return(Probability.StaticBayesInjure [decision]); } float denominator = allInjure / allExcute; return(((executeInjure / decisionExecute) * (decisionExecute / allExcute)) / denominator); }
//生产对应状态 public BasicDecision <Heretic> CreateDecision(AIComponent.Decision decision) { switch (decision) { case AIComponent.Decision.Attack: return(new AttackDecision <Heretic> ()); case AIComponent.Decision.CallSupport: return(new CallSupportDecision <Heretic> ()); //case AIComponent.Decision.Escape: //return new EscapeDecision<Heretic> (); case AIComponent.Decision.Patrol: return(new PatrolDecision <Heretic> ()); case AIComponent.Decision.Survey: return(new SurveyDecision <Heretic> ()); default: return(null); } }
//状态的平均伤害数值 public float ExpectDemage(AIComponent.Decision decision) { int demageTime = 0; float expectDemage = 0; foreach (Event e in m_events) { if (e == null) { continue; } if (e.m_decision == decision) { expectDemage += e.m_demage; demageTime += e.m_usingActionPoint; } } if (demageTime == 0) { return(1); } return(expectDemage / demageTime); }
public float ExpectInjure(AIComponent.Decision decision) { int ingureTime = 0; float expectInjure = 0; foreach (Event e in m_events) { if (e == null) { continue; } if (e.m_decision == decision) { expectInjure += e.m_injure; ingureTime += e.m_usingActionPoint; } } if (ingureTime == 0) { return(1); } return(expectInjure / ingureTime); }
public void SetDecesionType(AIComponent.Decision type) { m_DecisionType = type; }
//状态的伤害期待 = 平均伤害数值* 造成伤害的可能性 public float DecisionExpectDemage(AIComponent.Decision decision) { Debug.Log("BayesInjure (decision)" + BayesInjure(decision)); Debug.Log(" ExpectInjure (decision)" + ExpectInjure(decision)); return(BayesDemage(decision) * ExpectDemage(decision)); }
public abstract void ChangeDecision(AIComponent.Decision newDecision);