戯けた姿も生きる道ですか?

鬱屈とした学生の記録。備忘録。メモ。基本的に冗談。

シミュレーションと遺伝的アルゴリズムによる設計の最適化

モデルロケットの設計って結局のところ最適化問題だなって思ったので,やってみる.
最適化問題といえば遺伝的アルゴリズムでしょって思ったので.

はじめに

ロケットに限らず工業製品を作る際に最初(の方)にやることが設計(design).例えば,ロケットで「500kgの人工衛星を高度200kmに運ぶ」という目標があったとして,それを達成させるためにロケットの「寸法や材料,エンジンの性能など」のパラメータを決定する工程のこと.ロケットの運動方程式非線形システムなので目標からパラメータを解析的に決定することは出来ない.なので,試行錯誤的に「この部品をこういう大きさにしたらどう飛ぶかな」とシミュレーションをしながら目標との差が小さくなるパラメータを見つけるのが設計という作業(の一つ).下図でいうと,極小点(極大点)を探し山脈を地図も持たずにさまよい歩くイメージ.
f:id:kenijl1116:20170205221058j:plain
はじめての最適化(第1回):有限要素法マルチフィジックス解析ツール ANSYS:サイバネット
そんな風にモデルロケットの設計をしていて思ったのです.「つまらない」「退屈」「俺がやる必要あんの?」「それこそ機械にやらせようよ」って.「パラメータを変えてシミュレーション...パラメータを変えてシミュレーション...パラメータを変えてシミュレーション...」なんていう風に単純作業のような試行錯誤を繰り返していたら,第参話のシンジ君並みに目が死にますよ.
f:id:kenijl1116:20170204173451p:plain
というわけで機械にやらせます.上で説明した通り,設計は「目標とシミュレーション結果の差を最小化する」パラメータを見つける最適化問題.最適解を探索するアルゴリズムの一つに遺伝的アルゴリズムがあります.遺伝的アルゴリズムを使った設計の最適化の例として,新幹線やMRJがありますね.
エアロ・ダブルウィング - Wikipedia
CAE最前線―MRJ事例に見る航空機設計でのシミュレーション活用:MRJはいかにして設計されたのか (2/4) - MONOist(モノイスト)
じゃあモデロケくらい余裕っしょ.てかOpenRocketに最適化ってボタンあるしね.

問題設定

プロジェクトの目標を「200gのCanSatをなるべく高い上空で放出する」とする.つまり,200gのペイロードを乗せたモデルロケットの到達最高高度が最大化するようにパラメータを最適化する.

最適化するパラメータはエンジン,機体直径,機体長さ,錘質量とする.パラメータが好き勝手な値を取られても現実に適さない場合があるので制約を付ける.エンジンはAeroTech G79,G77,G75,G40,G78のいずれか(詳しくはThrustCurve).機体直径は0.05m~0.55m,機体長さは0.7m~7.7m,錘質量は0kg~1kgとする.

シミュレータ

ここでは簡単なシミュレータを作る.そりゃ本当はなるべく厳密なシミュレータを使った方がいいんだけど,計算時間とかいろいろ面倒なので...1次元質点の鉛直運動として考える.とはいえ,安定性も考慮したいので,安定比をいい感じの関数に入れて安定性効果(<=1)なるものを作り上げ,算出された到達高度に掛ける.もうなんか面倒くさいので細かい式とかはコード見てくれって感じ.他にもいろいろ定数を設定しましたが適当です.
f:id:kenijl1116:20170204210956p:plain
eをエンジンの種類,dを機体直径,Lを機体長さ,m_{w}を重りの重さとして,最適化するパラメータベクトルを\mathbf{x}=[e, d, L, m_{w}]とする.\mathbf{x}でのシミュレーションをした結果,到達高度がHであることをH=f(\mathbf{x})と表すことにする.fがここでいうシミュレータとなる.で,シミュレータの中身はM\frac{d^2y}{dt^2}=T+Mg+Dとなっている.ただしyは位置,Mは全質量,Tは推力,Dは抗力.安定比を\sigma=(CP-CG)/dとし,安定性効果を\epsilon(\sigma)=1-\frac{\exp(1-\sigma)^2-1}{e-1}と定義した(まぁここは適当にアレンジしてください).すると,H=f(\mathbf{x})=\epsilon(\sigma)\cdot\max(y)となる.

直観的に,最も到達高度が高くなるのはd=0.05, L=0.7, m_{w}=0.0になりそう...

遺伝的アルゴリズム

遺伝的アルゴリズム - Wikipedia
library-of-algorithm.herokuapp.com
この辺を参考に.
コンピュータの中でロケットという種の生物を作り出し,到達高度が高くなるように進化させる.
\mathbf{x}が遺伝子でシミュレーション結果Hが評価になる.
手順
1. ランダムに初期値を設定した遺伝子\mathbf{x}_{i}をもつ個体をM個用意する
2. 各個体の評価H_{i}を計算する
3. エリート選択とルーレット選択によって次世代に残る遺伝子を選ぶ
4. 交叉によって次世代の遺伝子を作る
5. 確率的に突然変異を起こす
6. 2~5を繰り返す

結果

個体数M=20とし,1000世代計算した.
最終世代の最優秀遺伝子は\mathbf{x}_{best}=[G75, 0.0568, 0.705, 0.00109],到達高度はH=422mとなった.
世代が進むごとに到達高度が上がっていく様子を以下のグラフに示す.
f:id:kenijl1116:20170205190751p:plain
ちゃんと進化してるね!こんな感じでパラメータベクトル\mathbf{x}=[e, d, L, m_{w}]が最適化されてロケットが設計できた!

まとめ

かなり単純なモデルだが,GAで設計の最適化が出来た.パラメータを増やし,より厳密なシミュレータを使えば現実味のある設計も出来そう.
GAは最適化する対象を生物に見立て進化の過程を歩ませる人工生命(人工知能っていう人もいるけど生命と知能は違うよね…).
シミュレータはただの落下分散を算出するためのツールではなく,最適化の評価関数に組み込むことによって自動的に設計してくれるマンの重要な一部になる.てか、シミュレータの意義ってそこだよね(どっかの大学のロケット団体でGAを使って設計してるとこありそう…知らんけど ).
コード→Rocket Design Optimizer (ちょっとだけましなコードに変えました.2/8)