応用プロジェクト後半 第2回 (12/7) 担当:橋本先生 徳永メモ H28年度版の手順から無駄を省いて大幅に簡略化しているので、もし問題が起きたらH28年度版を参照すること。 応用プロジェクト後半 第2回 (12/7) 担当:橋本先生
今後の予定 第1回(11/30) 環境構築 第2回(12/7) サンプル実行 第3回(12/14) サンプル実行 第1回(11/30) 環境構築 第2回(12/7) サンプル実行 第3回(12/14) サンプル実行 サンプル読解(長い)・最終テーマ案 第4回(12/21) SAGSの操作 データ探しの課題 第5回(1/11) 探したデータでSim. 第6回(1/16) 発表会 最終レポート 数枚。
課題について 日本における自動車の普及予測(燃料電池自動車、ハ イブリッド車、ガソリン車、ディーゼル車、電気自動車) MADSで実現しようとするとき、自分なりのシミュレーショ ンシナリオを考えて、その際どんなデータ(水素ステー ションの設置数、環境政策の推移など)が必要なのかに ついて考察
本日の内容 ※今回と次回は基本的にmanualに従うだけで終わっ てしまう SampleSimulation 1 ~ 5 を実行 資料 (下記ページからmanual2.doc) http://www.multi.k.u-tokyo.ac.jp/lectures/pukiwiki/index.php ※今回と次回は基本的にmanualに従うだけで終わっ てしまう
詳しく知りたい人 mads-○×.jar/ sags-○×.jarファイルを解凍してeclipse 等で見てみると継承関係とかオーバーライド関係とか、 どのクラスのどのメソッドを使ってるのかわかりますよ mads-○×.jarに関しては,わざわざ解凍しなくても, eclipseの設定で,「ソース添付」と「Javadocロケーション」 を設定すると簡単に読めるようになる
Eclipseの英語版をインストールした方へ Pleiades プラグインを導入すれば日本語化できます http://mergedoc.osdn.jp/
コンパイラ準拠レベル Eclipseのバージョンによって1.5と表示されたり、5.0と表 示されたりしている それ以上のバージョンの場合は基本的に上位互換なの で変更しなくても動くはずである Collectionを用いているため コマンドプロンプト/eclipseでバージョンは合わせる セキュリティ的には昔のバージョンの保持は脆弱性に繋 がるので基本的に消しておいた方がいい
作業 Manual1.docに倣い、Sample1~5を実行 読解の課題もあるので簡単にプログラムの解説もします SAGS,Eclipse起動 Tutorialからサンプルをコピペ Javaアプリケーションの実行設定を新たに作成(メイン・ 引数・クラスパス) ※プログラム作成者は、1つのプロジェクトにつき1つのプログラムを作成することを推奨しているが、面倒なうえにプロジェクト一覧がごちゃごちゃするで、1つのプロジェクト内に複数プログラムを作成する手順を載せる。問題が出た場合は28年度資料を見てください。
Sags起動の必要性 中核となるプログラムは これらによってsagsと通信を行うため この2つを理解すればとても良い Mads/core/ASimulationAgent.java Mads/core/AServiceAgent.java これらによってsagsと通信を行うため この2つを理解すればとても良い
SAGS起動 これが起動されていることを確認する
ソースをコピペ 前回作成したプロジェクト“SampleSimulation”を展開し, srcの上で右クリック→new→class クラス名“Sample2_ServiceFunctions”とする http://www.multi.k.u- tokyo.ac.jp/mads/tutorials/Sample2_ServiceFunctions.html このページからソースをコピペして貼り付ける
サンプルごとに実行構成を作成 実行の構成 (実行構成はコピペ可能。ただしプロジェクト名やクラス 名などはちゃんと書きかえること) サンプルごとにこれらを毎回作成する必要がある。 (実行構成はコピペ可能。ただしプロジェクト名やクラス 名などはちゃんと書きかえること)
実行および構成
実行構成のコピペ 前回作成した実行構成Sample1を右クリック→複製
main Name: Sample2 Project: SampleSimulation Main class: Jade.Boot
引数 プログラムの引数欄 VM引数欄 -Xms128m -Xmx512m -container sample:Sample2_ServiceFunctions VM引数欄 -Xms128m -Xmx512m
クラスパス(確認だけ) 前回ちゃんとビルド・パス設定から、ユーザーライブラ リー“Mads”を設定できていたら、クラスパスタブのユー ザーエントリーはこのようになっているはず
SampleSimulationについて システムとしてはかなり親切で,各メソッド等に丁寧にコ メント(英語)がついているので,それを読めば何をして いるのかわかる システム開発のコーディング規約によってはコメントを残すと 怒られる 中身について触りだけ説明する
SampleSimulation1 これらは何者か? public class Sample1_HelloWorld extends ASimulationAgent { public void doWork(){ System.out.println("Hello world !!! \n My first simulation"); }
ASimulationAgent - madsで中核を担うクラス public abstract class ASimulationAgent extends Agent{ 抽象クラスASimulationAgentはJADEのAgentクラスを継承している (参考:JavaAgentDEvelopmentFramework) public abstract void doWork(); 抽象メソッドdoWork()は定義・呼び出し方だけ決めてある。中身は空っぽ。 …抽象メソッドは必ずオーバーライドしなければならない 実行用クラス。Thread実行にはrun()メソッドが中で必要 class WorkThread extends java.lang.Thread{ public void run(){ doWork(); } 継承とは?…サブクラスはスーパークラスの変数定義やメソッドなどを受け継ぐ。 抽象クラスASimulationAgent…具体的な記述を行わずに共通部分だけ設計して、詳細は各々のサンプルで
SampleSimulation1 抽象メソッドdoWork()をオーバーライドし,Hello Worldを 出力させている オーバーライドとは… オーバーライドとはスーパークラスにおいて定義されているインスタン スメソッドを、サブクラス内で再定義することを言います。スーパークラ スのメソッドを変更することはできないが、サブクラスに特化した機能を 付与する必要がある場合などに使用します。 (参考:Javaの道,http://www.javaroad.jp/java_class8.htm,2013/12/4閲覧)
SampleSimulation2 ServiceFunction sf1 = new ServiceFunction(); ServiceFunction sf2 = new ServiceFunction(2000, 30); 型 変数名 を指定してインスタンス作成 コンストラクタは異なる引数をとれる (型を選択して右クリック→Open Declarationで中身確認) sf1.setBase(2000); sf1.setRange(50); 時刻2000,範囲50とセットする Javaオブジェクト指向でよくあるセッター
SampleSimulation2 for (int time = 2000; time <= 2050; time++) sf1.setValue(time, 100); 100を𝑡∈[2000,2050]でセット for (int time = sf2.getBase(); time <= sf2.getBase() + sf2.getRange(); time++) sf2.setValue(time, time); 時刻timeにデータtimeをセットする
データ出力/プロット System.out.println("\n -- printing sf2, using getValue()"); for (int time = sf2.getBase(); time <= sf2.getBase() + sf2.getRange(); time++) System.out.println(time + " -> " + sf2.getValue(time)); System.out.println("\n -- printing sf1, using print(), for the whole time range"); sf1.print(); System.out.println("\n -- printing sf2, using print(), between 2010 and 2020"); sf2.print(2010, 2020); System.out.println("\n -- printing sf2 in the short form"); System.out.println(sf2); sf2.plot("Y axis title", "sf2 for the whole time range"); sf2.plot(2010, 2020, "Y axis title", "sf2 between 2010 and 2020");
データ出力/プロット ServiceFunction sfSum = sf1.plus(sf2); System.out.println("\n -- printing sfSum = sf1 + sf2"); sfSum.print(); sf1.minus(sf1).plot("Value", "Difference between sf1 and sf1"); System.out.println("\nThe minimum of sf2 is : " + sf2.min()); System.out.println("The maximum of sf2 is : " + sf2.max()); System.out.println("The mean of sf2 is :" + sf2.mean()); System.out.println("The maximum of sf2 is reached in : " + sf2.tmax()); System.out.println("The minimum of sf2 is reached in : " + sf2.tmin()); System.out.println("The function sf2 reaches 2015 for the first time in : " + sf2.firstTimeIn(2000, 2015)); sf2.saveToFile("c:\\sf2.txt");
その他のSampleSimulation これらも同様に解釈していけば大丈夫