<?xml version='1.0' encoding='Shift_JIS' ?>
<doc xml:lang='ja'>
	
	<body>
		<p>
			実装リファレンスでは、
			モデル作成時の問題を解消するために、
			よく使用されると思われるメソッドを取り上げ、
			その機能を説明しています。
		</p>	
		<section title="行動関連のメソッド一覧">
			<p>
				エージェント間で財/情報をやりとりするためのメソッドと、後述されるエージェントメソッドを使用するためのメソッドをまとめています。
				</p>
			<p>
				エージェント間で財/情報を送るにはsendGoodsメソッド/sendInformationメソッドを、
				送られてきた財/情報を受け取るにはgetReceivedGoodsメソッド/getReceivedInformationメソッドを
				用います。
				</p>
			<p>
				引数の指定によっては、関係をもつ全てのエージェントに財/情報を送信する、といったことが可能です。
				</p>
			<subsection title="エージェント/世界の参照">
				<table style="width:100%" title="エージェント/世界の参照メソッド一覧">
					<thead>
						<tr>
							<th>クラス</th>
							<th>メソッド名</th>
							<th>引数</th>
							<th>戻り値</th>							
							<th>説明</th>
						</tr>
					</thead>
					<tbody>
						<tr>
							<td>Behavior</td>
							<td>getAgent</td>
							<td>なし</td>
							<td>Agent</td>
							<td align="left">
								その行動をもっているエージェントを返します。
								Behaviorを継承したクラス内で後述したエージェントメソッドを使用するには、
									このメソッドでエージェントを参照して下さい。
							</td>
						</tr>						
						<tr>
							<td>Behavior</td>
							<td>getWorld</td>
							<td>なし</td>
							<td>World</td>
							<td align="left">
								その行動をもっているエージェントの存在する世界を返します。
								Behaviorを継承したクラス内でエージェントを生成するといったワールドメソッドを使用するには、
									このメソッドで世界を参照して下さい。
							</td>
						</tr>						
					</tbody>
				</table>
			</subsection>
			<subsection title="財の送信">
				<table style="width:100%" title="財の送信メソッド一覧">
					<thead>
						<tr>
							<th>クラス</th>
							<th>メソッド名</th>
							<th>引数</th>
							<th>戻り値</th>							
							<th>説明</th>
						</tr>
					</thead>
					<tbody>
						<tr>
							<td>Behavior</td>
							<td>sendGoods</td>
							<td>
								Goods goods
							</td>
							<td>なし</td>
							<td align="left">
								既に開いている経路を利用して、財を送信する。
								開いている経路がない場合は例外を投げる。
							</td>
						</tr>						
						<tr>
							<td>Behavior</td>
							<td>sendGoods</td>
							<td>
								Relation relation,
								BehaviorType behaviorType,
								Goods goods,
								boolean keep
							</td>
							<td>なし</td>
							<td align="left">
								関係先の単数のエージェントに対して、経路を開き財を送信する。
								relationは、送信したいエージェント単体に対する関係。
								behaviorTypeは、送信先のエージェントがもつ、送信財を受け取る行動のType。
								goodsは、送信したい財。
								keepは経路をkeepするかどうかの真偽値。
							</td>
						</tr>
						<tr>
							<td>Behavior</td>
							<td>sendGoods</td>
							<td>
								Relation relation,
								BehaviorType behaviorType,
								Goods goods
							</td>
							<td>なし</td>
							<td align="left">
								関係先の単数のエージェントに対して、経路を開き財を送信する。
								この時、Keep=falseな経路を自動的に開設するところが、上のメソッドと異なる。
							</td>
						</tr>
						<tr>
							<td>Behavior</td>
							<td>sendGoods</td>
							<td>
								RelationType relationType,
								BehaviorType behaviorType,
								GoodsType goodsType,
								double goodsQuantity,
								boolean createGoods,
								boolean keep
							</td>
							<td>int</td>
							<td align="left">
								指定した関係先の全てのエージェントに対して、経路を開き財を送信する。戻り値は送り先エージェントの数である。
								relationTypeは、送信したい各エージェントに対する関係のType。
								behaviorTypeは、送信先の各エージェントがもつ、送信財を受け取る行動のType。
								goodsTypeは、送信したい財のType。
								goodsQuantityは、送信したい財の量。
								createGoodsは、送信したい財を新しく生成するかどうかの真偽値。
									falseの場合、送信財は送信元のエージェントの所有財から取り出される。
								keepは経路をkeepするかどうかの真偽値。
							</td>
						</tr>						
						<tr>
							<td>Behavior</td>
							<td>sendGoods</td>
							<td>
								RelationType relationType,
								BehaviorType behaviorType,
								GoodsType goodsType,
								double goodsQuantity,
								boolean createGoods
							</td>
							<td>int</td>
							<td align="left">
								指定した関係先の全てのエージェントに対して、経路を開き財を送信する。戻り値は送り先のエージェント数である。
								この時、Keep=falseな経路を自動的に開設するところが、上のメソッドと異なる。
							</td>
						</tr>						
					</tbody>
				</table>
			</subsection>
			<subsection title="情報の送信">
				<table style="width:100%" title="情報の送信メソッド一覧">
					<thead>
						<tr>
							<th>クラス</th>
							<th>メソッド名</th>
							<th>引数</th>
							<th>戻り値</th>							
							<th>説明</th>
						</tr>
					</thead>
					<tbody>
						<tr>
							<td>Behavior</td>
							<td>sendInformation</td>
							<td>
								Information information
							</td>
							<td>なし</td>
							<td align="left">
								既に開いている経路を利用して、情報を送信する。
								開いている経路がない場合は例外を投げる。
							</td>
						</tr>						
						<tr>
							<td>Behavior</td>
							<td>sendInformation</td>
							<td>
								Relation relation,
								BehaviorType behaviorType,
								Information information,
								boolean keep
							</td>
							<td>なし</td>
							<td align="left">
								関係先の単数のエージェントに対して、経路を開き情報を送信する。
								relationは、送信したいエージェント単体に対する関係。
								behaviorTypeは、送信先のエージェントがもつ、送信情報を受け取る行動のType。
								informationは、送信したい情報。
								keepは経路をkeepするかどうかの真偽値。
							</td>
						</tr>						
						<tr>
							<td>Behavior</td>
							<td>sendInformation</td>
							<td>
								Relation relation,
								BehaviorType behaviorType,
								Information information
							</td>
							<td>なし</td>
							<td align="left">
								関係先の単数のエージェントに対して、経路を開き情報を送信する。
								この時、Keep=falseな経路を自動的に開設するところが、上のメソッドと異なる。
							</td>
						</tr>						
						<tr>
							<td>Behavior</td>
							<td>sendInformation</td>
							<td>
								RelationType relationType,
								BehaviorType behaviorType,
								Information information,
								boolean keep
							</td>
							<td>int</td>
							<td align="left">
								指定した関係先の全てのエージェントに対して、経路を開き情報を送信する。
									戻り値は送り先エージェントの数である。
								relationTypeは、送信したい各エージェントに対する関係のType。
								behaviorTypeは、送信先の各エージェントがもつ、送信情報を受け取る行動のType。
								informationは、送信したい情報のType。
								keepは経路をkeepするかどうかの真偽値。
							</td>
						</tr>
						<tr>
							<td>Behavior</td>
							<td>sendInformation</td>
							<td>
								RelationType relationType,
								BehaviorType behaviorType,
								Information information,
								boolean keep
							</td>
							<td>int</td>
							<td align="left">
								指定した関係先の全てのエージェントに対して、経路を開き情報を送信する。
									戻り値は送り先エージェントの数である。
								この時、Keep=falseな経路を自動的に開設するところが、上のメソッドと異なる。
							</td>
						</tr>
					</tbody>
				</table>
			</subsection>		
			<subsection title="財/情報の受信">
				<table style="width:100%" title="財/情報の受信メソッド一覧">
					<thead>
						<tr>
							<th>クラス</th>
							<th>メソッド名</th>
							<th>引数</th>
							<th>戻り値</th>							
							<th>説明</th>
						</tr>
					</thead>
					<tbody>
						<tr>
							<td>Behavior</td>
							<td>getReceivedGoods</td>
							<td>なし</td>
							<td>Goods</td>
							<td align="left">
								最後に送られてきた財の参照を返します。
								再び財/情報が送られてくるまで、このメソッドは同じ参照を返します。
							</td>
						</tr>						
						<tr>
							<td>Behavior</td>
							<td>getReceivedInformation</td>
							<td>なし</td>
							<td>Information</td>
							<td align="left">
								最後に送られてきた情報の参照を返します。
								再び財/情報が送られてくるまで、このメソッドは同じ参照を返します。
							</td>
						</tr>						
					</tbody>
				</table>
			</subsection>		
			<subsection title="経路のポリシー">
				<dl>
					<dt>keepされない経路(keep=false)</dt>				
					<dd>keepされない経路の有効期間は、「開設されてから、どちらかの行動に新たな経路が開かれるまで」です。</dd>
					<dt>keepされる経路(keep=true)</dt>
					<dd>keepされる経路の有効期間は、「開設されてから、閉鎖されるまで」です。</dd>							
				</dl>
				<p>
					デフォルトは「keep=false」ですが、一つの財の送受信しかできないわけではありませんので注意してください。
					「keep=false」であってもどちらかの行動に新たな経路が開かれるまでは、経路は確立されたままになっています。
					ですから、1対1通信の際には、何度でも財の送受信が出来ます。</p>
				<p>
				マニュアルで経路を操作するためには、以下のメソッドを利用します。
				</p>
				<table style="width:100%" title="経路操作メソッド一覧">
					<thead>
						<tr>
							<th>クラス</th>
							<th>メソッド名</th>
							<th>引数</th>
							<th>戻り値</th>							
							<th>説明</th>
						</tr>
					</thead>
					<tbody>
						<tr>
							<td>Relation</td>
							<td>openChannel</td>
							<td>
								Behavior openBehavior,
								BehaviorType targetBehaviorType,
								boolean isKeep</td>
							<td>boolean</td>
							<td align="left">
								２つの行動の間に経路を開設し、開設できたかどうかをbooleanで返す。
								openBehaviorは、経路開設元の行動。
								targetBehaviorTypeは、経路開設先の行動のType。
								isKeepは、経路をkeepするかどうかの真偽値。
								</td>
						</tr>	
						<tr>
							<td>Relation</td>
							<td>openChannel</td>
							<td>
								Behavior openBehavior,
								BehaviorType targetBehaviorType</td>
							<td>boolean</td>
							<td align="left">
								２つの行動の間に経路を開設し、経路が開設できたかどうかをbooleanで返す。
								この時、Keep=falseな経路を自動的に開設するところが、上のメソッドと異なる。
								</td>
						</tr>	
						<tr>
							<td>Channel</td>
							<td>close</td>
							<td>なし</td>
							<td>なし</td>
							<td align="left">
								経路を閉鎖する。
								この時、TradeEventが送られるので、プレゼンテーションコンポーネントなどですみやかに表示更新を行いたい場合は、このメソッドを明示的に呼び出す必要がある。
								</td>
						</tr>	
						<tr>
							<td>Behavior</td>
							<td>getActiveChannel</td>
							<td>なし</td>
							<td>Channel</td>
							<td align="left">
								行動自身が開設している経路を返す。
								</td>
						</tr>																								
					</tbody>
				</table>
				
				<p>
					簡易ユーザは、これらのメソッドを意識する必要はありません。
					経路の開設はsendGoodsメソッドに隠蔽されていますし、経路の閉鎖もデフォルトが「keep=false」であることにより、必要ありません。					
				</p>
				<p>
					これらの制御が必要になるときは、1対多, 多対多の通信において、keepしたchannelをつかって、
					一連の取引を一つのトランザクションとして扱いたい時などに利用します。
				</p>
				<p>
					また、取引完了信号(TradeEvent)は、経路閉鎖時に送られます。
					ですから、プレゼンテーションなどで、速やかに最新表示を行いたい時には、明示的に経路閉鎖をする必要があります。
					</p>
			</subsection>			
		</section>
		
		<section title="エージェントのメソッド一覧">
			<p>
			BESPでは、エージェントのもつ財・情報・関係・行動を、それぞれTypeのMapによって管理しています。
				Mapとは、データ追加時に検索キーを指定し、そのキーを用いて選択的なデータ取出しを可能とするデータ構造です。
				Mapの詳しい説明については、Javaの文献を参照して下さい。
				</p>
			<p>エージェントメソッドとして、
				財・関係・行動・情報を追加するためのaddメソッド、
				参照するためのgetメソッド、
				削除（取り出し）するためのremoveメソッドの３種類を用意しています。
				（ただし、情報の追加だけ、addではなくputメソッドとなっています）</p>
			<p>さらに、エージェントのもつ財・関係・行動のTypeのCollectionを取得できるgetGoodsTypes()、getRelationTypes()、getBehaviorTypes()メソッドを用意しています。
				</p>
			<p>これらのメソッドをBehaviorを継承したクラス内で使用するには、this.getAgent()でエージェントを参照して下さい。
				</p>
			<subsection title="所有財の追加/取り出し">
				<table style="width:100%" title="所有財の追加/取り出しメソッド一覧">
					<thead>
						<tr>
							<th>クラス</th>
							<th>メソッド名</th>
							<th>引数</th>
							<th>戻り値</th>							
							<th>説明</th>
						</tr>
					</thead>
					<tbody>
						<tr>
							<td>Agent</td>
							<td>addGoods</td>
							<td>
								Goods goods
							</td>
							<td>なし</td>
							<td align="left">
								財を所有財に追加します。
							</td>
						</tr>						
						<tr>
							<td>Agent</td>
							<td>removeGoods</td>
							<td>GoodsType type, double quantity</td>
							<td>Goods</td>
							<td align="left">
								指定された種類の財を指定量引き出して、返します。
								指定された種類の財が指定量存在しない場合は、Exceptionが投げられます。
								typeは、引き出す財の種類。
								quantityは、引き出す財の量。
							</td>
						</tr>
