!!!Simulationのページ !!シミュレーション方式 !ゲームループ、メインループ 無限ループを実行し、ループ毎にタイマーを進めて処理を進めていくタイプのプログラム。高速で大量の再描画を行うゲームに見られる方式のためかこう呼ばれたりもする(実際特に決まった名前はきかない?)。 *例 for(;;){ //計算 //描画 //タイマー更新 } !イベントドリブン ループ単位ではなく、特定の条件が揃ったとき(例:ボタンのクリック時)に、処理を行うタイプのプログラム。必要な動作のみを抜き出して実行するため、余分な描画などをしなくてすむ。フォームアプリなどはこの方式。 *例(C#) //イベントの登録 pictureBox.Click += new MouseEvent(pictureBoxClick); ... //click時に呼ばれるイベント pictureBoxClick(object sender, MouseEventArgs e){ //クリック時の処理 } !タスク/スタック管理 シミュレーションは乱数が絡み、かつ原因分析が重要なため、巻き戻しなどの動作が必要。そしてそのためには、常に変化を記録する必要があり、変化を記録するためには、変化を管理する必要がある。具体的には、変化にあたるタスクのリスト化とその実行までの管理を行うことになる。C/C++であれば関数ポインタ、C#ならデリゲートを用いるのが一般的。後は、各タスクに大して対になる逆の効果をもたらす処理を実装してけばよい。 !乱数 タスク管理はできれば便利だが、実装が非常に面倒。そのため、簡単に乱数が絡む動作を再現する方法として、乱数の種を固定する方法がある。生成される乱数の系列は種に依存しているため、種を固定すれば同じ状況を再現できる。 !!並列化 !グリッドっぽく *研究のシミュレーションはサンプル数が多く、長い時間がかかる(数時間〜一週間)。そのため、土壇場で大量のデータ取得が必要になる可能性を考え、できるだけ処理を分割し、多数のPCで実行できるようにしておくことが求められる。家に帰った後にWin○owsアップデートなどで自動的に再起動をかけられる危険性を回避するためにも重要。 !クラウドっぽく +学情のサーバー/研究室の空きPCなどに入れて実行 +どこかのスパコンで実行 !!