Чтобы визуально проследить изменение состояний всех стрелков со временем, удобно через каждую единицу модельного времени выводить состояния всей цепочки стрелков, Генерала слева и Сержанта справа. Самое простое -это выводить в журнал строку состояний объектов. Состояния всех объектов находятся в их переменных mystate символьного типа. Именно это делается последовательностью функций trace, указанных в поле Действие при сраба тывании таймера drawStates.
Для более наглядной анимации поведения системы требуются чуть более сложные операции, которые выполняются здесь же при вызове функции updateAnimation. Если состояние хотя бы одного из объектов — заключительное, выполнение модели останавливается — вызывается функция
Engine.stop.
Анимация модели
Анимация поведения цепи стрелков в модели показывается для каждого момента модельного времени как последовательность состояний объектов, представленных прямоугольниками. Каждому состоянию соответствует свой цвет прямоугольника.
Каждую новую линейку состояний объектов системы рисует функция updateAnimation, вызываемая на каждом такте модельного времени при срабатывании таймера drawStates в объекте Root. Функция updateAnimation определена в поле Дополнительный код класса активного объекта Root. При каждом обращении к ней она добавляет в новую строку в анимацию прямоугольники, соответствующие каждому объекту. Ширина каждой строки 10. Координата У очередной строки возрастает с увеличением времени: int у = 10 * (int)getTimeO;
Поэтому строки, соответствующие последующим шагам, будут располагаться одна под другой. В каждой строке сначала создается прямоугольник размером 10x10, соответствующий Генералу, затем в цикле создаются n прямоугольников для стрелков и последним — для Сержанта. Прямоугольники создаются вызовом функции createRect(int x, int у, Color color)
которая использует конструктор shapeRect класса shapeRect для формирования нового прямоугольника. После вызова этой функции устанавливаются
координаты и цвет заливки каждого прямоугольника. Цвет определяется функцией currentcolor (), вызываемой у соответствующего объекта. Эта функция определена в поле Дополнительный код класса у активных объектов General, sergeant и Soldier и возвращает цвет, соответствующий текущему состоянию активного объекта.
Упражнения с моделью
Читатель может представить анимацию последовательных состояний цепочки стрелков в другой, более наглядной форме. Например, для каждого состояния можно использовать свое изображение. Другое упражнение состоит в исследовании иных алгоритмов поведения стрелков. Реализованный в нашей модели алгоритм посылает по цепи стрелков кроме основной волны только одну волну сигналов, двигающуюся со скоростью в три раза медленнее основной. Однако можно послать несколько подобных волн, в результате чего все автоматы могут быстрее прийти в заключительное состояние (рис. 20.3).
Читателю предлагается разработать свой алгоритм стрелка, имеющий либо меньшее число состояний, либо работающий быстрее. Алгоритмов, решающих эту проблему, можно построить множество, они могут отличаться как по числу состояний стрелков, так и по времени, которое требуется для приведения из начального в заключительное состояние одновременно всей цепочки из N стрелков. Очевидно, что число шагов, которое требуется для перехода всех стрелков в заключительное состояние, зависит от длины цепочки, но оно не может быть меньшим, чем 2N-2.
Различные решения проблемы, т. е. спецификации различных графов переходов автоматов, представляющих поведение одного стрелка, можно найти в Интернете на многих сайтах по ключевым словам "Firing Squad Problem".
20.7. Модель Heat Bugs (Тепловые жуки)
Heat Bugs (Тепловые жуки) — это простая модель коллективного поведения, впервые разработанная в пакете агентного моделирования Swarm. В дискретной тороидальной среде, состоящей из ячеек, двигаются несколько жуков, которые выделяют тепло. Тепло распространяется в среде. Каждый жук имеет свою собственную "идеальную" температуру, в которой он предпочитает находиться, и имеет сенсор, с помощью которого он может определить, в каком направлении температура среды ближе к его "идеальной" температуре. Это позволяет жуку найти направление, в котором он должен двигаться в среде, чтобы достигнуть ячейки с устраивающей его температурой. Среда имеет следующие характеристики:
- тепло распространяется равномерно во всех направлениях со скоростью, пропорциональной разнице температур в соседних ячейках;
- тепло "испаряется" (уменьшается) в каждой ячейке пропорционально теплу, которым обладает ячейка.
Система является динамической и сложно предсказуемой, поскольку даже находясь в ячейке с его "идеальной" температурой, жук нагревает ее, выде-ляя тепло, поэтому он со временем может из этой клетки направиться в бо-лee комфортную для него ячейку. Кроме того, жук может поступать и нерационально: он может направиться не напрямую к области, наиболее близкой к его "идеальной" температуре.
С этой простой моделью могут быть проведены интересные эксперименты, демонстрирующие, как изменение простых параметров (например, интен-сивность распространения тепла, фактор "иррациональности" поведения жука и т. п.) влияет на результирующее изменение всего глобального пове-дения коллектива объектов.