想象一下:平面世界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)
谢谢!
发布于 2011-05-12 16:59:50
您向f_guy
发送了一个将nil
作为函数调用的请求。他这样做了,这让他抛出了一个异常,进入了一个崩溃的状态。然后,你让他再给nil
打电话。但他甚至不能同意这样做,因为他已经崩溃了,正在等待有人来修复他。因此,s_guy
在等待f_guy
确认(还不一定要执行)请求,而f_guy
已经结束了一天的工作。
发布于 2011-05-12 16:50:33
我能问一下你在这里想要实现什么吗?
在我的实验中,第一个和第二个代理都失败了,这是因为你基本上是把代理放在代理里面……
示例:
(def a (agent 0))
(send-off a inc) ; -> #<Agent@29de03: 1>
因此,通过这样做:
(defn f_do [x]
(do
...
(send-off *agent* f_do)))
您正在递归地返回代理内部的代理。
https://stackoverflow.com/questions/5975060
复制相似问题