3.5 タスク分割

分割統治法 (devide and conquer method)を行うエージェントについて説明します.次の手順で問題解決をします.

  1. 問題を小さな問題に分割します
  2. 小さな問題それぞれの解を求めます
  3. それらの解を統合して元の問題の解を求めます

教科書p.73 "3.5 問題の処理手順を考える" の内容に相当します.

概要

%0 user user Searcher Searcher user->Searcher Q&A about "Tohoku onsen" ODB_aomori ODB_aomori Searcher->ODB_aomori Q&A ODB_iwate ODB_iwate Searcher->ODB_iwate Q&A ODB_akita ODB_akita Searcher->ODB_akita Q&A

メッセージの流れ

useruserSearcherSearcherODB_aomoriODB_aomoriODB_iwateODB_iwateODB_akitaODB_akitarequest-information3つに並列に問い合わせるparrequest-informationinformrequest-informationinformrequest-informationinform返答が集まるまで待つinform

プログラム

ODB_aomori.groovy

(3.2節と同じ)

ODB_iwate.groovy

class ODB_iwate extends ODB_aomori {
    def setup() {
        onsenlist = [
            [name:'金田一温泉', type:'単純泉',                 city:'二戸市', point:50],
            [name:'奥中山温泉', type:'ナトリウム炭酸水素塩泉', city:'一戸町', point:70],
            [name:'田山温泉',   type:'アルカリ性単純泉',       city:'安代町', point:60] ]
    }
}

ODB_akita.groovy

class ODB_akita extends ODB_aomori {
    def setup() {
        onsenlist = [
            [name:'大葛温泉',   type:'カルシウム硫酸塩泉', city:'比内町', point:50],
            [name:'雪沢温泉',   type:'硫酸塩泉',           city:'大館市', point:70],
            [name:'湯ノ沢温泉', type:'アルカリ性単純泉',   city:'森吉町', point:100] ]
    }
}

Searcher.groovy

class Searcher extends TAG {
    def loop(msg) {
        if (msg._p=='request-information' && msg.ninkiOnsen=='tohoku') {
            // 3つのエージェントにrequest-informationを送信し,全ての返事を待つ
            def replies = request(['ODB_aomori', 'ODB_iwate', 'ODB_akita'],
                                  [_p:'request-information', point:'max'])
            replies.each{println it} // requestの返事を表示する
            def maxpoint = replies.max{it.point} // repliesの中からpointが最大の要素を探す
            reply(msg, maxpoint)
        } else {
            reply(msg, [_p:'sorry', msg:msg])
        }
    }
}

動作方法

課題

  1. 宮城県の温泉データを保持するエージェントを追加し,検索できるようにしてみましょう.エージェントの追加は次の手順で行います.
    1. show files をチェックします
    2. New を押します
    3. 新しく作成するエージェント名.groovyと入力します
    4. あるいは,エージェントフォルダ(インストールしたディレクトリ内のagentというフォルダ)に新しくファイルを作成することでも行えます
  2. 検索の範囲を地域名ではなく県名で指定できるようにしましょう.現在はtohokuという地域名で検索していますが,例えば[_p:'request-information', ninkiOnsenFrom:['akita', 'aomori']]のように県名を指定できるようにしてみましょう.

Groovy文法情報

REPL環境

次のどちらかでGroovyのREPL環境を開くことができます.小さいプログラム片を試すときに便利です.

(1) Webアプリ
https://groovyconsole.appspot.com/ を開きます.
上方にコードを記述して éxecute script を押すと実行結果が表示されます.

(2) Groovy Console
$ java -cp tagserver.jar groovy.ui.Console

リスト操作

def list = ['akita', 'aomori']
def agent = []
list.each{agent.add('ODB_'+it)}
print agent