Сбой взаимодействия агентов Clojure

Представьте: плоский мир n*n клеток. Есть движущиеся объекты. Они могут столкнуться, и согласно процессу один из них должен быть уничтожен.

Я использую идеи из муравьиной колонии Рича Хикки для представления объектов как агентов. Таким образом, после столкновения один из агентов должен прекратить свою работу после получения сообщения от другого агента.

Вот фрагмент кода, иллюстрирующий мою проблему: второй агент неожиданно останавливается.

;agents
(def f_guy (agent nil))

(def s_guy (agent nil))

;functions for agents
(defn f_do [x]
  (do
    (Thread/sleep 20)
    (println "f")
    (send-off *agent* f_do)))

(defn s_do [x]
  (do
    (Thread/sleep 40)
    (println "s")
    (send-off f_guy nil)
    (send-off *agent* s_do)))

;the process
(defn start []
  (do
    (send-off f_guy f_do)
    (send-off s_guy s_do)))

;go
(start)

Спасибо!


person Fedor Rusak    schedule 12.05.2011    source источник


Ответы (2)


Вы отправили f_guy запрос на вызов nil в качестве функции. Он это сделал, и это привело его в неисправное состояние, вызвав исключение. Затем вы просите его снова позвонить nil. Но он даже на это не может согласиться, потому что он сломан и ждет, что кто-то его починит. Итак, s_guy слоняется без дела, ожидая, пока f_guy подтвердит (еще не обязательно выполнит) запрос, а f_guy отработал весь день.

person amalloy    schedule 12.05.2011
comment
Спасибо! Я дважды пытался (отправить f_guy nil), и он показал мне java.lang.RuntimeException. - person Fedor Rusak; 12.05.2011

Могу я спросить, чего вы пытаетесь достичь здесь?

И первый, и второй агент терпят неудачу в моих экспериментах, потому что вы в основном помещаете агентов внутри агентов внутри агентов...

Пример:

(def a (agent 0))
(send-off a inc) ; -> #<Agent@29de03: 1>

Итак, сделав это:

(defn f_do [x]
  (do
    ...
    (send-off *agent* f_do)))

Вы рекурсивно возвращаете агентов внутри агентов.

person ponzao    schedule 12.05.2011
comment
Я попытаюсь объяснить. Как и в муравьиной колонии Рича Хики, у меня есть двухмерный мир и движущиеся объекты в нем. Я хочу оценить коллизии, и как только объекты будут представлены как агенты - чтобы убить объект, я должен остановить агента, и я делаю это, отправляя ему nil-сообщение. - person Fedor Rusak; 12.05.2011
comment
Демонстрация муравьиной колонии очень старая (около трех лет). Агенты отправляют себе действия для имитации повторяющихся действий — не лучшее решение. На самом деле вы не должны представлять объект в виде агентов, а скорее использовать агентов (или что-то еще) для управления изменяющимися состояниями ваших объектов. Вместо того, чтобы посылать агента nil (что, на самом деле, заставляет его падать и гореть, и очень грубо по отношению к нему), вам нужна лучшая модель того, как вы координируете состояние между различными объектами. - person amalloy; 12.05.2011