Ю. Карпов - Иммитационное моделирование систем с AnyLogic 5 (1124147), страница 33
Текст из файла (страница 33)
Например, выберем их случайно. В поле Код инициализации окна Код корневого объекта иа) и введите цикл, в котором элементы массива а11пе устанавливаются в истину либо ложь случайно, в зависимости от топ>, будет ли сгенерированная случайная величина, равномерно распределенная между 0 и 1, меньше некоторого порога: 1от( 1пт з=о> 1<НЗ 1++ ) тот( 1пт 3=0з 3<Из )++ а11зте[1][З] = тапооазттие(0.2)з ИСПОЛЬЗОВаННая ЗДЕСЬ фуНКцИя тапао. ттпе(аопъъе т) ВОЗВращаЕт ЗНаЧЕНИЕ стае с вероятностью т (0<т<1). Код )ауа, записанный в поле Код инициализации проекта, выполняется до запуска модели на выполнение. Поэтому если запустить модель сейчас, в поле анимации можно наблюдать случайно расположенные живые ячейки (их приблизительно 20 %). Сравните свою МсдЕЛЬ С МОДЕЛЬЮ Ъ11еаа 8.1.4.
Алгоритм изменения состояния ячеек Рассмотрим теперь, как изменять состояния всех прямоугольников на кажлом шаге выполнения модели. Сделать это просто: сначала подсчитаем для каждого прямоугольника число его живых соседей, а потом изменим состояние каждого прямоугольника в соответствии с правилами игры "Жизнь".
Это самый простой и ясный алгоритм, который, однако, не будет оптимальным по быстродействию. Тем не менее, мы реализуем именно его, чтобы на всех шагах разработки оставалась понятной идея алгоритма. Для реализации изменения состояний ячеек в нашей модели в корневом объекте маъп требуются дополнительные переменные и функции. В поле ДОПОЛНИтЕЛЬНЫй КОд КЛаССа ОКНа Кпд ОбЪЕКта Ма1п ВВЕднтс СПЕцнфИКацнЮ двумерного целого массива поппе, в котором будем подсчитывать число живых соседей соответствуюших ячеек: 1пт [) [] сапог = пеи з.пт [н] [н] з Глава 8.
Примеры мс)делей, разрабо?аннык с использованием языка ./вуа 181 Будем считать, что наша решетка тороидальна, например, следующей справа ячейкой для граничной правой ячейки является самая левая ячейка того же ряда. Иными словами, л(обой индекс элемента массива понос, который выходит за границу размерности, берется по модулю н. Поскольку мы рассматриваем только ближайших окружаюших соседей, выход за границу размерности может быть только на [. Поэтому формально в торе пересчет значений любого индекса 1, который может принимать любое значение в диапазоне от -] до н, можно в вычислениях определить так: (' О)? н-1з (1==и)? О: з; ДЛя ОПрЕдЕЛЕНИя ЭТОГО ИНдЕКСа ВасднтЕ В ОЬЬЕКт На1п аЛГОрИтМИЧЕСКуЮ функцию СЯ, которую назовем согпв. Ее аргументом является один целый параметр 1. Функция возвращает целое значение, и ее тело определяется так: гепппз (з<0)? Н-1з (з.==и)? Оз з Теперь легко определить функцию, подсчитываюшую живых соседей каждой ячейки.
Назовем ее соппсл11?ене10ььогв. Функция эта без параметров, результатом ее работы является заполненный массив сопле числа живых СОСЕдсй Каждсй яЧЕйКИ, ПсдСЧИтаННЫй ПО МаССИВу а11?е ВСЕХ ЖИВЫХ ЯЧЕЕК. Эту функцизо удобно определить в поле Дополнительный код класса окна Код объекта ма1п. При записи программного кода используем комментарий — пояснявший текст, который начинается с двух символов слэш // и до конца строки: // Подсчет числа живых соседей вокруг каждой ячейки рпЬ11с уо10 соипоя11?еие10ЬЬогв() ( гол( 1пс 1=0з 1<из 1++ ) лог( 1пе З=ОЗ З<НЗ З++ ) ( соипс [з.] [1 ] = а11уе(1) [3 ] ? -1 зОз //-1, если сама ячейка живая гог( 1пп К=-1," Х<2з Х++ ) //соседи по вертикали бог( 1по ш=-1з ш<2з ше+ )//соседи по горизонтали сочло[1][З] += а11?е(Соков(1+)з)][соков(З+ш))? 1:Оз Функция сьапяеььасев определяет новые состояния ячеек решетки. Эта функция, собственно, реализует логику игры "Жизнь": // Определяем новые состояния ячеек решетки риЬ11с уо10 сиапяеавапев( ) ( Ьоо1еап спавшее = га1вез // Параметр определяет, будет ли //изменено состояние хотя бы у одной ячейки соиптл11чеие1сЬЬогв()з // сначала считаем живых соседей гог(1пс 1=0з 1<из 1++) //затем определяем новое состояние Часть!/.
Средства Апу[.одзс для имитационного моделирования систем Гог( 1пс 3=0( ]<из 3++ )// мертвая, имеющая 3 живых соседей, // оживает ье ( !а11че[11[31 Ы соиле[11[3] == 3] а11че[1][3]= с)запдеб = Езпез //живая, имеющая 2 или 3 живых соседей, не меняет состояния е1ве ьа (а11че[з ] [3 ] аа (соипс [з 1[3 1 ==2 ) ) соиле [1] [3 ) ==3) ) з // во всех остальных случаях ячейка умирает или остается мертвой е1ве ( 1т(а11не[11[З)) с)запдес)=зспез //была живая — учитываем а11че[11[31=га1вез ) //Останавливаем модель, если состояния всех ячеек не изменились 'т (!савичей) Епо1пе.т1пьз)з()з Работа модели состоит в том, что на каждом шаге по времени вычисляется новое состояние всей решетки.
Иными словами, на кюкдом таком шаге должна вызываться функция с)запяевеасев, только что определенная нами в поле Дополнительный код класса. Вызов этой функции на каждом временном шаге можно выполнить при срабатывании циклического таймера. В поле редактора корневого объекта наьп введите новый таймер (((.'з))), определите его циклическим с таймаутом 1.0 и в поле Действие при срабатывании этого таймера введите вызов функции с)запяевеаеев.
сйапдеясаеев()з После запуска модели в поле анимации из случайного начального состояния на каждом шаге будут порождаться разнообразные графические фигуры (рис. 8.2). СРавните свою модель с моделью ььгеса ез. Рис. 8.2. Одно из промежуточных осговний в игре "Жизнь" Глава 8. Лримеры моделей, разрабоганнык с использованием языка.lауа 163 8Л.5. Улучшение модели Для того чтобы модель приобрела законченный вид, можно залить поле анимации каким-либо цветом и в левую еп) часть добавить поясняющий текст.
Сделаем еше одно добавление в модель. На многих сайгах в Интернете обсужда(отся правила игры "Жизнь" и приводятся начальные состояния решетки, которые при проигрывании в соответствии с правилами порождают последовательность интересных осциллируюших фигур. Олним из примеров такого ресурса является сайт по математике: зу(в)у.п(ай).сош/в[в([евЬ/еопдегз/Мй/П[е.Ь(в[. Вставим в модель воэможность установки предопределенной фигуры в качестве начального состояния решетки. Для этого введем в левую половину поля анимации элемент Кнопка (Я), которую сделаем прозрачной (без заливки цветом). В поле Реакция иа событие окна свойств этой кнопки поместим следующие операторы: Гсг(1пс 1 = 0; 1<Н; 1гг) Еог(гпс б = 0~ З<ЬН 1+в) а11ее [1)[1] = Еа1зе," а11ее[22)[23) = Сгсе; а11ее[22)[24) = Егие; и т.
л. Рис. В.З. Визуализация игры "Жизнь" Часть //, Средства Апу/ од~одра имиициоииого моделирования систем Первый оператор — это вложенный цикл, он очищает решетку (устанавливает состояние всех ячеек поля анимации в га1ав). Далее несколько операторов устанавливают в схив состояния тех ячеек, которые составляют нужную нам фигуру. Для удобства пользователя в поле введенной кнопки можно эту фигуру изобразить с помощью закрашенных квадратиков (см. рис. 8.3), хотя, конечно, это изображение в нашей модели не связано с изменением состояния ячеек поля анимации. Таких фигур можно сделать несколько. Нажатие на эту кнопку (либо при остановленной, либо при работающей модели) приведет к выполнению связанного с кнопкой кода, в,результате чего в окне анимации в поле решетки установятся в истинное значение состояния только выбранных ячеек.
Сравните свою модель с моделью ьъгааап аа. 8.2. Модель "Сбор урожая" (Нагчез$) Подробный анализ этой модели весьма полезен. Так же, как и многие другие модели, которые анализируются в данном пособии, эта модель интересна не сама по себе: она интересна той техникой, которая использовалась при ее построении. В модели применены методологические приемы, которые могут быть использованы и при разработке других моделей. В частности, при построении этой модели использованы интересные методы абстрагирования, имеющие достаточную общность.
В модели есть дискретные и непрерывные процессы (например, движение объектов). Логика взаимодействия непрерывных и дискретных процессов с помощью событий и минимальных включений фрагментов программного кода в модель сделана компактной и выразительной.