4.3 Control loop 実装・デプロイのためのプログラミングフ レームワークレームワーク
4.3.2 Control loop 実装のためのプログラミングフレームワーク
本研究では,定義4.3.1の要件を満たすフレームワークとして,複数の並行タスクを実装可 能であるエージェントプラットフォームJADE [47]を拡張したプログラミングフレームワー クを実装した.本節ではまず,JADEの概要について説明し,その後,Control loop実装を考 えた際に拡張が必要な部分について論じる.
JADE
JADEはJava 言語によるマルチエージェントシステムの構築が可能なプログラミングフ レームワークであり,JADEの大きな特徴として,複数のビヘイビアクラスを用意することで,
エージェント,つまり自身の目的を達成するために自律的に動作・意思決定するソフトウェア の動作が定義可能である点が挙げられる.これは,システムの動作に必要となる複数の並行タ スクが記述可能であるということを意味する.
JADEでは振舞いを定義,つまり実装するために,Behaviourクラスとその派生クラスが提 供されている.例えば,JADEでは,何度も繰り返し実行される命令ブロックを記述するため のビヘイビアとしてCyclicBehaviourクラスが提供されており,また,終了条件を定義し,終 了条件が真になるまで命令ブロックを繰り返すビヘイビアとしてSimpleBehaviourクラスが提 供されている.また,JADEはマルチエージェントシステムの実装を目的として設計されてい ることから,エージェント間で送受信されるメッセージの処理に関する実装を支援するビヘイ ビアも数多く提供されている.
開発者はビヘイビアの利用形態に応じて適切な派生クラスを選択し,その派生クラスを継承 するビヘイビアを実装することで,エージェントの多様な振舞いを実装することができる.4.9
1: public class SampleAgent extends Agent{
2: protected void setup(){
3: addBehaviour(new Printer(this,"p1"));
4: addBehaviour(new Printer(this,"p2"));
5: } 6: } 7:
8: class Printer extends SimpleBehaviour{
9: int n=0;
10: String name;
11:
12: public Printer(Agent a, String st){
13: super(a);
14: name = st;
15: }
16: public void action(){
17: System.out.println("I am "+name+".");
18: n++;
19: }
20: public boolean done(){return n>=5;}
21: }
図4.9.JADEにおけるビヘイビア記述例
にJADE上でのビヘイビア記述例を示す.ビヘイビアの記述には通常,繰り返し実行する処理 を記述するactionメソッドと,終了条件を記述するdoneメソッドを利用する.この例では,
SimpleBehaviourクラスを継承し(8行目),繰り返し実行する処理として自身の名前の出力と
カウント変数のインクリメントを(16〜19行目),終了条件としてカウント変数値のチェック
(20行目)を記述している.ビヘイビアはaddBehaviourメソッドにより,エージェントの実 行プロセスとして登録・起動され(3, 4行目),この例では2つのビヘイビアインスタンスが 終了条件が満たされるまでそれぞれ並行に実行される.
拡張すべき点
このように,JADEでは複数ビヘイビアの記述により,システムに割り当てられるべき各プ ロセスの並行実行を実現可能であることから,コンポーネントをビヘイビアにより実装するこ とで,定義4.3.1における,実装フレームワークに求められる要件の1つ「Control loop群の 制御」を満たす可能性があると考えられる.しかしながら,現状のJADEをControl loopの実 装に利用しようとすると,以下のような難しさに直面する.
Conrol loopにおけるコンポーネント制御:本研究では,Control loopを構成する要素とし て,Collect,Analyze & Decide,Actタイプの3種類のコンポーネントを定義している.従っ
て,Control loopを実現するためには,これらの複数のコンポーネントが相互に連携する必要 がある.これに対し,JADEでは複数ビヘイビアによりタスクの並行実行を実現することがで きるが,他ビヘイビアのタスク実行状態を能動的に確認する手段は提供されていない.また,
他ビヘイビアの動作を制御する手段として,ビヘイビアを強制的に中断させるblockメソッド が提供されているが,処理を中断する際の適切な退避処理などを記述することができない.そ の結果,単にJADE上でビヘイビアを用いてコンポーネントを実装すると,適切な退避処理が 記述できないことから誤動作を引き起こすといった,コンポーネント連携による問題が発生す ることになる.
Conrol loop間の連携:Control loopを複数動作させる場合,競合回避メカニズムを実現する という観点からも,Control loopに対する制御手段が必要である.しかし,先のControl loop 内でのコンポーネント制御の議論と同様に,Control loopを制御するためのメカニズムの実装 方法は明らかではない.
複数のControl loopにより構成されるシステムの実装にJADEを利用するためには,これら
の問題を解消するような拡張が必要となる.
4.3.3 本研究で導入するプログラミングフレームワーク
本研究では,JADEを拡張することで,コンフィギュレーションに基づいてControl loopを 構成することが可能なプログラミングフレームワークを実現する.図4.10は,本研究で導入 するプログラミングフレームワークの構造をクラス図により示したものである.
本拡張では,Control loopを構成するコンポーネントを実現するために,まず, Simple-Behaviourクラスを継承する ComponentBehaviourクラスを導入する.この
ComponentBe-haviourクラスは,4.3.1節で定義した要件を満たすControl loopの実現するための基礎となる
機能を提供するクラスである.以下,ComponentBehaviourクラスについて述べる.
まず,ComponentBehaviourクラスは,拡張Darwinモデル[4]を実装すべきコンポーネン トの基本モデルとする.拡張Darwinモデルは,3.4節でコンフィギュレーションの記述に用
いたDarwinモデルに対して,コンポーネントの外部から内部状態を可視化するためのmode
と呼ばれるインタフェースを追加した拡張モデルである.
実装するコンポーネントにおいては,拡張Darwinモデルの特徴の1つであるmodeを変数 として持ち,各コンポーネントの状態をmode変数を通じて外部に公開する.しかしながら,
単に拡張Darwinモデルに従ってmode変数を導入するだけでは,コンポーネント間で制御
ループを実現するための制御インタフェースとしては十分ではない.そこで本研究では,コン ポーネントの制御を容易にするために,図4.12に示す状態遷移をコンポーネントの汎用的な
JADEで提供されているクラス メインクラス コンポーネント実装用スーパークラス コンポーネントタイプに応じた スーパークラス Control loop管理用 動的テーブル
図4.10.本研究で導入するプログラミングフレームワークの構造
コンポーネント サービス提供
ポート
サービス要求 ポート mode
図4.11.拡張Darwinコンポーネントモデル[4]
ライフサイクルとして定義し,状態遷移を実現するメソッドを導入する.ここで,WAITING はコンポーネントのサービスが待機状態であることを表し,ACTIVEはコンポーネントがサー ビス提供のために稼働中であることを表す.一方,ACHIEVEDとNOT ACHIEVEDは,コン ポーネントの動作の結果,各ゴールあるいは要件が目標とする状態に到達したかどうかを表現 するものである.
ComponentBehaviourクラスを拡張したコンポーネントは,図4.12のライフサイクルに従
い,活性状態(ACTIVE),待機状態(WAITING),達成状態(ACHIEVED),達成不能状態
(NOT ACHIEVED)の4つの状態のうちのいずれかの値ををmode変数値として取る.また,
図4.12中のactivate,passivateメソッドはそれぞれコンポーネントの状態を活性状態あるいは 待機状態へと遷移させるメソッドであり,この2つのメソッドによりコンポーネントの動作を 制御する.さらに,standBy,finalizeメソッドはそれぞれ,コンポーネントを生成して待機状 態にするメソッドと,コンポーネントを終了させるメソッドである.各メソッドに関しては,
活性時の初期化やデータ退避処理など各コンポーネント固有の処理が必要な場合に,必要に応 じてオーバーライドすることで実装する.これらの拡張により,状態遷移制御がメソッドとし て分離され,振舞い変更時のコンポーネント状態の参照・制御が簡易化される.また,状況の 変化に即応するコンポーネント制御手段が外部のコンポーネントに提供されることとなる.
本プログラミングフレームワークでは,このようなComponentBehaviour クラスを継承す る,Collect,Analyze & Decide,Actタイプに応じたスーパクラスを提供する.開発者はこれ らのスーパークラスを継承したコンポーネントを次節で説明するイディオムに従って実装する
ことで,4.3.1で定義した要件を満たすControl loopの実現が可能となる.なお,goccでは
ゴールモデルから各コンポーネントのタイプを同定可能であることから,生成されるコンポー ネント実装用のクラステンプレートでは,図4.15の5行目に示すように,該当するタイプの スーパークラスが継承元として定義される.
最後に,JADEでは,ビヘイビアを実行するアクタを実装するためにAgentクラスが存在す る.本研究では,このAgentクラスをControl loopを制御,管理するために拡張する.図4.10
のDyncleAgentクラスは,本研究でのAgentクラスの拡張である.本クラスの主な特徴は,
Control loopを管理するためのテーブルを保有・管理することと,Control loopをロード・ア