<?xml version='1.0' encoding='Shift_JIS' ?>
<doc xml:lang='ja'>
	<head>
		<title>Behavior</title>
	</head>
	<body>
		<p>
			エージェントの行動は，Behaviorとして定義されています。例えば、企業における生産行動や販売行動，個人における購買行動や労働行動などはどれも、個別にBehaviorとして作成します
			。</p>
		<p>
			このような設計はモデルの表現力の点からみると、いくつかの利点があります。まず第一に、ひとつのエージェントが複数の社会的役割を担っているということを自然な形で表現できることにあります。例えば、あるエージェントが消費者かつ労働者であるといったようなモデルを作成できるようになります。また，新しい行動の追加や削除、行動の手続きの変更などが可能になり、これにより、エージェントの行動、役割が変化するということを扱うことができるようになります。</p>
		<p>
			このような設計を採用する技術的な利点は、柔軟性と再利用性が向上することです。オブジェクト指向によってエージェントを表現する場合、現状ではエージェントをひとつのオブジェクトとして設計することがほとんどです。ところが、ひとつのエージェントをひとつのオブジェクトとしてそのまま設計すると、モデルの柔軟性や再利用性の面で問題が生じます。エージェントをひとつのオブジェクトにカプセル化してしまうため、行動の種類そのものが動的に変化するエージェントを作成する場合や、エージェントの一部を再利用する場合に限界が生じるのです。この点を考慮して基礎モデルでは、「継承」による拡張の代わりとして「コンポジション」(composition)のしくみを採用しています。コンポジションとは、役割を外部化するためのオブジェクトを用意し、もともと操作としてもつはずだった責務(役割)をそのオブジェクトに委譲するという設計のことです
			。つまり、エージェントの設計において、エージェントクラスの中に操作として行動を記述するのではなく、エージェントの役割別に行動クラスを作り、それらのオブジェクトを「主体」の核となる部分が保持するという設計となります。</p>
		<subsection title="状態遷移によるBehaviorの実現">
			<p>
				基礎モデルでは、エージェントの持つBehaviorを状態機械として定義しています。ある行動の手順や結果による分岐を状態として定義し、複数の状態が順に遷移し、その過程で処理を行うことで行動の実行を実現します。</p>
			<p>
				例えば、一定時間ごとに株を買う「株を買う行動」をBehaviorとして定義したとしましょう。ここでは、この行動が以下の手順で株を買うという行動を考えてみたいと思います。</p>
			<ol>
				<li>一定時間経過するのを待ち、ある定められたタイミングで株を購入する。</li>
				<li>領収書が送られてくるのを待ち、届いたら領収書に付随する情報を保存し、1へ戻る。</li>
			</ol>
			<p>
				この中で、それぞれの最初の「・・・を待ち」という部分は、このBehaviorの状態と考えることができます。また、1は時間経過という作用、2は他のエージェントからの作用によって、次の状態に遷移するということになります。このとき、状態から状態に遷移するときにアクション（「・・・を行う」という部分）を実行します。このような株を買うBehaviorをUMLのステートチャート
				で記述すると以下のようになります。</p>
			<figure id="fig:lastyear1" src="image/statechart" title="簡単な状態遷移図"
				/>
			<p>
				株を買うBehaviorの初期状態として時間待ち状態を定めます。同じように領収書待ち状態を定めます。そして「時間待ち状態→領収書待ち状態」と「領収書待ち状態→時間待ち状態」の遷移が矢印として表現してあります。この矢印に書かれているもののうち、スラッシュ(/)の左側には状態遷移を引き起こす要因が書かれており、これが「・・・を待つ」にあたります。スラッシュ(/)の右側には状態遷移の際に行うアクションが書かれています。状態機械では状態を遷移するためのきっかけとして外部からの刺激が存在するのですが、基礎モデルではこの刺激をEvent（信号）として定めています。ここでは、BehaviorはEventを受け取ることで状態を遷移させていくということを覚えておいてください（Eventについては後述します）。株を買うBehaviorにおける遷移は２種類あります。これらの遷移に対応したEventとそのときに実行されるアクションとして?ではTimeEvent（時刻が経過したことを告げるEvent）と「株の買い注文を出す」というアクションがあります。TimeEventに関しては時刻が一定時間経過したことを表現するため[経過時間>100
				] 
				というガード条件も付加されています。同じように2でChannelEvent（他のBehaviorからGoodsが送られてきたというEvent）と「領収書の情報を蓄積する」というアクションを定義します。特にChannelEventは、図では記述されていませんが、他のBehaviorから領収書が送られてきたということを表現しています。このように状態機械として株を買うBehaviorを定義することができます。</p>
			<p>
				基礎モデルにおけるBehaviorはこのように状態機械として定義します。エージェントベースモデルでは、エージェントの内部状態が動的に変化していくということがしばしば強調されますが、基礎モデルでは、この内部状態の一部を各行動にそれぞれもたせ、より高度な内部状態の遷移を実現することができるのです。</p>
			<p>
				注意すべき点として、遷移中にはEventは受信されずに一時的に蓄積され、、遷移先の状態で受信されます。遷移中に送ったEventの返事が即座に返ってきてもその受信は遷移先の状態で行われます。</p>
		</subsection>
		<subsection title="Behaviorに送られるEvent">
			<p>Behaviorが受け取るEventは以下の４種類が存在しています。</p>
			<dl>
				<dt>TimeEvent</dt>
				<dd>
					Agentから(そのAgentに配置されている)Behaviorに送られるEventです。モデル外部から時刻が経過したことを知らせるためにAgentに送られて、AgentがBehaviorに転送します。</dd>
				<dt>ChannelEvent</dt>
				<dd>
					Behaviorで開設されているChannelから送られるEventです。Channelに対し別のBehavfiorからGoodsが送られたときに発せられるEventです。</dd>
				<dt>OpenChannelEvent</dt>
				<dd>
					RelationからAgentを通して受け取るEventです。明示的に書かなくても受け取ってChannelを開設しますが、あえて明示的にこのEventを受け取るように記述することもできます。</dd>
				<dt>（AutoTransition）</dt>
				<dd>
					状態機械において遷移は外部からの刺激のみによるという定義があるため推奨はしませんが、Eventを受け取らなくても自動的に状態が遷移するように記述することも可能です。</dd>
			</dl>
		</subsection>
		<subsection title="Behaviorの構造">
			<p>Behaviorのクラス図は以下の通りです。</p>
			<figure id="fig:lastyear1" src="image/behavior" title="Behaviorクラス図"
				/>
			<p>
				Behaviorを継承して実装しますが、コンポーネントビルダーによって状態遷移を含む枠組みを作成することができます。ただし、アクションは実装する必要があるので、前述の機能を適宜利用するソースコードをアクションに記述します。</p>
			<p>
				Behaviorの多くの詳細な部分はユーザーには見えない形で隠蔽されています。特に、状態機械としてのBehaviorの動作の部分の実装はユーザーはほとんど意識する必要がありません。</p>
			<p>ここではクラス図に示されているメソッドの解説を行います。（引数の型が異なるものがあるので詳細はAPIまたは実装リファレンスを参照してください。）</p>
			<dl>
				<dt>getActiveChannel</dt>
				<dd>
					現在Brehaviorで開設しているChannelを取得します。(Channelの項で述べたkeepがtrueのChannelを取得します)</dd>
				<dt>sendGoods</dt>
				<dd>Channelを自動的に開設してGoodsを送信します。</dd>
				<dt>sendInformation</dt>
				<dd>
					Channelを自動的に開設してInformationを送信します。（InformationはGoodsに付属させることによってしか送信できないので、一時的なGoodsが生成されます。）</dd>
				<dt>keepReceivedGoods</dt>
				<dd>現在Channelが受け取っているGoodsを格納します。</dd>
				<dt>setReceivedGoods</dt>
				<dd>現在Channelが受け取っているGoodsを設定します。推奨されません。</dd>
				<dt>getReceivedGoods</dt>
				<dd>現在、あるいは格納されているGoods（Behaviorが受け取ったGoods）を返します。</dd>
				<dt>getReceivedInformation</dt>
				<dd>現在、あるいは格納されているInformation（Behaviorが受け取ったInformation）を返します。</dd>
			</dl>
		</subsection>
	</body>
</doc>
