メンバへの落札内容の伝達方法やインスタンシエートに関するルールについて述べる。
全てのエージェント名が既知であり、同じリポジトリ上に存在しているものとする。
Sample110 |
Sample111
エージェント名 ファイル名 タスク 説明 Sample110 Sample110.dash manager マネージャ Sample111 Sample111.dash member メンバ
1 (agent Sample110
2
3 (property
4 (create :author "Maemur@CIT")
5 )
6
7 (initial_facts)
8
9 // 組織構成ルールセットの読み込み
10 (include :file Dash-Org.rset)
11
12 (knowledge
13 (rule cnp-activate
14 (Msg :performative __INIT_C)
15 -->
16 (activate (Dash-Org _default))
17 )
18
19 (rule show-my-name
20 (Status :name ?name)
21 -->
22 (print "エージェント名: " ?name)
23 )
24 )
25
26 // 組織構成のために追加するルール
27 (rule-set Dash-Org
28 (property)
29 (initial_facts)
30
31 // タスク実現可能性の判断(分割しない場合)
32 (rule task-check
33 (task-check :id ?id :task (task :name "manager"))
34 ~(bid :id ?id)
35 -->
36 (make (bid :id ?id :content (task :name "manamger")))
37 (make
38 (decompose :id ?id // 変更不可
39 :to "Sample111" // エージェント名
40 :env "null" // リポジトリ名
41 :wait 3000 // 入札待ちでタイムアウトするまでの時間
42 :wp "null" // インスタンシエート先のワークプレース名
43 :task (task :name "member")))
44 )
45
46 // インスタンシエート
47 (rule sample-instantiate
48 (init :name "null" :facts ()) = ?init
49 -->
50 // インスタンシエート先のワークプレース名.
51 (modify ?init:wp "w1:_localhost")
52
53 // インスタンシエート先で必要となるファクト.
54 (unshift ?init:award ?init:facts)
55 (unshift (URL :url "foo.example.jp") ?init:facts)
56
57 // インスタンシエートする前に必要な処理を記述.
58 )
59
60 // コントラクタ側に落札と一緒に必要な情報を送信.
61 // インスタンシエート後,かつコントラクタ側に落札を送信する前に発火.
62 (rule award-check
63 // ?award : 落札時にマネージャ側から受け取った情報(型に制限はない)
64 (init :id ?id :award ?award) = ?init
65 (!= ?init:name "null")
66 (!= ?init:name "FALSE")
67 ~(award :id ?id)
68 -->
69 // :name (task :name XXX ...)と対応付ける必要がある.
70 // :content に必要な情報をリスト形式で記述する.
71 (make (award :id ?id
:name "member"
:content ((URL :url "bar.sample.jp"))))
72 )
73 )
74 )
|
| 51: | ここに記述したワークプレース名がインスタンシエート先として優先度が最も高く、固定される。 マネージャ側から指定したい場合は記述しない。 詳しくは、(5)組織構成のための知識記述を参照。 |
| 54: | (init)ファクトの:award 属性には、マネージャ側から渡された落札内容が格納されている。 |
| 55: | また、複数追加したい場合は、必要な分だけ unshift する。 |
| 71: | タスクを複数に分割していた場合は、同ルール内で必要なサブタスクに対してのみ (award)ファクトを生成する。必要無ければ生成しなくてよい。 |
1 (agent Sample111 2 3 (property 4 (create :author "Maemur@CIT") 5 ) 6 7 (initial_facts) 8 9 // 組織構成ルールセットの読み込み 10 (include :file Dash-Org.rset) 11 12 (knowledge 13 (rule cnp-activate 14 (Msg :performative __INIT_C) 15 --> 16 (activate (Dash-Org _default)) 17 ) 18 19 (rule show-my-name 20 (Status :name ?name) 21 --> 22 (print "エージェント名: " ?name) 23 ) 24 ) 25 26 // 組織構成のために追加するルール 27 (rule-set Dash-Org 28 (property) 29 (initial_facts) 30 31 // タスク実現可能性の判断(分割しない場合) 32 (rule task-check 33 (task-check :id ?id :task (task :name "member")) 34 ~(bid :id ?id) 35 --> 36 (make (bid :id ?id :content (task :name "member"))) 37 ) 38 ) 39 ) |
●準備
●起動
- クイックスタートに目を通しておくこと。
- クイックスタートの手順(3)に利用するホスト名を調べる方法があるので確認しておく。
●何が起きるか?
- リポジトリとワークプレースを起動する。 起動すると環境モニタが表示される。
- リポジトリ上にエージェントが存在しない場合、 環境モニタのメニューから [File] > [Open] を使って、 (2)のエージェントを開く。
- ACLエディタを使って、直接落札(directed-award)をCnpManagerに送信する。
:performative
directed-award :to
CnpManager :content
(request :to Sample110 :content (task :name manager))
Send
- 「CnpManager」から「Sample110」に対して直接落札が送信された後、 (2.1)で記述した分割内容に従って、「Sample111」に対して直接落札が送信される。 落札(award)メッセージを受信したエージェントから順にインスタンシエートされる。
- 一定時間経過後、「CnpManager」から「Sample110」に対して落札(award)が送信される。
- ワークプレースに、エージェントが2つ生成され、以下のメッセージが表示される。
1 2 hostname = _localhost 3 dvmname = r1:_localhost 4 hostname = _localhost 5 dvmname = w1:_localhost 6 エージェント名: Sample090 7 エージェント名: Sample091 8 エージェント名: Sample092 9 エージェント名: Sample093 10 エージェント名: Sample094 11 エージェント名: Sample100 12 エージェント名: Sample101 13 エージェント名: Sample102 14 エージェント名: Sample103 15 エージェント名: Sample104 16 エージェント名: Sample110 17 エージェント名: Sample111 18 エージェント名: Sample110.200211271243229:w1:_localhost 19 エージェント名: Sample111.200211271243274:w1:_localhost 20 From: [CnpManager] Message: [インスタンシエートに成功しました。] 21※生成時刻やホスト名は環境によって異なるので、上記の出力例とは同じにならない場合がある。
16,17: リポジトリに読み込まれたエージェントが出力したメッセージ。 18,19: ワークプレースに生成されたエージェントが出力したメッセージ。
- 生成されたエージェントのインスペクタを開くと、それぞれ(2.1),(2.2)において記述したファクトが 生成されているのがわかる。
□ Sample110.200211271243229:w1:_localhost File Edit Fact Engine - □ non-stop Action
RuleSet
_default
Dash-Org
RuleList
Sample110.dash
(agent Sample110
WorkingMemory
(Rule-set :active (_default) :not-active (Dash-Org) :all (_default Dash-Org))
(RWP :url r1:_localhost) ← CnpManagerから渡されたファクト
(URL :url foo.example.jp) ← 55行目で追加したファクト
(Members :manager _interface :contractor ())
(Msg :performative __INIT_I :content (INIT))
...
output
Variables
waiting...
□ Sample111.200211281401234:w1:_localhost File Edit Fact Engine - □ non-stop Action
RuleSet
_default
Dash-Org
RuleList
Sample111.dash
(agent Sample111
WorkingMemory
(Rule-set :active (_default) :not-active (Dash-Org) :all (_default Dash-Org))
(URL :url bar.sample.jp)
Sample110.dashの71行目で追加したファクト
(Members :manager Sample110.200211281401220:w1:_localhost :contractor ())
マネージャ名は、依頼元のワークプレース上での名前
(Msg :performative __INIT_I :content (INIT))
...
output
Variables
waiting...
(5.1)インスタンシエートに関するルール ( (2.1)Sample110の46〜58行目 )
このルールは、落札メッセージの受信後にインスタンシエートする前に発火するルールである。 次に示す3点について必要であれば記述し、特になければルールを省略できる。
(modify ?init:wp ワークプレース名)
(unshift ファクト ?init:facts)
| 優先度 | 記述箇所 | :wp(※) | 説明 |
|---|---|---|---|
| 高 | インスタンシエートルール内 | (無効) | メンバ側エージェントのインスタンシエートルールの中でワークプレース名が 指定されていた場合、インスタンシエートは常に固定となり、最優先される。 |
| ↑ ↓ |
(decompose)ファクト | ワークプレース名 | マネージャ側から指定されたワークプレースにインスタンシエートされる。 (decompose)ファクトで記述したワークプレース名がこれに該当する。 |
| 低 | (decompose)ファクト | null | (decompse)ファクト内で指定しなかった場合、上位のマネージャから指定されたワークプレースに インスタンシエートされる。 |
指定したワークプレースが存在しない等の理由によりインスタンシエートに失敗した場合、上位のエージェントに対してエラーメッセージを送信する。また、動作可能(accpetance)メッセージのエージェントリストには、リポジトリにおけるエージェント名が代入される。(→ 組織構成プロトコルのエラーメッセージ)
このルールは、インスタンシエートに成功し、メンバとなっているエージェントに対して落札(award)メッセージを送信する前に発火する。メンバ側に伝えたい情報があれば、リスト形式にして内容(:content)属性に格納する。メンバ側では、インスタンシエート時に (init)ファクトの落札(:award)属性から利用することができる。
1 (rule award-check 2 (init :id ?id :award ?award) = ?init 3 (!= ?init:name "null") 4 (!= ?init:name "FALSE") 5 --> 6 (make (award :id ?id :name "tv-conf" :content ())) 7 )
2: ?award は、落札(award)メッセージと共にマネージャ側から受け取った落札内容。 3,4: ?init:name は、機能名ではなくエージェント名が以下のように格納される。
- インスタンシエート前 → null
- インスタンシエートに成功 → ワークプレース上のエージェント名
- インスタンシエートに失敗 → FALSE
6: :name は、該当する機能名を記述し、:content には、必要な情報を記述する。