応用プロジェクト後半 第2回(11/26) 担当:奥田教授 応用プロジェクト後半 第2回(11/26) 担当:奥田教授
今後の予定 第1回(11/19) 環境構築 第2回(11/26) サンプル実行 第3回(12/3) サンプル実行 第1回(11/19) 環境構築 第2回(11/26) サンプル実行 第3回(12/3) サンプル実行 サンプル読解(長い)・最終テーマ案 第4回(12/10) SAGSの操作 データ探しの課題 第5回(12/17) 探したデータでSim. 第6回(12/24) 発表会 最終レポート 数枚。
課題について 日本における自動車の普及予測(燃料電池自動車、ハイブリッド車、ガソリン車、ディーゼル車、電気自動車)MADSで実現しようとするとき、自分なりのシミュレーションシナリオを考えて、その際どんなデータ(水素ステーションの設置数、環境政策の推移など)が必要なのかについて考察
本日の内容 SampleSimulation 1 ~ 5 を実行 SampleSimulation 1 ~ 5 の中身を吟味 資料 (下記ページからmanual2.doc) http://www.multi.k.u-tokyo.ac.jp/lectures/pukiwiki/index.php ※今回と次回は基本的にmanualに従うだけで終わってしまう
詳しく知りたい人 mads-○×.jar/ sags-○×.jarファイルを解凍してeclipse等で見てみると継承関係とかオーバーライド関係とか、どのクラスのどのメソッドを使ってるのかわかりますよ
作業 Manual1.docに倣い、Sample1~5を実行 読解の課題もあるので簡単にプログラムの解説もします SAGS,Eclipse起動 新規プロジェクト作成 Tutorialからサンプルをコピペ Javaアプリケーションの実行設定を新たに作成(メイン・引数・クラスパス) ビルドパスの設定 Ctrl + F11
コンパイラ準拠レベル Eclipseのバージョンによって1.5と表示されたり、5.0と表示されたりしている それ以上のバージョンの場合は基本的に上位互換なので変更しなくても動くはずである Collectionを用いているため コマンドプロンプト/eclipseでバージョンは合わせる セキュリティ的には昔のバージョンの保持は脆弱性に繋がるので基本的に消しておいた方がいい
Sags起動の必要性 中核となるプログラムは これらによってsagsと通信を行うため この2つを理解すればとても良い Mads/core/ASimulationAgent.java Mads/core/AServiceAgent.java これらによってsagsと通信を行うため この2つを理解すればとても良い
SAGS起動 これが起動されていることを確認する
サンプルごとにプロジェクト・構成 新規プロジェクト 構成と実行 サンプルごとにこれらを毎回作成すると良い
新規Javaプロジェクト作成 Package explorer右クリック New Javaプロジェクト “SampleSimulation2”と入力
ソースをコピペ SampleSimulation2を展開し,srcの上で右クリック→new→class クラス名“Sample2_ServiceFunctions”とする http://www.multi.k.u-tokyo.ac.jp/mads/tutorials/Sample2_ServiceFunctions.html このページからソースをコピペして貼り付ける
実行および構成
新規構成の作成 Javaアプリケーションに選択をした後に,赤マル部分をクリックして新規作成
main Name: SampleSimulation2 Project: SampleSimulation2 Main class: Jade.Boot チェック×2
引数 プログラムの引数欄 VM引数欄 -Xms128m -Xmx512m -container sample:Sample2_ServiceFunctions VM引数欄 -Xms128m -Xmx512m
クラスパス ユーザー・エントリー」を選択し、右側の「外部JARの追加」 mads-all-libs.jarを追加
ビルドパス mads-all-libs.jarをプロジェクトに追加
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 これらも同様に解釈していけば大丈夫