Опубликован: 18.05.2011 | Доступ: свободный | Студентов: 968 / 105 | Оценка: 4.40 / 4.20 | Длительность: 12:30:00
Лекция 21:

Объектно-ориентированная реализация агентного моделирования

< Лекция 20 || Лекция 21: 12 || Лекция 22 >

Следующие классы описывают поведение игроков.

\begin{verbatim}
    abstract class TAgent
    {
        public int Star;
        public TAgent(int Star)
        {
            this.Star = Star;
        }

        abstract public int move(TArray Arr, Random rnd);
    }

    class TAgent1 : TAgent
    {
        public TAgent1(int Star) : base(Star) { }
        public override int move(TArray Arr, Random rnd)
        {
            if (Arr.Who(4) == 0)
            {
                Arr.Check(4, Star);
                return 4;
            }

            int[] Angles = new int[4] {0, 2, 6, 8};

            int AngCount = 0;
            int i, I;

            for (i = 0; i < 4; i++)
            {
                if (Arr.Who(Angles[i]) == 0)
                {
                    AngCount++;
                }
            }
\end{verbatim}
\begin{verbatim}
            if (AngCount > 0)
            {
                I = rnd.Next(AngCount);

                for (i = 0; i < 4; i++)
                {
                    if (Arr.Who(Angles[i]) == 0)
                    {
                        if (I == 0)
                        {
                            Arr.Check(Angles[i], Star);
                            return Angles[i];
                        }
                        I--;
                    }
                }
            }

            I = rnd.Next(Arr.GetCount());

            for (i = 0; i < 9; i++)
            {
                if (Arr.Who(i) == 0)
                {
                    if (I == 0)
                    {
                        Arr.Check(i, Star);
                        return i;
                    }
                    I--;
                }
            }

            return 0;
        }
    }
\end{verbatim}
\begin{verbatim}
    class TAgent2 : TAgent
    {
        public TAgent2(int Star) : base(Star) { }

        public override int move(TArray Arr, Random rnd)
        {
            int I = rnd.Next(Arr.GetCount());

            for (int i = 0; i < 9; i++)
            {
                if (Arr.Who(i) == 0)
                {
                    if (I == 0)
                    {
                        Arr.Check(i, Star);
                        return i;
                    }
                    I--;
                }
            }

            return 0;
        }
    }
\end{verbatim}

И последний класс управляет всей игрой. В начале он выбирает очередность ходов, но первый игрок всегда играет "крестиком" (цифрой 1 ), а второй "ноликом" (цифрой 2 ).

\begin{verbatim}
    class TXO
    {
        public Random rnd;
        TArray Arr;
        TAgent1 A1;
        TAgent2 A2;

        public TXO()
        {
            rnd = new Random();
            Clear();
        }

        void Clear()
        {
            Arr = new TArray();
            A1 = new TAgent1(1);
            A2 = new TAgent2(2);
        }

        public int Run()
        {
            Clear();

            int res = 0;

            TAgent[] Agents = new TAgent[2];

            if (rnd.Next(2) == 0)
            {
                Agents[0] = A1;
                Agents[1] = A2;
            }
            else
            {
                Agents[0] = A2;
                Agents[1] = A1;
            }
\end{verbatim}
\begin{verbatim}
            for (int i = 0; i < 9; i++)
            {
                if ((i % 2) == 0)
                {
                    Console.WriteLine("{0} => {1}",
                    Agents[0].Star,
                    Agents[0].move(Arr, rnd));
                    if (Arr.IsOver(Agents[0].Star))
                    {
                        res = Agents[0].Star;
                        break;
                    }
                }
                else
                {
                    Console.WriteLine("{0} => {1}",
                    Agents[1].Star,
                    Agents[1].move(Arr, rnd));
                    if (Arr.IsOver(Agents[1].Star))
                    {
                        res = Agents[1].Star;
                        break;
                    }
                }

            }

            return res;
        }
    }
\end{verbatim}

Теперь сыграем 1000 партий.

\begin{verbatim}
    TXO XO = new TXO();

    int Res1 = 0;
    int Res2 = 0;

    int Star;

    for (int i = 0; i lt; 1000; i++)
    {
        Console.WriteLine("\nNew Game");
        Star = XO.Run();
        Console.WriteLine("Winner = {0}", Star);
        if (Star == 1)
        {
            Res1++;
        }
        else
        {
            Res2++;
        }
    }

    Console.WriteLine("1 => {0}\t2 => {1}", Res1, Res2);
}
\end{verbatim}

Типичный результат игры такой:

\begin{verbatim}
..........

 New Game
 1 => 4
 2 => 1
 1 => 6
 2 => 3
 1 => 2
 Winner = 1
 1 => 745   2 => 255

\end{verbatim}

Примерно в трех из четырех партий первый игрок, обладающий более интеллектуальной стратегией выигрывает у второго, который по сути играет автоматически случайно ставя "нолик".

Ключевые термины

Агент - некоторая сущность способная взаимодействовать с внешней средой.

Внешняя среда - программная среда, в которой действуют агенты.

Функция определения очередности ходов агентов - правило, задающее последовательность ходов агентов.

Краткие итоги Реализована нетривиальная динамическая система на основе агентного моделирования. Проведены вычислительные эксперименты, которые дали статистические характеристики агнетов.

Ключевые термины

Агент - некоторая сущность способная взаимодействовать с внешней средой.

Внешняя среда - программная среда, в которой действуют агенты.

Функция определения очередности ходов агентов - правило, задающее последовательность ходов агентов.

Краткие итоги: Реализована нетривиальная динамическая система на основе агентного моделирования. Проведены вычислительные эксперименты, которые дали статистические характеристики агнетов.

< Лекция 20 || Лекция 21: 12 || Лекция 22 >