Поведение муравьиных колоний с использованием генетического программирования - PullRequest
1 голос
/ 03 октября 2011

Я смотрю на эволюционирующих муравьев, способных к пище, используя генетическое программирование, как описано Козой здесь . Каждый раз, когда я делаю шаг, я проверяю каждого муравья, выполняя его компьютерную программу (одна и та же программа используется всеми муравьями в колонии). В настоящее время я определил простые инструкции, такие как MOVE-ONE-STEP, TURN-LEFT, TURN-RIGHT и т. Д. Но у меня также есть функция PROGN, которая последовательно выполняет аргументы. Проблема, с которой я сталкиваюсь, заключается в том, что, поскольку PROGN может выполнять инструкции последовательно, это означает, что муравей может выполнять несколько действий за один временной шаг. В отличие от природы, я не могу запустить муравьев параллельно, то есть один муравей может пойти и выполнить несколько действий, манипулируя окружением, пока все остальные муравьи ждут своей очереди.

Мне просто интересно, это как обычно, или есть лучший способ? Коза, кажется, ничего не упоминает об этом. Дело в том, что я хочу расширить сценарий, чтобы иметь других агентов (например, врагов), которые могут полагаться на вещи, происходящие только один раз за один временной шаг.

Ответы [ 3 ]

2 голосов
/ 03 октября 2011

Я не знаком с работой Козы, но я думаю, что разумный подход - дать каждому муравью собственную очередь инструкций, которая сохраняется через временные шаги. Делая это, вы можете заставить муравьев выполнять PROGN функции по одной инструкции за шаг по времени. Например, логика высокого уровня для временного шага муравья может быть:

Do-Time-Step(ant):
1. if ant.Q is empty:  // then put the next instruction(s) into the queue
2.     instructions <- ant.Get-Next-Instructions()
3.     for instruction in instructions:
4.         ant.Q.enqueue(instruction)
5.     end for
6. end if
7. instruction <- ant.Q.dequeue()  // get the next instruction in the queue
8. ant.execute(instruction)        // have that ant do its job
0 голосов
/ 11 декабря 2011

Все зависит от вашей конкретной реализации GP.

В моем ядре GP программы оцениваются либо повторно, либо параллельно - в целом, то есть «атомарная» операция в этом сценарии является оценкой одной программы.Таким образом, все люди в группе повторяются n раз последовательно перед оценкой следующей программы, или все люди выполняются только один раз, а затем снова n раз.

У меня были довольно хорошие результаты с виртуальными агентами, использующими этот уровеньпараллелизм.Определенно можно разбить его еще больше, однако в этот момент вы уменьшите масштабируемость вашего алгоритма:

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

Учитывая быстро растущее число процессоров / ядер в современных системах (даже смартфонах) и «CPU-Голод «ГП», возможно, вы захотите переосмыслить свой подход - действительно ли вы хотите включить в свои команды инструкции по перемещению / повороту?

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

  1. оценка программ (параллельно)
  2. выполнение моделирования
  3. повторить n раз
  4. оценить пригодность, отбор, ...

Приветствия, Джей

0 голосов
/ 05 октября 2011

Другим аналогичным подходом к инструкциям организации очередей будет предварительная обработка набора команд для расширения экземпляров PROGN до набора команд компонента. Это должно быть сделано рекурсивно, если вы позволите PROGN вызывать другие PROGN. Недостатком является то, что программы-кандидаты немного раздуты, но это только во время выполнения. С другой стороны, его легко, быстро и довольно легко отлаживать.

Пример: Скажите PROGN1 = {inst-p1 inst-p2}

Тогда программа-кандидат запускается как {inst1 PROGN1 inst2} и будет расширена до {inst1 inst-p1 inst-p2 inst2}, когда она будет готова для оценки в моделировании.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...