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);
        }
예제 #3
0
        /// <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);
        }
예제 #4
0
 protected virtual void OnEvaluated()
 {
     Evaluated?.Invoke();
 }