<!--	/**
	 * 指定された種類の財を指定量引き出します。
	 * 指定された種類の財が指定量存在しない場合は、Exceptionが投げられます。
	 * @param type 引き出す財の種類
	 * @param quantity 引き出す財の量
	 * @return Goods 引き出された財
	 */
	public Goods removeGoods(GoodsType type, double quantity) {-->
						<tr>
							<td>Agent</td>
							<td>removeGoodsRecursibely</td>
							<td>GoodsType type, double quantity</td>
							<td>Collection</td>
							<td align="left">
								指定された種類の財を指定量引き出して、返します。
								指定された種類に下位種類があれば再帰的に検索するので、返されるのはGoodsではなくCollectionです。
								指定された種類の財が１種類でも指定量存在しない場合は、Exceptionが投げられます。
							</td>
						</tr>						
<!--	/**
	 * 指定された種類の財を指定量引き出します。
	 * 指定された種類に下位種類があれば再帰的に検索します。
	 * 指定された種類の財が指定量存在しない場合は、Exceptionが投げられます。
	 * @param type 引き出す財の種類
	 * @param quantity 引き出す財の量
	 * @return Goods 引き出された財
	 */
	public Collection removeGoodsRecursively(GoodsType type, double quantity) {
-->
						<tr>
							<td>Agent</td>
							<td>removeAllGoods</td>
							<td>GoodsType type</td>
							<td>Goods</td>
							<td align="left">
								指定された種類の財をすべて引き出して、返します。
								指定された種類の財が存在しない場合は、Exceptionが投げられます。
							</td>
						</tr>						
<!--	/**
	 * 指定された種類の財をすべて引き出します。
	 * 指定された種類の財が存在しない場合は、Exceptionが投げられます。	
	 * @param type 引き出す財の種類
	 * @return Goods 引き出された財
	 */
	public Goods removeAllGoods(GoodsType type) {
-->
						<tr>
							<td>Agent</td>
							<td>removeAllGoodsRecursively</td>
							<td>GoodsType type</td>
							<td>Collection</td>
							<td align="left">
								指定された種類の財を全て引き出して、返します。
								指定された種類に下位種類があれば再帰的に検索するので、返されるのはGoodsではなくCollectionです。
								指定された種類の財が１種類でも存在しない場合は、Exceptionが投げられます。
							</td>
						</tr>						
<!--	/**
	 * 指定された種類の財をすべて引き出します。
	 * 指定された種類に下位種類があれば再帰的に検索します。
	 * 指定された種類の財が存在しない場合は、Exceptionが投げられます。
	 * @param type 引き出す財の種類
	 * @return Goods 引き出された財
	 */
	public Collection removeAllGoodsRecursively(GoodsType type) {
-->
						<tr>
							<td>Agent</td>
							<td>getQuantity</td>
							<td>GoodsType type</td>
							<td>GoodsQuantity</td>
							<td align="left">
								指定された種類の財の量を取得します。
								指定された種類の財が無ければ0を表すGoodsQuantityインスタンスが返されます。
								取得したGoodsQuantityからint、doubleを得るには、GoodsQuantityのもつgetValueAsInt()、getValueAsDouble()を使用して下さい。
							</td>
						</tr>
<!--	/**
	 * 指定された種類の財の量を取得します。
	 * 指定された種類の財が無ければ0を表すGoodsQuantityインスタンスが返されます。
	 * @param type 調べる財の種類
	 * @return GoodsQuantity 財の量
	 */
	public GoodsQuantity (GoodsType type) {
-->
						<tr>
							<td>Agent</td>
							<td>getQuantityRecursively</td>
							<td>GoodsType type</td>
							<td>GoodsQuantity</td>
							<td align="left">
								指定された種類の財の量を取得します。
								指定された種類に下位種類があれば再帰的に検索します。
								指定された種類の財が無ければ0を表すGoodsQuantityインスタンスが返されます。
								取得したGoodsQuantityからint、doubleを得るには、GoodsQuantityのもつgetValueAsInt()、getValueAsDouble()を使用して下さい。
							</td>
						</tr>						
<!--	/**
	 * 指定された種類の財の量を取得します。
	 * 指定された種類に下位種類があれば再帰的に検索します。
	 * 指定された種類の財が無ければ0を表すGoodsQuantityインスタンスが返されます。
	 * @param type 調べる財の種類
	 * @return GoodsQuantity 財の量の合計
	 */
	public GoodsQuantity getQuantityRecursively(GoodsType type) {
-->
						<tr>
							<td>Agent</td>
							<td>hasGoods</td>
							<td>GoodsType type</td>
							<td>boolean</td>
							<td align="left">
								指定された種類の財を持っているかどうか、真偽を返します。
							</td>
						</tr>
<!--	/**
	 * 指定された種類の持っているかどうか調べます
	 * @return boolean 持っているかどうか
	 */
	public boolean hasGoods(GoodsType type) {
-->
						<tr>
							<td>Agent</td>
							<td>getGoodsTypes</td>
							<td>なし</td>
							<td>Collection</td>
							<td align="left">
								このAgentが持つ全ての財の種類を返します。
							</td>
						</tr>						
<!--	/**
	 * このGoodsManagerが持つ全ての財の種類を返します
	 * @return Collection GoodsTypeのリスト
	 */
	public Collection getGoodsTypes() {
-->
					</tbody>
				</table>
			</subsection>
			<subsection title="情報の追加/取り出し">
				<table style="width:100%" title="所有情報の追加/取り出しメソッド一覧">
					<thead>
						<tr>
							<th>クラス</th>
							<th>メソッド名</th>
							<th>引数</th>
							<th>戻り値</th>							
							<th>説明</th>
						</tr>
					</thead>
					<tbody>
						<tr>
							<td>Agent</td>
							<td>putInformation</td>
							<td>Information key, Information value</td>
							<td>なし</td>
							<td align="left">
								エージェントに情報を追加します。
								keyは、取り出す時の検索キー（情報）。
								valueは、追加したい情報。
							</td>
						</tr>						
<!--		/**
	 * Informationを追加します。KeyにInformationを指定してください。
	 * @param key キーのInformation
	 * @param value 値のInformation
	 */
	public void putInformation(Information key, Information value) {-->
						<tr>
							<td>Agent</td>
							<td>getInformation</td>
							<td>Information key</td>
							<td>Information</td>
							<td align="left">
								引数のInformationをキーとするInformation(cloneではありません)を返します。
								キーが見つからなかった場合、Exceptionを返します。
							</td>
						</tr>
<!--	/**
	 * 引数のInformationTypeと一致するInformation(cloneではありません)を返します
	 * Informationが見つからなかった場合、Exceptionを返します。
	 * @param key
	 * @return Information
	 */
	public Information getInformation(Information key) {-->
						<tr>
							<td>Agent</td>
							<td>removeInformation</td>
							<td>Information key</td>
							<td>Information</td>
							<td align="left">
								引数のInformationをキーとするInformation(cloneではありません)を削除して、返します。
								キーが見つからなかった場合、Exceptionを返します。
							</td>
						</tr>						
<!--	/**
	 * 引数のInformationTypeと一致するInformationを削除します。
	 * Informationが見つからなかった場合、Exceptionを返します。
	 * @param key 検索キー
	 * @return Information 削除したInformation
	 */
	public Information removeInformation(Information key) {-->
					</tbody>
				</table>
			</subsection>
			<subsection title="関係の追加/取り出し">
				<table style="width:100%" title="関係の追加/取り出しメソッド一覧">
					<thead>
						<tr>
							<th>クラス</th>
							<th>メソッド名</th>
							<th>引数</th>
							<th>戻り値</th>							
							<th>説明</th>
						</tr>
					</thead>
					<tbody>
						<tr>
							<td>Agent</td>
							<td>addRelation</td>
							<td>RelationType relationType, Agent target</td>
							<td>なし</td>
							<td align="left">
								関係を追加します。エージェントは同じ種類の関係を複数もつことができます。
								relationTypeは、追加したい関係のType。
								targetは、関係先のAgent。
							</td>
						</tr>						
<!--	/**
	* Relationを追加します。
	* @param relation 追加するRelation
	*/
	public void addRelation(RelationType relationType, Agent target) {
-->
						<tr>
							<td>Agent</td>
							<td>addRelation</td>
							<td>Agent target</td>
							<td>なし</td>
							<td align="left">
								デフォルトのTypeを利用して関係を追加します。
								モデル内で関係を１種類しか使わない時や、全てのエージェントが関係を１種類しかもたない時に使用して下さい。
							</td>
						</tr>						
<!--		/**
	* デフォルトのTypeを利用してRelationを追加します。
	* @param relation 追加するRelation
	*/
	public void addRelation(Agent target) {
-->
						<tr>
							<td>Agent</td>
							<td>getRelation</td>
							<td>RelationType type</td>
							<td>Relation</td>
							<td align="left">
								引数のTypeである関係を返します。（複数ある場合、一番最初に追加された関係を返します）
								もし、存在しなければExceptionが投げられます。
							</td>
						</tr>						
<!--	/**
	 * 引数のTypeであるRelationを返します。（複数ある場合、最初のRelationを返します。）
	 * もし、存在しなければExceptionが投げられます。
	 * @param type 検索対象のType
	 * @return Relation 該当するRelation
	 */
	public Relation getRelation(RelationType type) {
-->
						<tr>
							<td>Agent</td>
							<td>getRelation</td>
							<td>RelationType type, Agent agent</td>
							<td>Relation</td>
							<td align="left">
								引数のType、かつ関係先が引数のAgentである関係を返します。
							</td>
						</tr>						
<!--	/**
	 * 引数のType、かつ関係先が引数のAgentであるRelationを返します
	 */
	public Relation getRelation(RelationType type, Agent agent) {
-->
						<tr>
							<td>Agent</td>
							<td>getRelations</td>
							<td>RelationType type</td>
							<td>Collection</td>
							<td align="left">
								引数のTypeである関係を全て返します。
								もし、存在しなければ空のCollectionが返されます。
							</td>
						</tr>
<!--	/**
	 * 引数のTypeであるrelationをリストとして全て返します。
	 * もし、存在しなければExceptionが投げられます。
	 * @param type 検索対象のType
	 * @return Collection 該当するRelationのリスト
	 */
	public Collection getRelations(RelationType type) {
-->
						<tr>
							<td>Agent</td>
							<td>getRelationsRecursively</td>
							<td>RelationType type</td>
							<td>Collection</td>
							<td align="left">
								引数のType及びそのTypeの子のTypeである全ての関係を返します。
								もし、存在しなければ空のCollectionが返されます。
							</td>
						</tr>						
<!--	/**
	 * 引数のType及びそのTypeの子のTypeである全てのrelationを返します。
	 * もし、存在しなければ空のリストが返されます
	 * @param type 検索対象のType
	 * @return Collection 該当するRelationのリスト
	 */
	public Collection getRelationsRecursively(RelationType type) {
-->
						<tr>
							<td>Agent</td>
							<td>removeRelation</td>
							<td>Relation relation</td>
							<td>なし</td>
							<td align="left">
								引数の関係を削除します。
							</td>
						</tr>						
<!--	/**
	 * 引数のRelationを削除します。
	 * @param relation 削除対象のRelation
	 */
	public void removeRelation(Relation relation) {
-->
						<tr>
							<td>Agent</td>
							<td>removeRelations</td>
							<td>RelationType type</td>
							<td>なし</td>
							<td align="left">
								引数のTypeの関係全てを削除します。
							</td>
						</tr>						
<!--	/**
	 * 引数のTypeのRelation全てを削除します。
	 * @param type 削除対象のType
	 */
	public void removeRelations(RelationType type) {
-->
						<tr>
							<td>Agent</td>
							<td>removeRelationsRecursively</td>
							<td>RelationType type</td>
							<td>なし</td>
							<td align="left">
								引数のType及びその子Typeの関係全てを削除します。
							</td>
						</tr>						
<!--	/**
	 * 引数のType及びその子TypeのRelation全てを削除します。
	 * @param type 削除対象のType
	 */
	public void removeRelationsRecursively(RelationType type) {
-->
						<tr>
							<td>Agent</td>
							<td>getRelationTypes</td>
							<td>なし</td>
							<td>Collection</td>
							<td align="left">
								このRelaitonManagerの持つ関係のTypeを返します。
								もし、存在しなければExceptionが投げられます。
							</td>
						</tr>						
<!--	/**
	 * このRelaitonManagerの持つRelationのTypeを返します。
	 * もし、存在しなければExceptionが投げられます。
	 * @return Collection Relationの持つTypeのリスト
	 */
	public Collection getRelationTypes() {
-->
					</tbody>
				</table>
			</subsection>
			<subsection title="行動の追加/取り出し">
				<table style="width:100%" title="行動の追加/取り出しメソッド一覧">
					<thead>
						<tr>
							<th>クラス</th>
							<th>メソッド名</th>
							<th>引数</th>
							<th>戻り値</th>							
							<th>説明</th>
						</tr>
					</thead>
					<tbody>
						<tr>
							<td>Agent</td>
							<td>addBehavior</td>
							<td>BehaviorType type</td>
							<td>なし</td>
							<td align="left">
								Behaviorを追加します。追加されたBehaviorは開始状態をとります。
								この時、追加されたBehaviorにはAgentがセットされます。
							</td>
						</tr>						
<!--		/**
	 * Behaviorを追加します。追加されたBehaviorは開始状態をとります。
	 * この時、追加されたBehaviorにAgentをセットします。
	 * @param newBehavior 新しく追加するBehaviorのType
	 */
	public void addBehavior(BehaviorType type) {-->
						<tr>
							<td>Agent</td>
							<td>getBehavior</td>
							<td>BehaviorType type</td>
							<td>Behavior</td>
							<td align="left">
								引数のTypeであるBehaviorを返します。
									(複数存在していた場合、一番初めに追加されたBehaviorを返します)
								もし、存在しなければExceptionが投げられます。
							</td>
						</tr>
<!--	 	/**
	 * 引数のTypeであるBehaviorを返します。(複数存在していた場合、一番初めに追加されたBehaviorを返します。)
	 * もし、存在しなければExceptionが投げられます。
	 * @param type 検索対象のType
	 * @return Collection 該当するBehaviorのリスト
	 */
	public Behavior getBehavior(BehaviorType type) {-->
						<tr>
							<td>Agent</td>
							<td>getBehaviors</td>
							<td>BehaviorType type</td>
							<td>Collection</td>
							<td align="left">
								引数のTypeであるBehaviorをCollectionとしてとして全て返します。
								もし、存在しなければ空のCollectionを返します。
							</td>
						</tr>						
<!--	/**
	 * 引数のTypeであるrelationをCollectionとして全て返します。
	 * もし、存在しなければ空のCollectionを返します。
	 * @param type 検索対象のType
	 * @return List 該当するRelationのリスト
	 */
	public Collection getBehaviors(BehaviorType type) {-->
						<tr>
							<td>Agent</td>
							<td>getBehaviorsRecursively</td>
							<td>BehaviorType type</td>
							<td>Collection</td>
							<td align="left">
								引数のTypeおよびその子であるBehaviorをCollectionとしてとして全て返します。
								もし、存在しなければ空のCollectionを返します。
							</td>
						</tr>	
<!--	/**
	 * 引数のType及びその子タイプであるBehaviorをCollectionとして全て返します。
	 * もし、存在しなければ空のCollectionを返します。
	 * @param type 検索対象のType
	 * @return List 該当するBehaviorのリスト
	 */
	public Collection getBehaviorsRecursively(BehaviorType type) {-->
						<tr>
							<td>Agent</td>
							<td>removeBehavior</td>
							<td>Behavior behavior</td>
							<td>なし</td>
							<td align="left">
								Behaviorを終了して削除します。
								（Behavior終了には、特にトラブルが予想されますので、注意して使用して下さい）
							</td>
						</tr>						
<!--	/**
	 * Behaviorを終了して削除します。
	 * このメソッドに限り、Behavior終了のトラブルを避けるためprotectedにします。
	 * @param target 削除するBehavior
	 */
	public void removeBehavior(Behavior behavior) {-->
					</tbody>
				</table>
			</subsection>
		</section>	
		
		<section title="世界のメソッド一覧">
			<p>シミュレーション実行に不可欠な「時間経過」を設定するメソッド、空間を設定するメソッド、
				そしてエージェントや財の生成/消滅を行うメソッドを用意しています。</p>
			<subsection title="シミュレーション時計・空間の設定/取得">
				<table style="width:100%" title="シミュレーション時計・空間の設定/取得メソッド一覧">
					<thead>
						<tr>
							<th>クラス</th>
							<th>メソッド名</th>
							<th>引数</th>
							<th>戻り値</th>							
							<th>説明</th>
						</tr>
					</thead>
					<tbody>
						<tr>
							<td>World</td>
							<td>setClock</td>
							<td>Clock clock</td>
							<td>なし</td>
							<td align="left">
								モデル内の時間経過をつかさどる時計を設定します。
								このメソッドを用いて時間経過を設定してはじめて、シミュレーション実行時にモデル内にTimeEventが投げられるようになります。
								連続的な時間経過を扱うモデルでない限り、引数として、new StepClock()が使用できます。
							</td>
						</tr>						
<!--		/**
	* global時間を設定します。
	* @param clock 設定する時間
	*/
	public void setClock(Clock clock) {
		this.clock = clock;
		clock.setWorld(this);
	}-->
						<tr>
							<td>World</td>
							<td>getClock</td>
							<td>なし</td>
							<td>Clock</td>
							<td align="left">
								このWorldが保持するClockを取得します。
								存在しない場合、nullを返します。
							</td>
						</tr>						
<!--	/**
	* このWorldが保持するClockを取得します。
	* @return clock このWorldのClock
	*/
	public Clock getClock() {
		return this.clock;
	}-->
						<tr>
							<td>World</td>
							<td>setSpace</td>
							<td>Space space</td>
							<td>なし</td>
							<td align="left">
								モデル内の地理的空間を設定します。
								地理的空間を扱わないモデルであれば、このメソッドは使いません。。
							</td>
						</tr>						
<!--	/**
	* global空間を設定します。
	* @param space 設定する空間
	*/
	public void setSpace(Space space) {
		this.space = space;
	}
-->
						<tr>
							<td>World</td>
							<td>getSpace</td>
							<td>なし</td>
							<td>Space</td>
							<td align="left">
								このWorldが保持する空間を取得します。
								存在しない場合、nullを返します。
							</td>
						</tr>						
<!--	/**
	* このWorldが保持する空間を取得します。
	* @return space 空間
	*/
	public Space getSpace() {
		return this.space;
	}-->
					</tbody>
				</table>
			</subsection>
			<subsection title="エージェントの生成/参照/削除">
				<table style="width:100%" title="エージェントの生成/参照/削除メソッド一覧">
					<thead>
						<tr>
							<th>クラス</th>
							<th>メソッド名</th>
							<th>引数</th>
							<th>戻り値</th>							
							<th>説明</th>
						</tr>
					</thead>
					<tbody>
						<tr>
							<td>World</td>
							<td>createAgent</td>
							<td>AgentType type</td>
							<td>Agent</td>
							<td align="left">
								引数のTypeのエージェントを生成して、Worldに追加します。
								生成直後にAgentのinitメソッドを呼びます。
							</td>
						</tr>						
<!--	/**
	 * エージェントを生成します。生成直後にAgentのinitメソッドを呼びます。
	 * @param type 生成するAgentのType
	 * @return Agent 生成されたAgent
	 */
	public Agent createAgent(AgentType type) {-->
						<tr>
							<td>World</td>
							<td>createAgent</td>
							<td>なし</td>
							<td>Agent</td>
							<td align="left">
								デフォルトのTypeを使用したエージェントを生成して、Worldに追加します。
								モデル内にエージェントが１種類しか登場しない場合や、Typeのプライオリティの設定が必要ない場合に使用して下さい。
							</td>
						</tr>						
<!--		/**
	 * デフォルトの定数を利用してエージェントを生成します。
	 * @return Agent 生成されたAgent
	 */
	public Agent createAgent() {-->
						<tr>
							<td>World</td>
							<td>destoryAgent</td>
							<td>Agent agent</td>
							<td>なし</td>
							<td align="left">
								WorldからAgentを削除します。Agentの死亡・消滅を意味します。
								存在しない場合、Exceptionを投げます。
							</td>
						</tr>						
<!--		/**
	 * 
	 * 存在しない場合、Exceptionを投げます。
	 * @param target 削除するAgent
	 */
	public void destroyAgent(Agent agent) {-->
						<tr>
							<td>World</td>
							<td>getAgent</td>
							<td>AgentType type</td>
							<td>Agent</td>
							<td align="left">
								引数のTypeのAgentを返します。複数ある場合、一番最初に追加されたAgentを返します。
								存在しない場合、Exceptionを投げます。
							</td>
						</tr>						
<!--		/**
	 * 引数のTypeのAgentを返します。複数ある場合、最初のAgentを返します。
	 * もしなければ、Exceptionを返します。
	 * @param type 指定するAgentType
	 * @return Agent 該当するAgent
	 */
	public Agent getAgent(AgentType type) {
		return this.agentManager.getAgent(type);
	}-->
						<tr>
							<td>World</td>
							<td>getAgents</td>
							<td>AgentType type</td>
							<td>Collection</td>
							<td align="left">
								引数のTypeのAgentのCollectionを返します。
								もしなければ、空のCollectionを返します。
							</td>
						</tr>						
<!--
	/**	 
	 * 引数のTypeのAgentのCollectionを返します。
	 * もしなければ、空のCollectionを返します。
	 * @param type 指定するAgentType
	 * @return Collection 該当するAgentの集合
	 */
	public Collection getAgents(AgentType type) {
		return this.agentManager.getAgents(type);
	}
-->
						<tr>
							<td>World</td>
							<td>getAgentsRecursively</td>
							<td>AgentType type</td>
							<td>Collection</td>
							<td align="left">
								引数のType及びその子TypeのAgentのCollectionを返します。
								もしなければ、空のCollectionを返します。
							</td>
						</tr>						
<!--		/**
	 * 引数のType及びその子TypeのAgentのCollectionを返します。
	 * もしなければ、空のCollectionを返します。
	 * @param type 指定するAgentType
	 * @return Collection 該当するAgentの集合
	 */
	public Collection getAgentsRecursively(AgentType type) {
		return this.agentManager.getAgentsRecursively(type);
	}-->
						<tr>
							<td>World</td>
							<td>getAllAgents</td>
							<td></td>
							<td>Collection</td>
							<td align="left">
								Worldに追加されている全てのAgentのCollectionを返します。
							</td>
						</tr>						
<!--	/**
	 * 全てのAgentの集合を返します。
	 * @return Collection Agentの集合
	 */
	public Collection getAllAgents() {
		return this.agentManager.getAllAgents();
	}
-->
					</tbody>
				</table>
			</subsection>
			<subsection title="財の生成/明示的な消費">
				<table style="width:100%" title="財の生成/明示的な消費メソッド一覧">
					<thead>
						<tr>
							<th>クラス</th>
							<th>メソッド名</th>
							<th>引数</th>
							<th>戻り値</th>							
							<th>説明</th>
						</tr>
					</thead>
					<tbody>
						<tr>
							<td>World</td>
							<td>createGoods</td>
							<td>GoodsType type, double quantity</td>
							<td>Goods</td>
							<td align="left">
								引数のtypeとquantityのGoodsを生成して返します。
							</td>
						</tr>						
<!--	/**
	* 引数に基づき、Goodsを生成して返します。
	* @param type Goodsに指定するのGoodsType
	* @param quality 生成するGoodsの量
	* @return Goods 生成されたGoods
	*/
	public Goods createGoods(GoodsType type, double quantity) {
		logger.debug("IN");

		Goods goods = new Goods(type, quantity);
		goods.setWorld(this);
		this.fireGoodsCreated(new UpdateWorldEvent(this, goods));

		logger.debug("OUT");
		return goods;
	}-->
						<tr>
							<td>World</td>
							<td>consumeGoods</td>
							<td>Goods goods</td>
							<td>なし</td>
							<td align="left">
								Goodsを消費するために明示的に呼ぶメソッドです。
								通常はAgentのremoveGoodsメソッドで「財を世界から消す」ことはできますが、
									このメソッドを使用すると、
									使用時にUpdateWorldEventが送られるので、プレゼンテーションコンポーネントなどで消費を追うことがより簡単になります。
									
							</td>
						</tr>						
<!--		/**
	 * Goodsを消費するために明示的に呼ぶメソッドです。
	 * @param goods
	 */
	public void consumeGoods(Goods goods) {
		this.fireGoodsConsumed(new UpdateWorldEvent(this, goods));
	}-->
					</tbody>
				</table>
			</subsection>
			<subsection title="タイプとプライオリティの設定">
				<table style="width:100%" title="タイプとプライオリティの設定メソッド一覧">
					<thead>
						<tr>
							<th>クラス</th>
							<th>メソッド名</th>
							<th>引数</th>
							<th>戻り値</th>							
							<th>説明</th>
						</tr>
					</thead>
					<tbody>
						<tr>
							<td>World</td>
							<td>installAgentType</td>
							<td>String name</td>
							<td>AgentType</td>
							<td align="left">
								AgentTypeを生成して返します。
								Typeの生成は必ずこれらのメソッドを用いて行って下さい。
							</td>
						</tr>						
<!--/**
	 * AgentTypeを生成して返します。Typeの生成は必ずこのメソッドを用いて行って下さい。
	 * @param name 生成するTypeの名前
	 * @return AgentType 生成されたType
	 */
	public AgentType installAgentType(String name) {
		return this.modelContainer.installAgentType(name);
	}-->
						<tr>
							<td>World</td>
							<td>installAgentType</td>
							<td>String name, int priority</td>
							<td>AgentType</td>
							<td align="left">
								プライオリティをもつAgentTypeを生成して返します。
								Typeによってエージェントの行動順を制御したい場合に使用して下さい。
								Typeの生成は必ずこれらのメソッドを用いて行って下さい。
							</td>
						</tr>						
<!--	/**
	 * AgentTypeを生成して返します。Typeの生成は必ずこのメソッドを用いて行って下さい。
	 * @param name 生成するTypeの名前
	 * @return AgentType 生成されたType
	 */
	public AgentType installAgentType(String s, int p) {
		return this.modelContainer.installAgentType(s, p);
	}-->
						<tr>
							<td>World</td>
							<td>installGoodsType</td>
							<td>String name</td>
							<td>GoodsType</td>
							<td align="left">
								GoodsTypeを生成して返します。
								Typeの生成は必ずこれらのメソッドを用いて行って下さい。
							</td>
						</tr>						
<!--	/**
	* GoodsTypeを生成して返します。Typeの生成は必ずこのメソッドを用いて行って下さい。
	* @param name 生成するTypeの名前
	* @return GoodsType 生成されたType
	*/
	public GoodsType installGoodsType(String name) {
		return this.modelContainer.installGoodsType(name);
	}-->						<tr>
							<td>World</td>
							<td>instalｌBehaviorType</td>
							<td>String name</td>
							<td>BehaviorType</td>
							<td align="left">
								BehaviorTypeを生成して返します。
								Typeの生成は必ずこれらのメソッドを用いて行って下さい。
							</td>
						</tr>						
<!--	/**
	* BehaviorTypeを生成して返します。Typeの生成は必ずこのメソッドを用いて行って下さい。
	* @param name 生成するTypeの名前
	* @return BehaviorType 生成されたType
	*/
	public BehaviorType installBehaviorType(String name) {
		return this.modelContainer.installBehaviorType(name);
	}-->						<tr>
							<td>World</td>
							<td>installRelationType</td>
							<td>String name</td>
							<td>RelationType</td>
							<td align="left">
								RelationTypeを生成して返します。
								Typeの生成は必ずこれらのメソッドを用いて行って下さい。
							</td>
						</tr>						
<!--	/**
	* Typeの生成は必ずこのメソッドを用いて行って下さい。
	* @param name 生成するTypeの名前
	* @return RelationType 生成されたType
	*/
	public RelationType installRelationType(String name) {
		return this.modelContainer.installRelationType(name);
	}-->
					</tbody>
				</table>
			</subsection>
			<subsection title="乱数ジェネレータの追加/取得">
				<table style="width:100%" title="乱数ジェネレータの追加/取得メソッド一覧">
					<thead>
						<tr>
							<th>クラス</th>
							<th>メソッド名</th>
							<th>引数</th>
							<th>戻り値</th>							
							<th>説明</th>
						</tr>
					</thead>
					<tbody>
						<tr>
							<td>World</td>
							<td>installRandomNumberGenerator</td>
							<td>RandomNumberGenerator random</td>
							<td>なし</td>
							<td align="left">
								引数のRandomNumberGeneratorをrandomMapに追加します。
								もし、同じnameのRandomNumberGeneratorが既にあれば、入れ替えます。
							</td>
						</tr>						
<!--/**
	* 引数のRandomNumberGeneratorをrandomMapに追加します。
	* もし、同じnameのRandomNumberGeneratorが既にあれば、入れ替えます。
	* @param newRandomNumberGenerator addRandomNumberGenerator
	*/
	public void installRandomNumberGenerator(RandomNumberGenerator random) {
		this.randomManager.installRandomNumberGenerator(random);
	}-->						
						<tr>
							<td>World</td>
							<td>getRandomNumberGenerator</td>
							<td>String name</td>
							<td>RandomNumberGenerator</td>
							<td align="left">
								引数のnameのRandomNumberGeneratorを検索して返します。
								存在しない場合、nullを返します。
							</td>
						</tr>						
<!--/**
	* 引数のnameのRandomNumberGeneratorを検索して返します。
	* @param randomNumberGeneratorName 検索するRandomNumberGeneratorのname
	* @return 見つかったRandomNumberGenerator（見つからなければnull）
	*/
	public RandomNumberGenerator getRandomNumberGenerator(String name) {
		return this.randomManager.getRandomNumberGenerator(name);
	}	-->
						<tr>
							<td>World</td>
							<td>getRandomNumberGenerator</td>
							<td>なし</td>
							<td>RandomNumberGenerator</td>
							<td align="left">
								DefaultのRandomNumberGeneratorを検索して返します。
								存在しない場合、nullを返します。
							</td>
						</tr>						
<!--	/**
	* DefaultのRandomNumberGeneratorを検索して返します。
	* @param randomNumberGeneratorName 検索するRandomNumberGeneratorのname
	* @return 見つかったRandomNumberGenerator（見つからなければnull）
	*/
	public RandomNumberGenerator getRandomNumberGenerator() {
		return this.randomManager.getRandomNumberGenerator(
			FMFWConstants.RANDOM_DEFAULT);
	}-->
					</tbody>
				</table>
			</subsection>
		</section>			
			
		<section title="優先順位のポリシー">
			<p>エージェントの優先順位のポリシーは以下のとおりです。</p>
			<ul>
				<li>
					同じ優先順位のエージェントはステップ毎にシャッフルされ、ランダムな順番で時計信号を受け取る。
				</li>
				<li>高い優先順位のエージェントは、低い優先順位のエージェントよりも若い順番で時計信号を受け取る。</li>
			</ul>
			<p>異なる同優先順位のAgentTypeが存在する場合も、その全てのエージェントに対してシャッフルを行います。</p>
			<p>
				例えば、AgentType-A(優先順位0), AgentType-B(優先順位0), AgentType-C(優先順位10)のタイプを持つ
				インスタンスAa, Ab, Bc, Bd, Ce, Cf(小文字はインスタンス名)がいたとすると、まず、Ce, Cfがシャッフルされ、
				ランダムな順番で時計信号が送られます。次に、同優先順位の,Aa, Ab, Bc, Bdが一度にシャッフルされ、
				ランダムな順番で時計信号が送られます。
			</p>
			<figure id="fig:priority" src="image/priority" title="プライオリティによる優先順位づけ"/>
		</section>



		<!--
		<subsection title="BESPPluginをimplementsしたクラスの実装">
			
				BESPPluginをimplementsしたArtificialMarketModel.javaを例に、Typeの定義・Priorityの設定について説明します。

				<program title="BESPPluginをimplementsしたクラスの実装(ArtificialMarketModel.java)"
					src="artificialmarket/src/model/ArtificialMarketModel.java"
					normalizer="javasrc" javasrcSyntaxHilight="true">
				</program>

			<subsubsection title="モデルで用いるTypeを定義する">
				AgentType, GoodsType, RelationTypeをpublic
					staticな変数として定義し、initialize(BESPContainer)内で初期化を行ってください。
					初期化は引数のcontainer.getModelContainer().install?Type(String)で行ってください。
			</subsubsection>
			<subsubsection title="Agentが時間信号を受け取る順番を設定する">
				
					AgentがTimeEventを受信する順番は、AgentType単位で制御し、AgentTypeのもつPriorityを設定します。
					Priorityの設定は、installAgentType(String,
					int)で行います。より早く時間信号を受け取らせたいAgentTypeの数値を高く設定してください。
					Priorityを明示的に設定しない場合は、デフォルト値(=0)となります。
			</subsubsection>
			<subsubsection title="親Type、子Typeを設定する">
				Type間に親子関係をもたせると、量検索などの処理が一括して行えて便利です。
					但し、循環関係はエラーが出ますので、注意してください。 追加にはTypeのもつaddChild(Type)を使用します。
				BEHAVIOR_Tradeに、BEHAVIOR_TradeByTrand,
					BEHAVIOR_TradeByRandomを子タイプとして持たせる場合）
			</subsubsection>
		</subsection>

		<subsection title="Worldを継承したクラスの実装">
			Worldを継承したArtificialMarketWorld.javaを例に、Worldの実装方法について説明します。

				<program title="Worldを継承したクラスの実装(ArtificialMarketWorld.java)"
					src="artificialmarket/src/model/ArtificialMarketWorld.java"
					normalizer="javasrc" javasrcSyntaxHilight="true">
				</program>

			<subsubsection title="空の世界を作成する">
				シミュレーション内の時間を制御するClockを設定します。initialize()内に記述してください。
			</subsubsection>
			<subsubsection title="Agentを世界に生成する">
				createAgent(AgentType)を使用して下さい。自動的にWorldに追加されます。
			</subsubsection>
			<subsubsection title="AgentにBehaviorをもたせる">
				
					ただし、これだけではAgentはBehaviorをもたないため、何も行動することができません。行動をもたせるにはaddBehaivor(BehaviotType)を使用してください。
			</subsubsection>
				
					以上より、Agentオブジェクト"contractor"は、シミュレーションが実行された場合に、時間信号を受け取ってアクションを起こせるようになりました。
			<subsubsection title="AgentにInformationをもたせる">
				AgentのputInformation(Class)を使用します。
			</subsubsection>
			<subsubsection title="AgentにRelationをもたせる">
				AgentのaddRelation(RelationType, Agent)を使用します。
			</subsubsection>
			<subsubsection title="グローバル変数を定義する">
				モデル内で共通して使い回ししたいグローバル変数の定義・設定方法について説明します。
				
					BESPにはWorldInitializerと呼ばれるプレゼンテーションコンポーネントがあり、グローバル変数で設定したAgent数などをシミュレーション上で自由に変更することができます。
				
					WorldInitializerを使用するには、定められた書式に従って、変更したいグローバル変数を記述しなければなりません。
				
					まず、全体像クラス図などから、定義したいグローバル変数を考えてください。その後、publicな変数をWorld内に記述します。ここでは世界で生成する投資家の数(trendTraderNum)を例にしています。
				次に、その変数のgetter, setterメソッドを追加してください。

				以上で、BESPのWorldIniticializer上でtrendTraderNumが変更できるようになりました。
			</subsubsection>
		</subsection>
		<subsection title="Informationの実装">
			人工市場モデルのOrderInformationを例に、Informationの実装について説明します。

				<program title="Informationの実装(OrderInformation.java)"
					src="artificialmarket/src/model/information/OrderInformation.java"
					normalizer="javasrc" javasrcSyntaxHilight="true">
				</program>

			第１に、InformationをimplementsしたOrderInformationクラスを作成します。
			
				第２に、設計フェーズの全体像クラス図を参照して、OrderInformationは何を内部変数として持つべきかを確認します。この場合は、「注文主」であるagent(Agent)、「注文」であるorderAction(String)、「価格」であるprice(int)、「株の量」であるamount(int)の４変数です。
			
				第３に、このクラスの可変性について考えてください。このクラスのオブジェクトは、一度生成されたら、何らかの理由によって必要になくなるまで内部変数の情報を書き換えなくてよいでしょうか？あるいは書き換えたいことがあるでしょうか？
			
				OrderInformationの場合、書き換えたいことがありませんので、変数を書き換えるsetterメソッドは記述せず、変数を参照させるgetterメソッドのみを記述します。
			
				第５に、コンストラクタを実装します。このクラスはsetterをもちませんので、生成したオブジェクトに後から新しく情報を加えることができません。従って、このクラスのコンストラクタがとる引数は、変数の数と同じ、４つです。
			
				最後に、必須ではありませんが、書いておくと便利なメソッドについて説明します。オブジェクトの内部変数の状態を出力するメソッドがあると、モデルが正しく動いているかのデバッグをする際に非常に役立ちます。OrderInformationは、デバッグの時に使用するtoString()をもっています。
			ちなみに、setterメソッドの書き方について、priceの書き換えを例に挙げておきます。
			<program>public void setPrice (int price) { this.price = price; }</program>
		</subsection>

		<subsection title="テスト方法：どのようなところでエラーが発生しやすいか">テストのしかた こまめにテストをしましょう
			.logconfの設定の仕方（状態の名前がガンガン出てくるようにする） ClassCastException
			NullPointerException</subsection>

		<subsection title="Behaviorの実装: ガード条件"> Behaviorの実装には、Component
			Builderを使用します。Component Builderのマニュアルを参照しながら、Component
			Builderを用いて、設計フェーズで作成したステートチャート図を.javaファイルに書きだしてください。 
			以下では、ステートチャート図の実装が終わり、「?Behavior.java」という名前の.javaファイルが作成された後の実装方法???TimeEventあるいはChannelEventを受け取った時のガード条件(Guard
			Condition. )、そして状態遷移中に起きるアクション(Action. )の実装方法について説明します。 
			<subsubsection title="用語説明">  <ol> <li>時間信号(TimeEvent. )</li> <li>
			経路信号(ChannelEvent. )</li> <li>ガード条件(Guard Condition. )</li> <li>
			アクション(Action. )</li> </ol>  </subsubsection> <subsubsection
			title="ガード条件の実装"> 
			ガード条件とは、状態遷移がもってある状態から次の状態へ遷移を行うか行わないかを判定する条件文であり、主体がTimeEventあるいはChannelEventを受け取った時、またはある状態に到達した時(AUTOと呼ばれます)に発生します。
			エージェントベースモデルにおけるガード条件は大きくわけて３つにわけることができます。 <ol> <li>
			TimeEventを受け取った時の条件文<ul>「状態遷移する時間に達したかどうか」を判定したい場合に用います。</ul></li> 
			<li>ChannelEventを受け取った時の条件文<ul>
			「受け取った財・情報が受け取りたいものなのかどうか」を判定したいなどの場合に用います。ある状態が複数の状態遷移をもつ場合、ガード条件を実装することで異なる財を受け取った場合の状態遷移の振り分けが実現できます。</ul></li>
			<li>AUTO、つまりその状態で常に実行される条件文<ul>
			「主体の状態がある閾値を突破したかどうか」を判定したいなどの場合に用います。</ul></li> </ol>  
			以下で、ChannelEventを受け取るガード条件とAUTOのガード条件の書き方を紹介します。
			
				<program title="ガード条件の実装(StockExchangeBehavior.java)"
					src="artificialmarket/src/model/behavior/StockExchangeBehavior.java"
					normalizer="javasrc" javasrcSyntaxHilight="true">
				</program>
				
					<subsubsubsection
			title="ChannelEventを受け取った時のガード条件の例"> 
			人工市場モデルにおいて、証券取引所(StockExchange)が投資家(Trader)から受け取る財が「お金(Money)」あるいは「株(Stock)」かどうかを判定する時のガード条件”isMached(Event
			e)”です。

	
			２行目で受け取った財の種類を参照して、”type”という変数に入れ、３行目と４行目でその”type”が”GOODS_Money”あるいは”GOOD_Stock”であるかどうかを判定しています。</subsubsubsection>
			<subsubsubsection title="AUTOのガード条件の例"> 
			人工市場モデルにおいて、証券取引所(StockExchange)が投資家(Trader)から「注文(Order)」を受け取った時にカウントしているカウンタの数値が１０回に達したかどうかを判定する時のガード条件”isAllReplyReceived(Event
			e)”です。（説明のためにコードを若干変更しています） <program>private int receiveCounter
			= 0; protected boolean isAllReplyReceived(Event e) { return
			this.receiveCounter == 10; }</program> 
			ガード条件には、「条件の真偽判定」以外の処理（主体の状態を変更するなど）は絶対に書かないでください。例えば、上記のようなAUTOのガード条件を「カウンタが１０回に達していた場合は、カウンタをゼロに戻してtrueを返す」という処理に直したとします。
			
			この時、このガード条件は、１０回に達していたとしても、次の状態に遷移することができなくなります。BESPではガード条件を同時に複数回呼び直すため、ある回で条件を満たしていても、次の回で満たしていなければ条件が満たされなかったと判定し、このような問題が発生します。</subsubsubsection></subsubsection>
			<subsubsection title="アクションの実装"> <subsubsubsection
			title="主体の所有している財の量を参照する"> 
			getAgent().getQuantity(GoodsType)を使用します。取り出したい財のTypeを指定してください。 
			<program>double amount = this.getAgent().getQuantity();</program> </subsubsubsection>
			<subsubsubsection title="主体から財を取り出す"> 
			getAgent().removeGoods(GoodsType,
			double)、　getAgent().removeAllGoods(GoodsType)メソッドを使用します。取り出したい財のType、量をを指定してください。この時、主体が所有する財は取り出した量だけ減少します。
			
			もし、指定したGoodsTypeの財が存在しない場合は、Exceptionが投げられますので、事前に財が指定量存在するかどうかを調べておいたほうがよいでしょう。
			<ol> <li>量を指定して取り出したい場合 <program>Goods money =
			this.getAgent().removeGoods(ArtificialMarketPlugin.GOODS_Money,
			10.0);</program> </li> <li>全ての量を取り出したい場合 <program>Goods allMoney =
			this.getAgent().removeAllGoods(ArtificialMarketPlugin.GOODS_Money);</program></li></ol></subsubsubsection>
			<subsubsubsection title="主体の情報を参照する"> 
			getAgent().getInformation(Class)を使用します。取り出したいInformationのclassを指定し、ダウンキャストしてください。（間違ったキャストを行うと、”ClassCastException”が投げられます）
			<ol> <li>PriceHistoryInformationというInformationを参照する場合 <program>
			PriceHistoryInformation ph = (PriceHistoryInformation)
			this.getAgent().getInformation(PriceHistoryInformation.class);</program></li></ol></subsubsubsection>
			<subsubsubsection title="財を生成する"> 
			getWorld().createGoods(GoodsType)を使用します。生成したい財のTypeを指定してください。 
			<program>Goods order =
			this.getWorld().createGoods(ArtificialMarketPlugin.GOODS_Order,
			1.0);</program> </subsubsubsection> <subsubsubsection title="財に情報を添付する"> 
			GoodsのsetAttachment(Information)を使用します。添付したいInformationを指定してください。
			<ol> <li>既にあるGoodsオブジェクト”order”に新しいOrderInformationオブジェクトを添付する場合 
			<program>order.setAttachment(new OrderInformation());</program> </li></ol></subsubsubsection>
			<subsubsubsection title="財に付随する情報を参照する"> 
			GoodsのgetAttachment()を使用します。ダウンキャストしてください。（間違ったキャストを行うと、”ClassCastException”が投げられます）
			<ol> <li>既にあるGoodsオブジェクト”order”のOrderInformationオブジェクトを参照する場合 
			<program>OrderInformation o =
			(OrderInformation)order.getAttachment();</program> </li> </ol> </subsubsubsection>
			<subsubsubsection title="関係を参照する"> 
			getAgent().getRelation(RelationType,
			Agent)、getAgent().getRelations(RelationType)を使用します。 <ol> <li>
			指定する主体を指す関係を参照する方法; 主体オブジェクト”trader23”への関係(RelationType:
			RELATION_ToTrader)を参照する場合 <program>Relation relation =
			this.getAgent().getRelation(
			ArtificialMarketModel.RELATION_ToTrader, trader23);</program> </li> 
			<li>指定するRelationTypeの関係全てを参照する方法; 関係(RelationType:
			RELATION_ToTrader)をすべて参照する場合 <program>Collection relations =
			this.getAgent().getRelations(
			ArtificialMarketModel.RELATION_ToTrader);</program> </li> </ol> </subsubsubsection>
			<subsubsubsection title="他の主体に財・情報を送る"> 
			getAgent().getRelation(RelationType, Agent), sendGoods(Relation,
			BehaviorType, Goods)を使用します。 
			財・情報を指定した１つの主体に送るときは、「どの関係を用いて」「誰の」「どんな行動に」「何を」送るのか、を考えなければなりません。
			また、複数の主体に送るときは「どの関係先の全員の」「どんな行動に」「何を」送るのか、を考えなければなりません。 
			以下では、「１つの主体を指定して財・情報を送る方法」、「複数の主体へ財・情報を送る方法」を紹介します。情報を送りたい場合は、下のsendGoods(…)をsendInformation(…)に変更してください。
			<ol> <li>１つの主体を指定して財・情報を送る方法; 主体オブジェクト”trader23”への関係(RelationType:
			RELATION_ToTrader)を用いて”trader23”の行動（BehaviorType:
			BEHAVIOR_Trader）へ財オブジェクト”contractResult”を送る場合 <program>Relation
			relation = this.getAgent().getRelation(
			ArtificialMarketModel.RELATION_ToTrader, trader23);
			this.sendGoods(relation, ArtificialMarketModel.BEHAVIOR_Trader,
			contractResult);</program> </li> <li>複数の主体へその都度新しく生成した財・情報を送る方法;
			関係（RelationType: RELATION_ToTrader）先の主体すべての行動（BehaviorType:
			BEHAVIOR_Trader）へ財（GoodsType: GOODS_StartSignal）のオブジェクトを新しく生成して送る場合 
			<program>this.sendGoods( ArtificialMarketModel.RELATION_ToTrader,
			ArtificialMarketModel.BEHAVIOR_Trade,
			ArtificialMarketModel.GOODS_StartSignal, 1.0, true);</program> </li>
			<li>複数の主体へ指定量取り出した財・情報を送る方法; 関係（RelationType:
			RELATION_ToTrader）先の主体すべての行動（BehaviorType:
			BEHAVIOR_Trader）へ財（GoodsType:
			GOODS_Money）のオブジェクトを37.0ずつだけ所有財リストから取り出して送る場合 <program>
			this.sendGoods( ArtificialMarketModel.RELATION_ToTrader,
			ArtificialMarketModel.BEHAVIOR_Trade,
			ArtificialMarketModel.GOODS_Money, 37.0, false);</program> </li> </ol></subsubsubsection>
			<subsubsubsection title="他の主体から受け取った財・情報を参照する"> 
			getReceivedGoods()、getReceivedInformation()を使用します。受け取った財・情報への参照は、次に財・情報を受け取るまで有効です。
			<ol> <li>受け取った財の参照を財オブジェクト”receivedGoods”にもたせる場合 <program>Goods
			receivedGoods = this.getReceivedGoods();</program> </li> <li>
			受け取った情報の参照をOrderInformationオブジェクト”orderInfo”にもたせる場合 <program>
			OrderInformation orderInfo = (OrderInformation)
			this.getReceivedInformation();</program> </li> </ol> </subsubsubsection>
			<subsubsubsection title="財を所有財リストにしまいこむ"> 
			getAgent().addGoods(Goods)を使用します。 <ol> <li>
			財オブジェクト”money”を所有財リストにしまう場合 <program>
			this.getAgent().addGoods(money);</program> </li> </ol> </subsubsubsection>
			<subsubsubsection title="新しいBehaviorを生成して持つ"></subsubsubsection> </subsubsection>
			Typeはinformationを継承している</subsection>
		-->
	</body>
</doc>
