Я подумываю о том, как к порту собственности «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 из другого слота. Я полагаю, что «правильный путь» может заключаться в том, чтобы автоматически отклонять все запросы на передачу в процессе передачи.
Мне нравятся общие звуки вашего подхода и соглашайтесь с тем, что вы хотите избежать смертельных объятий. Возможно, вы могли бы решить свои смертельные объятия, добавив правило, что муравьи не могут поменять местами. Вместо этого они должны обходить друг друга, или, по крайней мере, один. То есть, нужно, чтобы муравьец перешел в соседнее пустое место. –
Почему запросы должны быть синхронными и блокируемыми? Вы можете отправить запрос, а затем сидеть и ждать сообщений, включая другие запросы и ответ на ваш запрос. – rvirding