1

想象一下:平坦的世界 n*n 个细胞。有移动的物体。它们可以碰撞,根据过程,其中一个应该被销毁。

我正在使用来自 Rich Hickey 蚁群的想法将对象表示为代理。因此,在碰撞后,代理之一必须在收到其他代理的消息后停止工作。

有一个代码片段可以说明我的问题:第二个代理意外停止。

;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)

谢谢!

4

2 回答 2

2

您发送了作为函数f_guy调用的请求。nil他做到了,这让他通过抛出异常进入了一个破碎的状态。然后,你让他再打电话nil。但他甚至不能同意这样做,因为他已经崩溃了,等待着有人来修复他。因此s_guy,正在等待f_guy确认(不一定执行)请求,并且f_guy已经结束了这一天。

于 2011-05-12T08:59:49.547 回答
1

请问你想在这里完成什么?

第一个和第二个代理在我的实验中都失败了,这是因为你基本上是把代理放在代理里面......

例子:

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

所以通过这样做:

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

您在代理内递归地返回代理。

于 2011-05-12T08:50:33.373 回答