Clojure代理交互失败
想象:平面世界n*n个单元。有移动的物体。它们可以碰撞,根据过程,其中一个应该被摧毁 我使用Rich Hickey蚁群的思想将对象表示为代理。所以在碰撞之后,一个代理必须在接收到来自另一个代理的消息后停止工作 有一个代码片段可以说明我的问题:第二个代理意外停止Clojure代理交互失败,clojure,agent,Clojure,Agent,想象:平面世界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
;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)
谢谢大家! 我可以问一下你在这里想做什么吗 在我的实验中,第一个和第二个代理都失败了,这是因为你基本上是把代理放在代理里面,代理里面 例如:
(def a (agent 0))
(send-off a inc) ; -> #<Agent@29de03: 1>
您在代理中递归返回代理。您发送了一个调用
nil
函数的请求。他确实这样做了,通过抛出一个异常,他进入了一个崩溃的状态。然后,你让他再打一次nil
。但他甚至不能同意这样做,因为他已经筋疲力尽,正在等待有人来修理他。因此,s_-guy
正在等待f_-guy
确认(不一定执行)请求,而f_-guy
已经打卡下班了。我将尝试解释一下。就像Rich Hickey的蚁群一样,我有一个2d世界,里面有移动的物体。我想演示碰撞,一旦对象被表示为代理-要杀死对象,我必须停止代理,我向他发送nil消息。蚁群演示非常古老(大约三年)。让代理自己发送动作来模拟重复动作并不是最好的解决方案。实际上,您不应该将对象表示为“代理”,而应该使用代理(或其他东西)来管理对象不断变化的状态。你需要一个更好的模型来协调不同对象之间的状态,而不是发送一个代理nil
(这确实会让他崩溃和烧坏,对他来说非常“粗鲁”),谢谢!我试过两次(发送f_guy nil),结果显示java.lang.RuntimeException。
(defn f_do [x]
(do
...
(send-off *agent* f_do)))