例題10 タスク通知による組織構成

  • 概要
  • エージェント
  • 起動方法
  • 用語
  • 組織構成のための知識記述
  • 初期ファクト

  • (1)概要

    タスク通知メッセージ(task-announcement)のみを用いたエージェント組織の構成方法について述べる。

    (2)エージェント

    全てのエージェント名が既知であり、同じリポジトリ上に存在しているものとする。

       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

    (2.1)Sample100

       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行で記述されている。

    (2.2)Sample101

       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以下なら、入札を返す場合の記述。
    ※「Sample102.dash」から「Sample104.dash」は、上記の表に従ってエージェント名と機能名を変更しただけなので省略する。

    (3)起動方法

    ●準備
    ●起動
    1. リポジトリとワークプレースを起動する。 起動すると環境モニタが表示される。
    2. リポジトリ上にエージェントが存在しない場合、 環境モニタのメニューから [File] > [Open] を使って、 (2)のエージェントを開く。
    3. ACLエディタを使って、タスク通知(task-announcement)をCnpManagerに送信する。

      :performative
      task-announcement
      :to
      CnpManager
      :content
      (request :to Sample100 :content (task :name TownGuide))
        Send  
    ●何が起きるか?
    1. 「CnpManager」から「Sample100」に対してタスク通知が送信された後、 (2)で記述した分割内容に従って、「Sample100」を除く全てエージェントにタスク通知が送信される。
    2. 各エージェント内で記述した条件従って、入札の可否が判断される。
      • CnpManager -> 自分宛の依頼ではないので破棄される。
      • Sample101 -> 条件(登録数)を満たしているので入札(bid)メッセージを送信する。
      • Sample102 -> 条件(登録数)を満たしているので入札メッセージを送信する。
      • Sample103 -> 登録数が条件に満たないので入札を行わない。
      • Sample104 -> 登録数や更新日の条件は最もよいが、機能名(:name)が異なるので入札を行わない。
      • それ以外 -> 機能名が異なるので破棄される。
    3. 一定時間が経過した後、最もよい条件を提示してきた「Sample102」に対して落札(award)メッセージを送信する。
    4. ワークプレースにエージェントが2つ生成され、logタブかコンソールに18,19行目のメッセージが表示される。
    5. 「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: ワークプレースに生成されたエージェントが出力したメッセージ。
      ※生成時刻やホスト名は環境によって異なるので、上記の出力例とは同じにならない場合がある。

    (4)用語

    タスク通知(task-announcement)と入札(bid)メッセージ
    タスク実現可能性の判断においてタスク分割を行い、その依頼をタスク通知で行った場合、いずれかのメンバから条件を満たす入札メッセージが送信されてきた場合に限り、上位のマネージャに対して入札メッセージを送信する。入札メッセージを受信しない、あるいは、条件を満たす(ルールを発火させられる)入札が無かった場合、上位のマネージャに対しては(受信したタスク通知に対して)メッセージを返さずにタスクは破棄される。

    (5)組織構成のための知識記述

    タスク実現可能性の判断におけるタスク分割(task-check)
    例題9の直接落札の場合と同じように(decompse)ファクトを生成する。異なるのは:to属性の値である依頼先が決まっていないため「_broadcast」と記述する必要がある。

    採用する入札の選択(bid-check)
    以下に採用する入札の選択を行うルールの記述例を示す.エージェト設計者は,入札評価(bid-check)ファクトの入札内容(:bid)属性について記述する.1つの入札メッセージに対して1つの入札評価ファクトが生成されるので,採用する入札が決まるように条件を設定する.このルールを記述しなかった場合,入札がなかったものとして扱われる.

    (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))

    この例は,機能名(:name)が「tv-conf」で最も大きなフレームレート(:framerate)を提示してきたエージェントを落札することを意味している。入札を絞り込むための条件は必ずしも数値である必要はなく,文字列の一致であっても可能である。ただし,全く同じ条件を提示してきたエージェントが複数ある場合は,先着順になるだろう。

    (6)初期ファクト

    例題9の直接落札の場合と同様である。独自のファクトを追加したい場合は、例題11のインスタンシエートに関するルールを記述する必要がある。


    Last modified: Fri Jan 24 18:17:37 JST 2003

    インデックスへ   前のページに戻る