protected override TurnInfo AppraiseFunction(GameModel current, SearchStorage ss) { IgnitionStorage ign = (IgnitionStorage)ss; return ign.ipa.FieldAssess(current, ResultAppraise); }
private TurnInfo AppraiseNode(AppraisalTree node, int level, long boader, SearchStorage ss) { TurnInfo nowInfo = node.Info; TurnInfo forwardInfo = new TurnInfo(); TurnInfo appraiseInfo = new TurnInfo(); if (nowInfo.AppraisalScore != long.MinValue) { if (nowInfo.AppraisalScore < boader) { node.ReleaseChild(); return nowInfo; } else if(level >= ss.NowLevel) { return nowInfo; } } forwardInfo = ss.GMC.ForwardStep(node.CX, node.CR); if (forwardInfo.AppraisalScore >= 0) { if (level >= ss.NowLevel) { appraiseInfo = AppraiseFunction(ss.GMC.GetCurrentGameModel(), ss); ss.CallCount++; } else { ss.GMC.NextLevel(); appraiseInfo = SearchNode(node, level, ss); ss.GMC.PreviousLevel(); } } ss.GMC.BackwardStep(); nowInfo = ReckonAppraiseScore(forwardInfo, appraiseInfo); node.Info = nowInfo; return nowInfo; }
protected abstract TurnInfo AppraiseFunction(GameModel current, SearchStorage ss);
private TurnInfo SearchNode(AppraisalTree node, int level, SearchStorage ss) { if (!node.IsExistChild()) { node.GenerateChild(W, T); } int length = node.Length; TurnInfo maxInfo = new TurnInfo { AppraisalScore = long.MinValue }; long minScore = long.MaxValue; //long boader = GetRankBoaderScore(node, level + 1); long boader = ss.BoaderScore; for (int i = 0; i < length; i++) { TurnInfo nextInfo = AppraiseNode(node[i], level + 1, boader, ss); if (maxInfo.AppraisalScore < nextInfo.AppraisalScore) { maxInfo = nextInfo; } if (nextInfo.AppraisalScore >= boader) { minScore = Math.Min(minScore, nextInfo.AppraisalScore); } } if (minScore < long.MaxValue) { ss.MinimaxScore = Math.Max(ss.MinimaxScore, minScore); } return maxInfo; }