2012-04-23 2 views
6

Я подумываю о том, как к порту собственности «ant-farm simulator» от Erlang. Вот основная изношенном:Редкие мировые структуры в Эрланге

1) Определить 100x100 мир "слоты"

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

3) Муравей колония занимает место, 50,50

4) Продукты питания размещается случайно по карте

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

6) только один объект может быть в слоте за раз.

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

Это глобальное состояние, о котором я все время думаю. Как мы строим «игровой мир»?

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

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

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

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

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

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

--- EDIT ----

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

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

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

+0

Мне нравятся общие звуки вашего подхода и соглашайтесь с тем, что вы хотите избежать смертельных объятий. Возможно, вы могли бы решить свои смертельные объятия, добавив правило, что муравьи не могут поменять местами. Вместо этого они должны обходить друг друга, или, по крайней мере, один. То есть, нужно, чтобы муравьец перешел в соседнее пустое место. –

+0

Почему запросы должны быть синхронными и блокируемыми? Вы можете отправить запрос, а затем сидеть и ждать сообщений, включая другие запросы и ответ на ваш запрос. – rvirding

ответ

1

Попросите вашего муравья сделать бросок в слот, к которому он движется, прося разрешения на переезд. Затем муравь ждет ответа от листка, сообщив ему, было ли движение успешным или нет. Если ход был успешным, муравей обновляет свое собственное состояние, чтобы указать, что он находится в новом слоте. Если это не удается, он снова выполняет свою поисковую логику. Если вы закончите с A и B, пытающимися обменять слоты, у вас не будет тупика, но они оба подумают, что им нужно искать другие варианты.

Если ваша сетка сильно занята, вам может потребоваться, чтобы слоты выполняли логику опроса, передавая разрешение соседним муравьям, сообщая им, что если их логика приведет их туда, они могут войти. (Представьте себе сетку с 50x50-2 муравьями на него, и вы поймете, почему это было бы хорошее изменение логики.)

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

0

Я предполагаю, что, когда он не спустится на север, он попробует другое направление дальше? Где же тупик?

Я могу представить себе голод, если поле довольно многолюдно, но не взаимоблокировки.

+0

Я обновил op –

Смежные вопросы