例題 3.7 適切なエージェントを探して協調する

  • 概要
  • エージェント
  • 動作実験

  • (1) 概要
    (2) エージェント
    ACLエディタ(_interface)
    ここにパフォーマティブ(:perforamtive)や宛先(:to)を入力し、 CnpManagerに対してメッセージを送信する。

    組織構成エージェント(CnpManager)
    他のエージェント(ACLエディタを含む)から受信したメッセージを組織構成プロトコル に適した形式に変換し、指定されたエージェントとの通信を行う。

    Manager
    例題 3.7 で設計したエージェントにManagerをDash-Orgルールセットに対応できるように書き直したもの。 契約ネットプロトコルではマネージャに相当する。

    Hotel-X・Hotel-Y・Hotel-Z
    例題 3.7 で述べられていたエージェントにDash-Orgルールセットに対応できるように書き直したもの。 契約ネットプロトコルではコントラクタに相当する。
    表1. 各エージェントの機能名と情報
     エージェント名  機能名
    (:name)
    情報
     宿泊料金 
    (:cost)
     徒歩時間 
    (:toho)
    朝食付
     (:breakfast) 
    Manager hotel-search
    Hotel-X  hotel-info  8000 10 yes
    Hotel-Y hotel-info 10000 5 yes
    Hotel-Z hotel-info 5000 7 no

    (2.1)Manager

     例題3.7で設計したプログラムに記述されていたルールとDash-Orgルールセットを用いた場合とのルール構成の違いを表2に示す。ルールセットを用いた場合でもエージェント設計者が記述する必要があるルールについては、色を変えて示した。また、Dash-Orgルールセットに対応できるように書き直したプログラムをリスト1に示す。
    表2. ルール構成の比較
    TAFの例題Dash-Orgを使用した場合
    利用者要求の受理と契約通知
    (received-request)
    タスク実現可能性の判断(分割する場合)
    (received-request)
    コントラクタからの入札受付
    (received-bid)

    (読み込んだルールセット内に記述されているので不要)
    コントラクタからの入札締切
    (timeout-without-bid)
    落札処理 (timeout-with-bid) 入札の選択 (timeout-with-bid)
    処理結果受信 (receive-info)
    (結果の表示についてはtimeout-with-bidで処理する)
    後処理 (prep-1)
    (読み込んだルールセット内で処理されるので不要)
    後処理終了 (prep-2)
    ※括弧内は、プログラムリストにおけるルール名。


     1  // 例題 3.7 エージェントManager
     2  (agent Manager  /* 代理店エージェント(マネージャ) */
     3  (property
     4    (create :author "太郎@ieice" :date "05/31/2000"))
     5  (initial_facts
     6    /* (CNP :state wait-task) 契約ネットプロトコルの初期状態設定 */
     7  )
     8
     9 (include :file  Dash-Org.rset ) // 組織構成ルールセットの読み込み
    10
    11  (knowledge
    12  (rule  activate  /* 組織構成ルールセットをアクティブにする */
    13    (Msg  :performative  __INIT_C  :content  (INIT))
    14    -->
    15    (activate  Dash-Org ))
    16    )
     11行目の knowledge からここまで(青枠で囲まれた部分)がルールセット _default となる。
    17  (rule-set Dash-Org /* 組織構成ルールセット */
    18   (property)
    19   (initial_facts)

    20  (rule   receive-request  /* 利用者要求の受理と契約通知 */
    21     (task-check :id ?id :task
    22     
    (task  :name  hotel-search   :cost  cheap  :toho  ?toho   :breakfast  ?bf )
    )
    タスク通知や直接落札メッセージの :content に記述されている条件
    23    ~(bid :id ?id)
    24    -->

    25   
    (make  (bid : id  ?id  :content 
     (task  :name  "hotel-search"  
    ))
    入札メッセージに付加される返信情報
    26    (make
    27      (decompose :id ?id  // 変更不可
    28         :to  _broadcast // エージェント名
    29         :env "null"   // リポジトリ名
    30         :wait 20000   // 入札待ちでタイムアウトするまでの時間
    31         :wp  "null"   // インスタンシエート先のワークプレース名
    32         :task 
    (task  :name   hotel-info  :toho  ?toho  :breakfast  ?bf 
    )))
    サブタスクのタスク通知/直接落札に付加される情報

    33  (rule  timeout-with-bid /*  落札処理  */
    34   (award-check  :award  "null")  =  ?ac
    35   (bid-check  :id  ?ac:id  :no  ?no  :bid
    36      (task  :name  "hotel-info"  :cost  ?cost ))  =  ?bid 
    37   ~(bid-check  :id  ?ac:id  :bid
    38      (task  :name  "hotel-info"  :cost  <  ?cost ))
    39   (Msg  :replyWith  ?no  :from  ?agent  :content  ?c )
    40   -->
    41   (modify  ?ac:award  ?no)
    42   (print  "***  Best  Hotel  is  "  ?agent)
    43   (print  "***  Information  :"  ?c )))
    17行目の rule-set からここまでが、ルールセット Dash-Org となる。
     44  )
    リスト1. Managerエージェント

    赤で記述されている箇所:Dash-Orgルールセットを使用する上で変更してはいけない記述。
    ※枠で囲まれた(task)ファクト:どのファクトの属性値として含まれているかにより付加されるメッセージが変わる。

    組織構成を可能にするために追加した記述について
    6行目  契約ネットプロトコルの初期状態設定
    【解説】契約ネットプロトコルにおける状態遷移は、ルールセット内のルールで行われている。エージェント設計者側で状態を示すファクトを生成する必要がないので除外した。
    9行目  ルールセットの読み込み
    【解説】Dash-Orgルールセットの読み込み。ファイル名とRuleSet名は一致している必要はない。
    12〜15行目  ルールセットをアクティブにする
    【解説】9行目で読み込んだルールセットをアクティブにするためのルール。17行目から記述してあるルールセットを別名で定義していた場合は、ここでそのルールセットが読み込んだDash-Orgルールセットよりも優先度が高くする必要がある。
    20〜32行目  タスク実現可能性の判断
    【解説】利用者からの要求メッセージに記述されている予約情報(宿泊料金(:cost)、徒歩時間(:toho)、朝食の有無(:breakfast))を基にタスク通知(task-announcement)を作成し、ホテルエージェント(Hotel-X、Hotel-Y、Hotel-Z)に対してブロードキャストするための記述である。
    33〜43行目  入札の選択
    【解説】入札(bid)メッセージの中から採用する入札を決定するためのルールである。ここでは、宿泊料金(:cost)が最も安い入札を落札している。アクション部では採用したエージェント名と入札メッセージに含まれていた情報(:content)を出力している。

    (2.2)Hotel-X

     例題3.7で設計したプログラムに記述されていたルールとDash-Orgルールセットを用いた場合とのルール構成の違いを表3に示す。ルールセットを用いた場合でもエージェント設計者が記述する必要があるルールについては、色を変えて示した。また、Dash-Orgルールセットに対応できるように書き直したプログラムをリスト2に示す。なお、Hotel-X以外のホテルエージェント(Hotel-Y,Hotel-Z)については、初期状態記述に格納されるホテル情報が違うのみなので省略する。
    表3. ルール構成の比較
    TAFの例題Dash-Orgを使用した場合
    通知された契約ないように基づく判断
    (receive-task)
    タスク実現可能性の判断(分割しない場合)
    (receive-task)
    落札受信
    (receive-award)

    (読み込んだルールセット内で処理されるので不要。)
    落札後処理
    (timeout-with-award)
    落札待ち打ち切り
    (timeout-without-award)
    ※括弧内は、プログラムリストにおけるルール名。


     1  // 例題 3.7 ホテルエージェントHotel-X
     2  (agent Hotel-X  /* ホテルエージェントHotel-X(コントラクタ) */
     3    (property
     4      (create :author "太郎@ieice" :date "12/01/1999")
     5      (agent :name Hotel-X)
     6    )
     7
     8    (initial_facts
     9      /* (id :last 0) 初期状態設定 */
    10      (info :cost 8000 :toho 10 :breakfast yes)  // Hotel-Xの場合
    11      // Hotel-Yの場合 (info :cost 10000 :toho 5 :breakfast yes)
    12      // Hotel-Zの場合 (info :cost  5000 :toho 7 :breakfast no)
    13    )
    15 (include :file  Dash-Org.rset ) // 組織構成ルールセットの読み込み

    16  (knowledge
    17  (rule  activate  /* 組織構成ルールセットをアクティブにする */
    18    (Msg  :performative  __INIT_C  :content  (INIT))
    19    -->
    20    (activate  Dash-Org ))
    21    )
     16行目の knowledge からここまで(青枠で囲まれた部分)がルールセット _default となる。
    22  (rule-set Dash-Org /* 組織構成ルールセット */
    23   (property)
    24   (initial_facts)

    25   (rule  receive-task   /* 通知された契約内容に基づく判断 */
    26     (info  :cost  ?cost  :toho   ?toho  :breakfast  ?bf )
    27     (task-check  :id  ?id  :task
    28      
      (task  :name  hotel-info   :toho  >=  ?toho  :breakfast  ?bf  ) 
     )
    マネージャから送られてくるタスク通知/直接落札に記述されている情報
    29     ~(bid  :id  ?id ) 
    30     -->
    31     (make
    32      (bid  :id  ?id  :content
    33       
      (task  :name  hotel-info   :cost  ?cost  :toho  ?toho  :breakfast   ?bf ) 
     ))
    入札メッセージに付加される返信情報
    34   )

    35  )
    22行目の rule-set からここまでが、Dash-Orgルールセットに追加される。。
    36  )
    リスト2. ホテルエージェント

    組織構成を可能にするために追加した記述について
    9行目  初期状態設定
    【解説】入札を識別するための識別子は、Dash-Orgルールセット内で管理しているのでエージェント設計者が改めて専用のファクトを生成する必要はない。
    25〜34行目  タスク実現可能性の判断(分割しない場合)
    【解説】ここでは、エージェントがもっているホテル情報 (info) からタスクを受けるか判断するためのルールを記述する。ホテルエージェント側ではタスク分割をする必要がないのでMnagerエージェントで使用した(decompose)ファクトを生成する必要はない。

    (3) 動作実験
    (2)で設計したエージェントをリポジトリに読み込み、ワークプレース上から要求メッセージを送信し、エージェント間でやりとりされるメッセージを確認する。
     1. 起動と読み込み
    リポジトリとワークプレースを起動し、(2)で示したエージェントが読み込まれていることを確認する。
    また、全てのエージェント名が既知であり、同じリポジトリ上に存在しているものとする。

     リポジトリ 

     Hotel-X 
     Hotel-Y 
     Hotel-Z 
        
     Manager 
      
     ワークプレース 

     _interface  (ACLエディタ) 
        
     CnpManager.xxx... 

     2. メッセージの送信
    次に、 [acl-editor] タブの各空欄に以下のように入力し、 [Send] ボタンを押す。

    :performative
    directed-award
    :to
    CnpManager.xxx...
    :content
    (request :to Manager :content (task :name hotel-search))
     Send 

     3. 直接落札の送信
    以下のように直接落札(directed-award)メッセージが送信される。

     リポジトリ 

     Hotel-X 
     Hotel-Y 
     Hotel-Z 



     Manager 









     <--[ directed-award ]-- 

     ワークプレース 

     _interface  (ACLエディタ) 

    [ directed-award ]
     CnpManager.xxx... 

     4. タスク実現可能性の判断 (Manager)
    (2.1)の20〜32行目に記述したタスクの実現可能性を判断するためのルールが発火する。
    この後、読み込んだルールが発火し、ホテルエージェントに対してタスク通知メッセージが送信される。

     リポジトリ 

     Hotel-X 
     Hotel-Y 
     Hotel-Z 
    ↑     ↑     ↑
    [ task-announcement ]
     Manager 
      
     ワークプレース 

     _interface  (ACLエディタ) 



     CnpManager.xxx... 

     5. タスク実現可能性の判断 (Hotel-X, Hotel-Y, Hotel-Z)
    (2.2)の25〜34行目に記述したルールが発火する。各ホテルエージェントはタスク通知の内容と表1の内容を比較し、以下のような処理を行う。
    • Hotel-X, Hotel-Y → 条件を満たすので入札メッセージを返す。
    • Hotel-Z → タスクを破棄する。
     リポジトリ 

     Hotel-X 
     Hotel-Y 
     Hotel-Z 
    |      |      
    [ bid ]    [ bid ]      
    ↓      ↓      
        Manager    
      
     ワークプレース 

     _interface  (ACLエディタ) 



     CnpManager.xxx... 
     6. 採用する入札の決定 (Manager.dash: 33〜43行目)
    一定時間が経過したあと、採用する入札を決定するためのルールが発火する。入札を返信してきたエージェントは2つあるが表1よりHotel-Xのほうが宿泊代金(:cost)が安いので、Hotel-Xが採用される。採用されなかった入札を返信してきたHotel-Yに対して交渉終了(negotiation-end)メッセージが送信される。

     リポジトリ 

     Hotel-X 
     Hotel-Y 
     Hotel-Z 

    [ negotiation-end ]
     Manager 
      
     ワークプレース 

     _interface  (ACLエディタ) 



     CnpManager.xxx... 

    また、発火したルールのアクション部で採用したホテルに関する出力をする記述がされているため以下に示す出力が得られる。

    採用するホテルが決定した後にManagerエージェントが出力するホテル情報
    *** Best Hotel is Hotel-X
    *** Information :(task :name hotel-info :cost 8000 :toho 10 :breakfast yes)

     7. 落札の送信 (CnpManager → Manager)
    一定時間経過後、 CnpManager から落札(award)メッセージが送信される。

     リポジトリ 

     Hotel-X 
     Hotel-Y 
     Hotel-Z 

     Manager 







     <--[ -award ]-- 

     ワークプレース 

     _interface  (ACLエディタ) 

     CnpManager.xxx... 

     8. インスタンシエート (Manager)
    Managerエージェントがインスタンシエートを行う。

     リポジトリ 

     Hotel-X 
     Hotel-Y 
     Hotel-Z 



     Manager 








     (_createInstance)→

    ←(createdInstance)
     ワークプレース 

     _interface  (ACLエディタ) 
     CnpManager.xxx... 

     Manager.yyy... 

     9. 落札の送信 (Manager → Hotel-X)
    Manager から Hotel-X に対して落札(award)メッセージが送信される。

     リポジトリ 

     Hotel-X 
     Hotel-Y 
     Hotel-Z 

    [ award ]
     Manager 
      
     ワークプレース 

     _interface  (ACLエディタ) 
     CnpManager.xxx... 

     Manager.yyy... 

     10. インスタンシエート (Hotel-X)
    エージェントHotel-Xがインスタンシエートを行う。

     リポジトリ 

     Hotel-Y 
     Hotel-Z 

     Manager 


     Hotel-X 










     (_createInstance)→

    ←(createdInstance)
     ワークプレース 

     _interface  (ACLエディタ) 
     CnpManager.xxx... 
     Manager.yyy... 

     Hotel-X.zzz... 

     11. 動作可能の送信
    エージェント Hotel-X から Managerエージェントに対して動作可能(acceptance)メッセージが送信され、Managerエージェントから CnpManager に動作可能メッセージが送信される。最後にCnpManagerが結果を出力する。

     リポジトリ 


     Hotel-X 
     Hotel-Y 
     Hotel-Z 

    [acceptance]
     Manager 
    ----[ acceptance ]----










     ワークプレース 

     _interface  (ACLエディタ) 
     Manager.yyy... 
     Hotel-X.zzz... 
     CnpManager.xxx... 

    CnpManagerが出力する結果
    18:01:01 From: [CnpManager] Message: [インスタンシエートに成功しました。]
    


    Last modified: Fri Jan 24 17:19:44 JST 2003

    前のページに戻る ]   [ インデックスへ ]   [ 次の例題に進む ]