Сбой взаимодействия агентов Clojure - PullRequest
1 голос
/ 12 мая 2011

Представьте себе: плоский мир 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)

Спасибо!

Ответы [ 2 ]

2 голосов
/ 12 мая 2011

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

1 голос
/ 12 мая 2011

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

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

Пример:

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

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

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

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

...