среда, 27 мая 2009 г.

Искусственная жизнь: Архитектура. Часть 1.

Про искусственную жизнь писалось уже довольно много и есть достаточное количество реализованных моделей. Но на мой взгляд они все уже достаточно старые и их подход не совсем удобен при разработке новых систем (хотя возможно я просто пока не нашел свежих реализаций). Порывшись в интернете и почитав разных статей на эту и смежные темы я представил себе как должна выглядеть современная модель.
Немного терминологии:
  • Объект — любая сущность в Мире.
  • Агент — объект, который может принимать решения и действовать в соответствии с принятыми решениями. Собственно вся Искусственная жизнь строится для исследования поведения агентов.
  • Представление — то, как видят/слышат/чувствуют объекты агенты.

Остальное вроде довольно стандартно и можно найти в интернете.
И так, начнем.
Мир.
Для упрощения интеграции новых моделей и поддержки существующих, мир должен быть отделим от агентов. Так же агенты должны знать о мире как можно меньше. Т.е. они не должны знать где они находятся (точные координаты), а должны только знать, что они видят. Мир имеет интерфейс, при помощи которого агенты получают всю необходимую им информацию (что видят/слышат и т.п.). Но мир об агентах тоже много знать не должен, поэтому агенты должны сами предоставлять миру интерфейс: видимый объект, слышимый объект. При помощи этого интерфейса и знания о место положении агента, мир, по требованию агента, выдает ему результаты работы методов тех объектов, которые находятся в определенном радиусе от данного агента. Таким образом миру все равно кого видит/слышит данный агент. Агент сам решает, что ему делать, не завязываясь на свои координаты и координаты других агентов/объектов. Также мир может говорить агенту о сложности доступа до каждого из видимых объектов, но этот параметр приблизителен.
Таким образом получим следующее разделение на зоны «влияния»:

За качество иллюстрации не бить — пока рисовать не умею).
Т.е. за принятие решения о дальнейших действиях отвечает агент. Затем мир реализует это действие (перемещение, атака, сбор и т.п.). Потом обновляет представление данного агента о мире и передает его агенту, который в свою очередь обновляет свое состояние, в зависимости от окружающей обстановки и снова решает, что же ему делать...
Представление об окружающем мире строится не только на основе видимых объектов, но и слышимых, таким образом агент может услышать непонятный грохот, насторожиться, пойти на шум и увидеть там водопад. А может сразу испугаться и убежать.
Эти представления можно описать битовыми наборами, где каждый бит описывает какое-то свойство видимого/слышимого объекта (или часть свойства). Также каждому биту приписан уровень важности. Т.е. при сравнении 2 представлений, если они различаются в одном бите, то степень совпадения этих представлений будет зависеть от величины уровня важности для этого бита (про запоминание представлений будет рассказано позже).
Такой способ описания представлений хорош тем, что упрощается сравнение 2 представлений между собой, но становится очень тяжело описывать объекты, если их достаточно много и они разнообразны.
Описание представлений при помощи классов упрощает описание объектов, но таким образом мы как бы подсказываем агентам, какой объект они видят, что не есть хорошо.
Также можно ввести несколько степеней детализации. Например в темноте или на больших расстояниях использовать слабую степень детализации представления, а при приближении — увеличивать детализацию. Это можно сделать, например выбором самых важных битов из представления.
Еще стоит разделить представление на постоянную составляющую, и временную. Например размер агента — постоянная составляющая. А то, что он бежит к вам со всех ног — временная. Таким образом легче определять намерения агента и его возможные действия. Да и лишние данные можно будет не запоминать.
Такая система хорошо ложится в MVC, потому как достаточно сложно соединить воедино модель и ее представление. А контроллер изначально вынесен за модель (на рисунке по сути и указан контроллер).
Также эта система легко распараллеливается. Создаем один поток на мир и несколько на агентов. «Мировой» поток работает только в своей зоне, т.е. реализует действия агентов и обновляет их представление мира. А потоки для агентов — принимают решения, что является одной из самых трудоемких задач. Также можно разделить мировой поток на 2: один реализует действия агентов, другой обновляет их представления. Однако здесь становится сложнее их синхронизировать.
Получилось достаточно много, так что про архитектуру агентов, организацию их памяти, способа принятия решений, их взаимодействии с миром — напишу позже.

Комментариев нет: