Структуры разреженного мира в Erlang

Я думаю о том, как владеть портом «симулятор фермы муравьев -» от Erlang. Вот основное изложение:

1 )Определите мир «слотов» 100x100

2 )Муравьи занимают один слот

3 )Колония муравьев занимает место 50,50

4 )Еда случайным образом размещается на карте.

5 )Муравьи перемещаются на одну клетку за раз, чтобы найти еду и принести ее в колонию.

6 )Только один объект может находиться в ячейке одновременно время.

Цель этой проблемы состоит в том, чтобы система работала как можно более параллельно. В Clojure вышеуказанная проблема решается наличием пула потоков агентов, каждый из которых запускает ИИ для одного муравья. Затем эти муравьи обновляют глобальное состояние через транзакцию.

Я продолжаю думать об этом глобальном состоянии. Как нам построить «игровой мир»?

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

1 )Муравей говорит, что это текущий слот «Я хочу переместиться на север»

2 )Слот вызывает слот на север и говорит: «Пожалуйста, обновите содержимое». to now содержит ant "pid""

3 )Если в северном слоте уже есть ant, он отправляет ответ "denied", который просачивается в слот, содержащий ant (, а затем к ant ). Если обновление работает, то «предоставлено» отправляется по цепочке, и муравей обновляет свое внутреннее состояние.

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

Может ли кто-нибудь предложить лучшее решение?

---РЕДАКТИРОВАТЬ----

Позвольте мне рассмотреть проблему взаимоблокировки:

1 )Ant 1 просит слот A "перенести север" на слот 2 2 )Муравей 2 просит слот B «переключиться на юг» на слот 1 3 )Слот 1 отправляет запрос на передачу в слот 2 и ожидает ответа 4 )Слот 2 отправляет запрос на передачу в слот 1 и ожидает ответа.

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

6
задан Timothy Baldridge 23 April 2012 в 19:23
поделиться