首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >Clojure代理交互失败

Clojure代理交互失败
EN

Stack Overflow用户
提问于 2011-05-12 16:03:17
回答 2查看 373关注 0票数 1

想象一下:平面世界n*n个单元格。有移动的物体。它们可能会发生碰撞,根据流程,其中一个应该被摧毁。

我使用Rich Hickey蚁群中的思想将对象表示为智能体。因此,在冲突发生后,其中一个智能体在收到来自其他智能体的消息后必须停止工作。

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

代码语言:javascript
运行
复制
;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)

谢谢!

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2011-05-12 16:59:50

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

票数 2
EN

Stack Overflow用户

发布于 2011-05-12 16:50:33

我能问一下你在这里想要实现什么吗?

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

示例:

代码语言:javascript
运行
复制
(def a (agent 0))
(send-off a inc) ; -> #<Agent@29de03: 1>

因此,通过这样做:

代码语言:javascript
运行
复制
(defn f_do [x]
  (do
    ...
    (send-off *agent* f_do)))

您正在递归地返回代理内部的代理。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/5975060

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档