<?xml version='1.0' encoding='Shift_JIS' ?>
<doc xml:lang='ja'>
	<head>
		<title>World</title>
	</head>
	<body>
		<p>
			経済活動を行うAgentが配置される存在としてWorld（世界）が定義されています。Worldはモデルにおける環境であり、以下のような役割を担っています。</p>
		<subsection title="Worldの機能">
			<dl>
				<dt>Agentの管理</dt>
				<dd>
					WorldはAgentを配置してそれらを管理します。それらの追加、削除、生成、取得を行うことができます。取得はAgentTypeを利用して行われます（詳細はAPIを参照してください）。</dd>
				<dt>Clock、Spaceの保持</dt>
				<dd>
					モデルにおける時間・空間を定義するためにそれぞれただ１つのClock、Spaceを持ちます。これらClock、Spaceの設定、取得はいつでも可能ですが、モデル実行中にこれらの設定を変えてもモデルが正しく動作するかは保証しません。</dd>
				<dt>RandomNumberGenerator（乱数生成アルゴリズム）の管理</dt>
				<dd>
					RandomNumberGeneratorは経済社会モデルで乱数を利用するときに用いるクラスです。現在私たちが使用しているコンピュータは、その構造上完全にランダムな数字を生成することはできませんが、複雑なアルゴリズムによって事実上乱数と捉えて差し支えない数字（擬似乱数）を生成することができます。乱数生成にはいろいろな方法があるため、モデルやモデルデザイナーによって利用したい方法も異なると考えられます。このようなことを考慮し、RandomNumberGeneratorは、乱数として数字を生成するアルゴリズムを内包して、さらに値を取得するためのメソッドを持つクラスと定義されています。RandomNumberGeneratorはWorld上に同時に複数存在できます。その場合、RandomNumberGeneratorは名前によって識別されます。Behaviorなどから名前で取得されて、利用されます。</dd>
			</dl>
			<p>
				また、（定義上）基礎モデルフレームワークには含まれない役割なのですが、BESPから見た場合、モデルそのものを表すクラスとして扱われます。これにより、BESPは直接的にはWorldクラスを扱い、WorldクラスにはBESPのコンテナ部分へアクセスするためのメソッドを持っています。</p>
		</subsection>
		<subsection title="Worldのクラス図">
			<p>上記の機能をふまえつつ、Worldと関連のクラスの構成は以下のようになっています。</p>
			<figure id="fig:lastyear1" src="image/world" title="Worldクラス図" />
			<p>
				Worldは複数のAgentオブジェクトを持ちます。また、RandomNumberGeneratorを同様に複数持ちます。そして、時間・空間を表すClock、Spaceクラスを持ちます。</p>
			<p>Worldが提供するインターフェースは以下の通りです。（詳細はAPIを参照してください。）</p>
			<dl>
				<dt>Agentの追加・削除・取得</dt>
				<dd>
					createAgent、destroyAgent、getAgent、getAllAgentなどAgentを管理するメソッド群です。Agentを削除するとそのAgentに対する他のAgentが持つRelationも削除されます。</dd>
				<dt>Goodsの生産・消費</dt>
				<dd>
					Behaviorの中でcreateGoods、cosumeGoodsメソッドを呼ぶことによってGoodsの生産・消費を行います。</dd>
				<dt>Clock、Spaceの管理</dt>
				<dd>
					getSpace、getClock、setSpace、setClockによってClock、Spaceの取得・設定を行います。</dd>
				<dt>RandomNumberGeneratorの管理</dt>
				<dd>
					RandomNumberGeneratorをインストールし、名前によって取得することができます。デフォルトの名前をクラス定数として持っています。</dd>
				<dt>Typeの追加・取得</dt>
				<dd>Typeの追加・取得を行うことが出来ます。</dd>
				<dt>Priorityの追加・取得</dt>
				<dd>AgentにTimeEventを配信する順番を制御するPriorityを管理します。</dd>
			</dl>
		</subsection>
		<subsection title="Worldの実装">
			<p>
				Worldクラスを継承したクラス（図ではMyWorld）では、initializeWorld()をオーバーライドして上記の機能を利用してAgentの配置やRelationの構築、Behaviorの追加を行ってください。</p>
			<p>
				また、ClockとSpaceについてはインターフェースだけ用意することで、時間・空間の柔軟な実装を行うことができるようにしてあります。ただし、Clockに関してはStepClock(整数で時刻を表した時計)、RealClock(実時間で時刻を表した時計)、
				Spaceに関してはCellSpace(2次元のセルで空間を表す)のコンポーネントが用意されています（詳細はAPIをご覧下さい）。これらのコンポーネントをそのまま利用すれば、新たにSpace、Clockを実装する必要はありません。</p>
		</subsection>
	</body>
</doc>
