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

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

< Лекция 20 || Лекция 21: 12 || Лекция 22 >
Аннотация: Вводится понятие агентного моделирования. Реализована система на основе агентного моделирования для игры в "крестики-нолики", показано влияние интеллектуальных агентов на результат игры.

Цель лекции: Дать объектно-ориентированную трактовку агентного моделирования. Реализовать это моделирования языке C# и провести разыгрывание полученной модели.

В этой лекции мы будем рассматривать своеобразные динамические системы. Но в отличии от предыдущей лекции мы не будем задавать отображение фазового пространства. Вместо этого мы будем рассматривать множество агентов, которые будут функционировать в заданной внешней для них среде.

Перейдем к формальному описанию. Пусть в нашей системе задано N_A агентов, которых мы будем обозначать:

A_i,\ i=1,\dots,N_A.
Мы будем рассматривать лишь конечное количество агентов. Каждый агент имеет свое множество состояний: Q_i - множество состояний агента A_i, i=1,\dots,N_A. Кроме того будем рассматривать множество состояний внешней среды. Это множество будем обозначать: Q_0. В этом множестве состояний выделено два элемента q_0,q_f\in Q_0. Элемент q_0 - это начальное состояние внешней среды, а элемент q_f - финальное состояние системы. Мы будем рассматривать динамическую систему с дискретным временем n=0,1,2,\dots. Введем обозначения S(i,n):
S(i,n)\in Q_i,\ i=0,1,\dots,N_A;\ n=0,1,2,\dots,
смысл функции S(i,n) - это состояние агента (для i>0 ) или внешней среды (для i=0 ) в момент n.

Внешняя среда в заданном порядке предоставляет право агентам изменять свое внутреннее состояние и состояние внешней среды. При этом, разумеется агент имеет право менять состояние внешней среды не произвольно, а лишь выбирая это состояние из заданных возможностей. Эти возможности завися как от состояния самого агента и текущего состояния внешней среды. Введем множества возможностей i -го агента, находящегося в состоянии A_q\in Q_i, когда внешняя среда находится в состоянии q\in Q_0:

W_i(A_q,q)\subset Q_0,\ q\in S_0,\ A_q\in S_i,\ i=1,2,\dots,N_A.
У каждого агента есть "функция" перехода. Но эта не есть детерминированная функция, а реакция агента. Мы будем это отображение обозначать
R_i(S(i,n),S(0,n))\in W_i(S(i,n),S(0,n)),
i=1,2,\dots,N_A,\ n=0,1,2,\dots.
При реализации отображения R_i могут быть использованы генераторы случайных чисел, поэтому выбор "хода" агента может носить и стохастический характер.

Необходимо еще выбрать функцию определения очередности ходов агентов. Обозначим эту функцию через

I:\Bbb{N}\times Q_0\to\{1,2,\dots,N_A\}.
Мы подчеркиваем, что выбор игрока, которому предлагается изменить свое внутреннее состояние и состояние внешней среды, зависит от текущего времени ( n ) и от текущего состояния внешней среды. Часто при разыгрывании ситуации право хода чередуется между агентами. Однако возможны и более сложные случаи.

Мы реализуем игру в "крестики-нолики". Рассматривается квадратное игровое поле 3\times3. В игру играют два игрока: первый ставит отметку "крестиком", второй "ноликом". Цель - выстроить три крестика или нолика в один ряд или по диагонали. Игра завершается либо выигрышем одного из игроков, либо вничью, когда нет более свободных клеток.

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

Стратегия первого игрока. Если свободен центр, ставим играем в центр. Если центр занят, но есть хотя бы один свободный угол, то играем в один из свободных углов, выбирая его случайным образом. Если центр и углы заняты, играем случайным образом в любое свободное поле. Стратегия второго игрока. Всегда играем в любое свободное поле. Интуитивно ясно, что стратегия первого игрока хотя и не является оптимальной, но должна приводить к победе чаще, чем второго.

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

\begin{verbatim}
    class TArray
    {
        int[] arr;
        int Count = 9;

        public TArray()
        {
            arr = new int[9];
            for (int i = 0; i < 9; i++)
            {
                arr[i] = 0;
            }
        }

        public bool Check(int i, int Star)
        {
            if (Who(i) == 0)
            {
                arr[i] = Star;
                Count--;
                return true;
            }
            else
            {
                return false;
            }

        }
\end{verbatim}
\begin{verbatim}
        public int GetCount()
        {
            return Count;
        }

        public int Who(int i)
        {
            return arr[i];
        }

        public bool IsOver(int Star)
        {
            int i;
            for(i=0;i<3;i++)
            {
                if ((arr[i] == Star) &&
                (arr[i + 1] == Star) && (arr[i + 2] == Star))
                {
                    return true;
                }

                if ((arr[i] == Star) &&
                (arr[i + 3] == Star) && (arr[i + 6] == Star))
                {
                    return true;
                }
            }
\end{verbatim}
\begin{verbatim}
            if ((arr[0] == Star) &&
            (arr[4] == Star) && (arr[8] == Star))
            {
                return true;
            }

            if ((arr[2] == Star) &&
            (arr[4] == Star) && (arr[6] == Star))
            {
                return true;
            }

            return false;
        }
    }
\end{verbatim}

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

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