1

想像してみてください:フラットワールドn*nセル。動く物体があります。それらは衝突する可能性があり、プロセスに従って、そのうちの1つを破壊する必要があります。

リッチヒッキーのアリの巣のアイデアを使って、オブジェクトをエージェントとして表現しています。したがって、衝突後、エージェントの1人は、他のエージェントからメッセージを受信した後、作業を​​停止する必要があります。

私の問題を説明するコードスニペットがあります。2番目のエージェントが予期せず停止します。

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

于 2011-05-12T08:59:49.547 に答える
1

ここで何を達成しようとしているのかお聞きしてもよろしいですか?

最初のエージェントと 2 番目のエージェントの両方が私の実験で失敗します。これは、基本的にエージェントをエージェント内のエージェント内に配置しているためです...

例:

(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 に答える