<?xml version='1.0' encoding='Shift_JIS' ?>
<doc xml:lang='ja'>
	<head>
	</head>
	<body>
		<subsection title="Typeの設定">
			<p>最初はTypeの追加について解説します。</p>
			<program title="SSModelの実装" src="src/model/SSModel.java"
				normalizer="javasrc" javasrcSyntaxHilight="true"
				encoding="Shift_JIS" />
			<p>
				設計フェーズで示したとおりにTypeのインストールを行っています。
				IntegerInformationを用いるInformationTypeは文字列の定数で実質的なTypeをここで設定し、インストールしています。</p>
			<p>
				また、AGENT_environmentのプライオリティーをデフォルトから+1000します。
				これにより、１ターンの中AGENT_environmentの方が先に行動することになり、AddSugarBehaviorによって最初に砂糖の再生が行われるようになります。</p>
		</subsection>
		<subsection title="Worldの実装">
			<p>Worldを継承したソースは以下のとおりです。</p>
			<program title="SSWorldの実装" src="src/model/SSWorld.java"
				normalizer="javasrc" javasrcSyntaxHilight="true"
				encoding="Shift_JIS" />
			<p>初期化において、空間設定を行っています。</p>
					<program title="初期化処理" src="src/model/SSWorld.java"
				javasrcKeyword="initializeWorld" normalizer="javasrc"
				javasrcSyntaxHilight="true" encoding="Shift_JIS" />
		
			<program title="初期化処理" src="src/model/SSWorld.java"
				javasrcKeyword="initializeAgents" normalizer="javasrc"
				javasrcSyntaxHilight="true" encoding="Shift_JIS" />
			<p>
				最初にClockとSpaceを生成し、Worldにセットしています。
				これによって時間はステップ時間であること、空間はセル2次元であることを規定します。
				そして、エージェント生成の繰り返し文の中で空間への配置を行うことにより、エージェントの配置を行います。
				配置処理を行っていないAGENT_environmentは空間に存在しないことになりますが、問題はありません</p>
		</subsection>
		<subsection title="Informationの実装">
			<p>実装上重要なSSFieldInformationについて解説します。</p>
			<program title="SSFieldInformation"
				src="src/model/information/SSFieldInformation.java"
				normalizer="javasrc" javasrcSyntaxHilight="true"
				encoding="Shift_JIS" />
			<p>
				シュガースケープの大きさと同じ2次元配列を持ち、インナークラスであるSugarScapeCellを持つことでフィールドを表現します。
				前述の砂糖の山という情報はなくなり、各セルの砂糖の最大量と現在量の情報のみをもちます。</p>
			<p>これ以外には砂糖の再生処理や取得処理用のメソッドなどを持ちますが、見ての通り、特に複雑な処理は行っていません。</p>
		</subsection>
		<subsection title="Behaviorの実装">
			<p>状態遷移の部分はコンポーネントビルダーによって正確な遷移が実現されているので、Actionについて解説します。</p>
			<subsubsection title="SSAgentBasicBehavior">
				<program title="SSAgentBasicBehavior"
					src="src/model/behavior/SSAgentBasicBehavior.java"
					normalizer="javasrc" javasrcSyntaxHilight="true"
					encoding="Shift_JIS" />
				<program title="sendRequestAction"
					src="src/model/behavior/SSAgentBasicBehavior.java"
					javasrcKeyword="sendRequestAction" normalizer="javasrc"
					javasrcSyntaxHilight="true" encoding="Shift_JIS" />
				<p>
					視界を情報として取得する部分はInformationTypeによって行っています。
					これはinitialize()時に設定されます。
					視界を取得すればあとはSSSearchRequestInformationを生成し、sendInformation()メソッドによって送るだけです。
					この際RELATION_agentToEnvを指定するため、必ず環境エージェントへ送られます。</p>
				<program title="moveAction"
					src="src/model/behavior/SSAgentBasicBehavior.java"
					javasrcKeyword="moveAction" normalizer="javasrc"
					javasrcSyntaxHilight="true" encoding="Shift_JIS" />
				<p>
					視界の調査結果を受け取り、移動先の判定をしますが、移動先の判定のアルゴリズムはcalcNextCell()で独立させます。
					ここでもCellSpaceクラスの便利なメソッドを活用しています。
					次の砂糖の要求ですが、現在のCell(これもCellSpaceクラスから取得します)をInformationとして環境エージェントに送ります。</p>
				<program title="eatSugarAction"
					src="src/model/behavior/SSAgentBasicBehavior.java"
					javasrcKeyword="eatSugarAction" normalizer="javasrc"
					javasrcSyntaxHilight="true" encoding="Shift_JIS" />
				<p>
					砂糖の獲得・消費を行います。
					獲得に関しては、このActionは環境エージェントから砂糖が送られた（ChannelEvent）を受け取ったときに呼ばれるので、そのままreceivedGoodsを追加します。
					つづいて代謝量を出し、消費をします。
					この処理は消費できない場合はExceptionを発する基礎モデルフレームワークのポリシーを利用し、try構文で行っています。
					消費できなかった場合の終了処理をCellSpaceからの除去と基礎モデルフレームワークにおけるdestroy()と2段階行っています。</p>
			</subsubsection>
			<subsubsection title="SearchBehavior">
				<program title="SearchBehavior"
					src="src/model/behavior/SearchBehavior.java"
					normalizer="javasrc" javasrcSyntaxHilight="true"
					encoding="Shift_JIS" />
				<program title="receiveSearchRequestAction"
					src="src/model/behavior/SearchBehavior.java"
					javasrcKeyword="receiveSearchRequestAction"
					normalizer="javasrc" javasrcSyntaxHilight="true"
					encoding="Shift_JIS" />
				<p>
					相対的なスコープ座標から絶対的なセル座標への変換はCellSpaceに用意されたメソッドを使っています。
					の便利メソッドによって一発で行うことができます。
					Cellクラスの集合が返されるので、それぞれについて他のエージェントがいなければCellInformationとして生成し、結果として返します。</p>
			</subsubsection>
			<subsubsection title="SendSugarBehavior">
				<program title="SendSugarBehavior"
					src="src/model/behavior/SendSugarBehavior.java"
					normalizer="javasrc" javasrcSyntaxHilight="true"
					encoding="Shift_JIS" />
				<program title="sendSugarAction"
					src="src/model/behavior/SendSugarBehavior.java"
					javasrcKeyword="sendSugarAction" normalizer="javasrc"
					javasrcSyntaxHilight="true" encoding="Shift_JIS" />
				<p>
					送られたリクエスト（Cell）に対応する砂糖を返します。
					Goodsとして砂糖を生成するのはこのタイミングです。
					それまでは、今まで実装に示したとおりセルに存在する量だけをデータとして所持しています。あらかじめ、シュガースケープにGoodsとしての砂糖オブジェクトが生成され、配置されているわけではないことに注意してください。</p>
			</subsubsection>
			<subsubsection title="AddSugarBehavior">
				<program title="AddSugarBehavior"
					src="src/model/behavior/AddSugarBehavior.java"
					normalizer="javasrc" javasrcSyntaxHilight="true"
					encoding="Shift_JIS" />
				<program title="addSugarAction"
					src="src/model/behavior/AddSugarBehavior.java"
					javasrcKeyword="addSugarAction" normalizer="javasrc"
					javasrcSyntaxHilight="true" encoding="Shift_JIS" />
				<p>
					砂糖の回復量は環境エージェントが記憶しているInformationです。
					これをもとにSSFieldInformationのメソッドを呼びます。
					このように、複雑と思われる処理はActionの中には記述せず、Informationに便利なメソッドとして実装すると、余計な部分に煩わされることなくBehaviorの中の各Actionで何をやっているかが読みやすくなります。</p>
			</subsubsection>
		</subsection>
	</body>
</doc>
