public object Evaluate(object arg) { var input = (Tuple <string, string>)arg; var output = Comparison(input.Item1, input.Item2); Evaluated?.Invoke(this, new EvaluatedEventArgs { X = input.Item1, Y = input.Item2, Result = output }); return(output); }
public virtual Volume <T> Evaluate(Session <T> session) { Evaluated?.Invoke(this, new EventArgs()); #if DEBUG var inputs = this.Result.ToArray(); for (var index = 0; index < inputs.Length; index++) { var i = inputs[index]; if (Core.Ops <T> .IsInvalid(i)) { throw new ArgumentException("Invalid input!"); } } #endif return(this.Result); }
/// <summary> /// マップを評価し、指定されたチームの得点を計算します。<see cref="AutoEvaluate"/>がfalseの場合はエージェントが移動した際に手動で呼び出す必要があります。 /// 計算はほとんど時間がかからない(10ms未満)なので躊躇せず読んであげてね☆ /// </summary> /// <param name="team">チーム</param> /// <returns></returns> public int EvaluateMap(Teams team) { if ((int)team > 2) { throw new NotSupportedException("複数フラグによる評価は対応していません。片方のチームのみで評価してください"); } if (_ignoreUpdate) { return(team == Teams.Team1 ? Score1 : Score2); } _ignoreUpdate = true; int x = 0, y = 0; //マップからチームのタイルポイントを計算します var tile = Map.Cast <ICell>().Where((c, i) => { y = i / Width; x = i - y * Width; //ついでに領域フラグ削除 if (c.GetState(team).HasFlag(CellState.InRegion)) { c.SetState(team, CellState.None); } if (c.GetState(team).HasFlag(CellState.Occupied)) { return(true); } return(false); }).Sum(c => ((ScoreCell)c).Score); //領域点を計算します(塗りつぶしアルゴリズムを応用) //評価点を格納する int[,] evaluated = new int[Height, Width]; evaluated.ForEach((point, _) => { //未判定(評価点0)の場合 if (evaluated[point.Y, point.X] == 0) { var fillp = new Point(point.X, point.Y); var fills = GetCell(fillp).GetState(team); var filled = Helper.FieldUtils.FillField(this, fillp, team, (state1, p) => state1 == fills, new Direction[] { Direction.Left, Direction.Up, Direction.Right, Direction.Down }); bool containsEdge = false; filled.ForEach((p, c) => { if (c != null) { if (Map.IsEdge(p.X, p.Y)) { //端と当たった場合は領域ではない containsEdge = true; } //評価点を加算してそのセルを評価済みにする evaluated[p.Y, p.X]++; } }); if (!containsEdge) { filled.ForEach((p, c) => { //占有されたセルは領域ではないので除外 if (c != null && !c.GetState(team).HasFlag(CellState.Occupied)) { evaluated[p.Y, p.X]++; } }); } } }); //評価点が2の場合は領域となる int region = 0; evaluated.ForEach((p, v) => { if (v == 2) { var cell = Map[p.Y, p.X]; cell.SetState(team, CellState.InRegion); region += Math.Abs(cell.Score); } }); if (AutoDump) { DumpMap(team); } var sum = tile + region; switch (team) { case Teams.Team1: Score1 = sum; break; case Teams.Team2: Score2 = sum; break; } Evaluated?.Invoke(this, new EventArgs()); _ignoreUpdate = false; return(sum); }
protected virtual void OnEvaluated() { Evaluated?.Invoke(); }