タスク通知メッセージ(task-announcement)のみを用いたエージェント組織の構成方法について述べる。
全てのエージェント名が既知であり、同じリポジトリ上に存在しているものとする。
Sample100 |
Sample101
Sample102
Sample103
Sample104
エージェント名と記述されている情報について エージェント名 ファイル名 タスク 説明 機能名(:name) 登録数(:num) 更新日(:LastModified) Sample100 Sample100.dash TownGuide マネージャ Sample101 Sample101.dash ShopInfo 50 2001/12/31 メンバ1 Sample102 Sample102.dash ShopInfo 40 2002/10/31 メンバ2 Sample103 Sample103.dash ShopInfo 15 2000/04/12 メンバ3 Sample104 Sample104.dash CarInfo 80 2002/11/01 メンバ4
1 (agent Sample100
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 decompose-check
33 (task-check :id ?id :task (task :name "TownGuide"))
34 ~(bid :id ?id)
35 -->
36 (make (bid :id ?id :content (task :name "TownGuide")))
37 (make
38 (decompose :id ?id // 変更不可
39 :to _broadcast // エージェント名
40 :env "null" // リポジトリ名
41 :wait 10000 // 入札待ちでタイムアウトするまでの時間
42 :wp "null" // インスタンシエート先のワークプレース名
43 :task (task :name "ShopInfo" :num 30)))
44 )
45
46 // 「ShopInfo」に関する入札の選択
47 // 30店舗以上登録されていて更新日が最も新しいものを落札
48 (rule bid-check
49 (award-check :award "null") = ?ac
50 (bid-check :id ?ac:id :bid
(task :name "ShopInfo" :LastModified ?date) :no ?no)
51 ~(bid-check :id ?ac:id :bid
(task :name "ShopInfo" :LastModified > ?date))
52 -->
53 (modify ?ac:award ?no)
54 )
55 )
56 )
|
| 33, 36: | 「ShopInfo」が機能名に相当する。 |
| 39: | タスク通知(task-announcement)を行う場合は、値を「_broadcast」にする。 |
| 38〜43: | decompose知識。詳細は、(5)組織構成のための知識記述を参照。 |
| 50,51: | HTML上では改行されているが、dashファイル内では1行で記述されている。 |
1 (agent Sample101
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 "ShopInfo" :num < 51))
34 ~(bid :id ?id)
35 -->
36 (make (bid :id ?id :content
(task :name "ShopInfo" :num 50 :LastModified 20011231)))
37 )
38 )
39 )
|
| 33: | 登録数が50以下なら、入札を返す場合の記述。 |
●準備
●起動
- クイックスタートに目を通しておくこと。
- クイックスタートの手順(3)に利用するホスト名を調べる方法があるので確認しておく。
●何が起きるか?
- リポジトリとワークプレースを起動する。 起動すると環境モニタが表示される。
- リポジトリ上にエージェントが存在しない場合、 環境モニタのメニューから [File] > [Open] を使って、 (2)のエージェントを開く。
- ACLエディタを使って、タスク通知(task-announcement)をCnpManagerに送信する。
:performative
task-announcement :to
CnpManager :content
(request :to Sample100 :content (task :name TownGuide))
Send
- 「CnpManager」から「Sample100」に対してタスク通知が送信された後、 (2)で記述した分割内容に従って、「Sample100」を除く全てエージェントにタスク通知が送信される。
- 各エージェント内で記述した条件従って、入札の可否が判断される。
- CnpManager -> 自分宛の依頼ではないので破棄される。
- Sample101 -> 条件(登録数)を満たしているので入札(bid)メッセージを送信する。
- Sample102 -> 条件(登録数)を満たしているので入札メッセージを送信する。
- Sample103 -> 登録数が条件に満たないので入札を行わない。
- Sample104 -> 登録数や更新日の条件は最もよいが、機能名(:name)が異なるので入札を行わない。
- それ以外 -> 機能名が異なるので破棄される。
- 一定時間が経過した後、最もよい条件を提示してきた「Sample102」に対して落札(award)メッセージを送信する。
- ワークプレースにエージェントが2つ生成され、logタブかコンソールに18,19行目のメッセージが表示される。
- 「Sample102」->「Sample100」->「CnpManager」の順に動作可能(acceptance)メッセージが送信され、20行目が出力される。
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 エージェント名: Sample100.200211262117071:w1:_localhost 19 エージェント名: Sample102.200211262117079:w1:_localhost 20 From: [CnpManager] Message: [インスタンシエートに成功しました。] 21※生成時刻やホスト名は環境によって異なるので、上記の出力例とは同じにならない場合がある。
11〜15: リポジトリに読み込まれたエージェントが出力したメッセージ。 18,19: ワークプレースに生成されたエージェントが出力したメッセージ。
(rule bid-check
(award-check :award "null") = ?ac
(bid-check :id ?ac:id :bid (task :name "tv-conf" :framerate ?f) :no ?no)
~(bid-check :id ?ac:id :bid (task :name "tv-conf" :framerate > ?f))
-->
(modify ?ac:award ?no)) |