例題 3.2 エージェントをプログラムする

  • 概要
  • エージェント
  • 起動

  • (1)概要

    例題 3.2 のエージェントODB-aomoriに組織構成のためのルールを追加する。

    (2)エージェント

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

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

    ODB-aomori
    例題 3.2 で述べられていたODB-aomoriエージェントに組織構成に必要なルールを追加したもの。

    (2.1)ODB-aomori.dash

       1  // 例題3.2 温泉データベース 〜 青森編 〜
       2  (agent ODB-aomori
       3    (property
       4      (create :author "太郎@ieice"	  :date "11/08/1999"))
       5    (initial_facts
       6      (onsen :name 湯野川温泉	:type 単純泉	  :city 川内町 :point 80)
       7      (onsen :name 湯坂温泉	:type 単純硫化水素泉 :city 大畑町 :point 50)
       8      (onsen :name 大間温泉	:type 食塩泉	  :city 大間町 :point 30)  )
       9
      10    (include :file Dash-Org.rset)  // 組織構成ルールセットの読み込み
       11
      12    (knowledge
      13      (rule retrieve-name /* 温泉名による温泉データ検索処理 */
      14        (Msg :performative request-information :from ?from
      15             :content (onsen :name ?name)) = ?msg
      16        (onsen :name ?name) = ?fact
      17        -->
      18        (send :performative inform :to ?from :content ?fact)
      19        (remove ?msg))
      20      (rule retrieve-failed /* 検索処理失敗 */
      21        (Msg :performative request-information :from ?from
      22             :content (onsen :name ?name)) = ?msg
      23        -->
      24        (send :performative retrieve-failed :to ?from
      25              :content (onsen :name ?name :type unknown :city unknown))
      26        (remove ?msg))
      27      (rule send-sorry /* 解釈不能メッセージの処理 */
      28        (Msg :from ?from :content ?content) = ?msg
      29        -->
      30        (send :performative "sorry" :to ?msg :content ?content)
      31        (remove ?msg))
      32
      33      (rule activate /* 組織構成ルールセットをアクティブにする */
      34          (Msg :performative __INIT_C :content (INIT))
      35          -->
      36          (activate Dash-Org))
      37    )
    12行目の knowledge からここまで(青枠で囲まれた部分)がルールセット _default となる。
      38    (rule-set Dash-Org
      39      (property)
      40      (initial_facts)
      41      (rule task-check /* タスク実現可能性の判断(分割しない場合) */
      42        (task-check :id ?id :task
    
              (task :name "温泉DB" :prefecture "青森県"))
              タスク通知/直接落札メッセージ側に記述されている内容
      43        ~(bid :id ?id)
      44        -->
      45        (make (bid :id ?id :content
    
              (task :name "温泉DB" :prefecture "青森県"))))
              入札/動作可能メッセージ側に記述する内容

      46      (rule instantiate /* インスタンシエートに関するルール */
      47        (init :name "null" :facts ()) = ?init
      48        -->
      49        /* インスタンシエート先のワークプレースの指定 */
      50        (modify ?init:wp "w1:_localhost")
      51        /* instantiateアクションのfacts属性に追加するファクト */
      52        (unshift (URL :url "foo.example.jp") ?init:facts)))
    
    38行目の rule-set からここまでが、ルールセット Dash-Org となる。
      53  )
    

    組織構成を可能にするために追加した記述(プログラム内の赤枠で囲んだ箇所)について

    10: タスク通知や直接落札を処理するために必要なルールセットを読み込む
    (例題 3.1 と同様)
    33〜36: ルールセットを読み込んだだけでは、メッセージを受信しても発火しないので アクションでアクティブにする。
    (例題 3.1 と同様)
    38〜 組織構成ルールセットである Dash-Org を読み込んだだけでは入札等を返すことが できないので、タスク実現可能性の判断をするルールとインスタンシエートに関するルールを追加する。
    41〜45: タスク実現可能性を判断するためのルール。タスク通知と直接落札のどちらに対しても条件を満たせば 発火する。条件として、機能名(:task)の他に県名(:prefecture)を追加している(下線の部分)。
    46〜52: インスタンシエートに関するルール。インスタンシエート先のワークプレースやインスタンシエート時に 生成したいファクトを追加する。条件部に記述されている(init)ファクトに関する記述は省略できない。
    (→インスタンシエートに関するルール)

    (3)起動

     1. 起動と読み込み
    リポジトリとワークプレースを起動すると(2)で示したエージェントがリポジトリ上に読み込まれる。

       リポジトリ   




     ODB-aomori 
      
     ワークプレース 

     _interface  (ACLエディタ) 
        
     CnpManager.xxx... 
    全てのエージェント名が既知であり、同じリポジトリ上に存在しているものとする。

     2. リポジトリ上での確認
    ここで、 ODB-aomori のインスペクタを開くと以下のように表示される。 RuleSetからDash-Orgを選択するとRuleListに 追加したルールを含めた一覧が表示される。

    □    ODB-aomori    
     File  Edit  Fact  Engine - □ non-stop Action
      RuleSet
    Dash-Org
    _default







      RuleList
    task-check
    41〜45行目に記述したタスク実現可能性の
    判断についてのルール

    instantiate
    46〜52行目に記述したインスタンシエート
    に関するルール

    _cnp-recv-TA
    ...
    以降は _cnp-xxx で始まるルールが続く。
    (Dash-Org.rsetに記述されているルール)

      ODB-aomori.dash

    (agent ODB-aomori
    ...







      WorkingMemory
    Rule-set :active (Dash-Org) :not-active (_default) :all (_default Dash-Org))
    (Msg :performative __INIT_C :content (INIT))
    (Members :manager null)
    (Status :cname Simple :name Simple :environment r1:_localhost :origin r1:_localhost) 
    ...
      output  











      Variables
    waiting...



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

    :performative
    directed-award
    :to
    CnpManager
    :content
    (request
      :to ODB-aomori  (←依頼先のエージェント)
      :content (task :name "温泉DB" :prefecture "青森県")) (←タスクの内容)
     Send 

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

       リポジトリ   






     ODB-aomori 











     <--[ directed-award ]-- 
     ワークプレース 

     _interface  (ACLエディタ) 
    |
    [ directed-award ]
     CnpManager.xxx... 

     5. タスク実現可能性の判断
    (2.1)の41〜45行目に記述したルールが発火する。
    依頼されたタスクは実現可能なので拒否(refusal)メッセージは送信しない。

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

       リポジトリ   



     ODB-aomori 










     <--[ award ]-- 

     ワークプレース 

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

     7. インスタンシエート前処理
    (2.1)の46〜52行目に記述したインスタンシエートに関するルールが発火する。

     8. インスタンシエート
    エージェントODB-aomoriがインスタンシエートを行う。

       リポジトリ   






     ODB-aomori 











     --[ _createInstance ]--> 

     <--[ createdInstance ]-- 
     ワークプレース 

     _interface  (ACLエディタ) 
     CnpManager.xxx... 
     ODB-aomori.yyy... 
     

     9. 動作可能の送信
    エージェントODB-aomoriから動作可能(acceptance)メッセージが送信され、 CnpManagerは結果を出力する。

       リポジトリ   



     ODB-aomori 












     --[ acceptance ]--> 
     ワークプレース 

     _interface  (ACLエディタ) 
     CnpManager.xxx... 
     ODB-aomori.yyy... 
     

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

     10. インスタンシエートの完了
    ワークプレースに生成されたエージェントに対して、例題の request-information 等が 送信可能な状態になる。

     11. ワークプレース上での確認
    ここで、ワークプレース上のODB-aomori のインスペクタを開くと以下のように表示される。

    □  ODB-aomori.200212051825461:w1:_localhost  
     File  Edit  Fact  Engine - □ non-stop Action
      RuleSet
    _default
    (ワークプレースでは、33〜36行目のルールが
    発火しないので _default のみがアクティブになる。)

    Dash-Org

      RuleList    





      ODB-aomori.dash

    (agent ODB-aomori   
    ...


      WorkingMemory
    (Rule-set :active (Dash-Org) :not-active (_default) :all (_default Dash-Org))
    (URL :url foo.example.jp) (←52行目に記述したファクトが生成される。)
    (Members :manager _interface :contractor ())
    (Msg :performative __INIT_I :content (INIT))
    (Members :manager _interface)
    ...
      output  











      Variables
    waiting...





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

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