倭マン's BLOG

くだらない日々の日記書いてます。 たまにプログラミング関連の記事書いてます。 書いてます。

シミュレーション設計図

今までは、物理シミュレーションに必要な部品、もう少し堅く言うと、物理シミュレーションを実現する Simulator オブジェクトを構築するための部品を個別に考えてきました。

今回はそれらの部品を構築するための設定ファイルを考えます。 以降では、このファイルをシミュレーション設計図(もしくはシミュレーション・スキーマ Simulation Schema)と呼ぶことにします。

今までで部品として定義したインターフェースは


PhysicalSystem, ObservableSet, IterationCondition, DataOutputter

です。 で、今回はまた何も観測せず、何も出力しないシミュレーションを考えましょう。 つまり ObservableSet, DataOutputter は今回は考えません。

[其ノ壱]. まず、部品となる物理系(PhysicalSystem)と反復条件(IterationCondition)の実装を考えましょう。 物理系のサンプルは1次元のランダム・ウォーク、反復条件のサンプルは10回更新を繰り返すってものにします:

import java.util.Properties;
import java.util.Random;

public class RandomWalk1D implements PhysicalSystem{
    
    /** この物理系に設定できる初期パラメータの名前。 初期位置。 */
    public static final String INITIAL_POSITION  = "Initial Position";
    
    private final Random random = new Random(); 
    int position;
    
    /** 初期位置を設定する。 */
    public void initialize(final Properties initParams) {
        if(initParams.containsKey(INITIAL_POSITION)){
            final String ip = initParams.getProperty(INITIAL_POSITION);
            this.position = Integer.parseInt(ip).intValue();
        }else{
            this.position = 0;
        }
    }
    
    /** 現在の位置をランダムに(絶対値1だけ)更新する。 */
    public void evolveState() {
        if(this.random.nextBoolean())
            this.position++;
        else 
            this.position--;
    }
}
public class CountIterationCondition implements IterationCondition{
    
    private int rest;
    private final int count = 10;
    
    public void initialize(){
        this.rest = this.count;
    }
    
    public boolean continueIteration() {
        return this.rest > 0; 
    }

    public void continued() {
        this.rest--;
    }

    public void stopped() {}
}

ローカル変数に final 宣言が付いている箇所がありますが、詳しくは『Java魂―プログラミングを極める匠の技』第2章を参照のこと。 

[其ノ弐]. さて次に必要になるのは、これらの部品を使って、Simulator オブジェクトを組み立てる“設計図”です。これを以下のように書くことにしましょう(XML ファイルで)。 

<?xml version="1.0" encoding="UTF-8"?>

<simulation-schema xmlns="http://xmlns.org.waman/simulation/0.1">
	
  <system class="RandomWalk1D"/>
	
  <init-params>
    <param name="Initial Position">100</param>
  </init-params>
    
  <iteration>
    <iteration-condition class="CountIterationCondition"/>
  </iteration>
</simulation-schema>

注意点を列挙しておくと、

  • ルート要素は simulation-schema
  • http://xmlns.org.waman/simulation/0.1”はシミュレーション設計図の名前空間。
  • system 要素で物理系を設定する(class 属性で PhysicalSystem クラス名を指定)。
  • init-param 要素下の param 要素で物理系の初期化に必要なパラメータを指定。 param 要素の name 属性でパラメータ名(PhysicalSystem#initialize() 内で使用するもの)を、子テキストでパラメータ値を指定。
  • iteration-condition 要素で反復条件を設定する(class 属性で IterationCondition クラス名を指定)。
  • iteration 要素はそのうち説明します。

[其ノ参]. 最後に必要になるのは、このファイルを使って、Simulator オブジェクトを生成するファクトリ・クラスです。 これも後日に。

次回は、反復条件で使うものはだいたい決まっているので(決まった回数繰り返すものや、観測量の測定値で繰り返すかどうかを判断するものなど)、もっと楽に指定できるようにします。

JavaWorldメモリアルDVD

JavaWorldメモリアルDVD