XGAG ver2 公開!

ご無沙汰しておりました。yuukivelです。いかがお過ごしでしょうか。
私自身、研究室に配属され、もう音速とか越えまくってますけどって感じで過ごしています。

さて、遺伝的アルゴリズムによる翼型最適化GUIアプリケーション
「XGAG」

のアップデートができましたので、ここで配布します。


/////////////(4月21日追記ここから)///////////
既定翼型のリンクエラーのバグを改善しました。明日32bit版も2.02に更新します。※都合により遅れています。コメントにてご指摘下さった事象の改善も含め、でき次第公開します。
64bitOS向け
XGAG_ver2.02 64bitOS

32bitOS向け
XGAG_ver2.01 32bitOS

32bitOSにて上のもので動かなかった場合、こちらを使用してみて下さい。(コンソールが表示されますが最小化して使用して下さい)
XGAG_ver2.01 32bitOS console
/////////////(4月21日追記ここまで)///////////

いつもの事ながらソースコードGitHubにて公開しています。
https://github.com/NaotoMorita/NFoilDesign

さてさて、今回のアップデートで何が変わったのか紹介します。

端的にまとめますと、
実用レベルまで完成度を高め、GA自体のカスタマイズもできるようにした。
ということです。

具体的に変更点を示します。
まずは遺伝的アルゴリズム関連から
1.遺伝子情報を「Binary表現」から「Gray表現」に変更し、収束性が向上した。
2.MOGA(多目的遺伝的アルゴリズム)によく用いられる「シェアリング手法」を導入し、世代が進んでも幅広く探索できるようになった。
3.毎世代投入するエリート遺伝子の評価関数値を毎世代更新することで、最適化計算実行中も評価関数の値を変えたりできるようになった(あまりオススメはしません)

その他UIや設定に関して
4.翼型の入出力の際にXFOILの補間、翼弦長ノーマライズ、翼型迎角リセットを実行することによって、出力される翼型の速度分布がなめらかになり、Ver1.00で推奨された速度分布平滑化が不必要になった。
5.最適化する各係数の値を表示し、設計に活かせるようになった。
6.最適化する各係数の値の範囲を、後から設定で変えられるようになった。
7.グラフの表示が見やすくなった。
8.追加キャンバーの形状がグラフに表示されるようになった。

大きくは以上8点です。他にも細かいdebugや表示の変更を行っています。

では、具体的に1から順に解説していきますね

1.Gray Cording

Gray Cording(グレイコーディング)ってなんぞやって人が大半だと思います。簡単に説明します。
XGAG ver1では遺伝子表現にbinary(2進数)表現を用いていました。この遺伝子を遺伝的アルゴリズムによって組み換えていきます。
例えば、遺伝的アルゴリズムによってある変数値を10進数にして11から12に変えたいという要請があったとしましょう。
このとき2進数表現では、1011から1100の変更となり、1と0を2箇所入れ替えなければなりません。逆に考えて、ある2進数にて0と1を1箇所入れ替えると10進数が2とか3とか変わることがあります。
これが遺伝的アルゴリズムの収束に悪影響を与えます。これを防ぐのに用いられるのが「Gray Cording」です。
Gray Codeにて0と1を1箇所入れ替えたとき、10進数も1しか変わらないようになっています。
グレイコード」とかでググるともっと詳しい解説が出てきます。

この実装により、収束性が大分改善されました。
Gray Cording実装自体もpythonの「binstr」というライブラリ
https://pypi.python.org/pypi/binstr/1.3
を見つけてこの中の関数をちょちょっと使うだけなので凄く簡単でした。

2.シェアリング手法

多目的遺伝的アルゴリズム(MOGA)では、パレート解(ある評価関数の値を改善するのに他の評価関数の値を下げなければいけない解)を効率よく探索するために、個体が密集している地域の評価関数の値を罰則として下げる「シェアリング手法」がよく用いられます。
XGAGが採用するGAはMOGAではありませんが、シェアリング手法を導入することで、局所解に陥りにくくできるのではないかと考えました。
実際、単一評価関数遺伝的アルゴリズムにシェアリング手法を導入した例を示しているものもあります。
適応的免疫アルゴリズムを用いた多峰性関数最適化に関する研究
XGAGで用いているシェアリングは表現空間シェアリング手法であり、近い形状をもつ翼型がたくさん集まっている所に罰則を科します。
各最適化係数のユークリッド距離を計算し、シェアリング半径という定数内に入ったものが、その距離に応じた罰則を受けます。
ここで難しい数式を出したくないので、詳しく知りたい方は以下の論文を参照して下さい
多目的分散遺伝的アルゴリズムにおけるシェアリング,収束判定,及び解の評価手法の検討

シェアリングを導入することによって、気持ち一つか二つの解に到達しやすくなったかな?という感じがしています。シェアリングを導入する前は実行するたびに出てくる解が違ったりするので、良い形状を探すのに人力を使っていることもありました(今のバージョンでもそれが必要な場合はありますが)ただし、シェアリング半径は設定できるようにしましたが、この値を大きな値にすると全然収束しなくなるので注意!シェアリング半径を0にするとシェアリングを行わなくできます。

「進化!」と出ているのに評価関数の値が下がったりすることがありますが、それはだいたいシェアリングのせいです。もしくは後に述べる評価関数再計算のせいとかですね。バグや退化ではありません。


3.評価関数再計算

これは(説明しなくても)いいですね。その通りです。あまり推奨されることではありませんが、例えば、翼厚が欲しい値にならないなぁ…とか感じたら、アルゴリズム実行中に評価関数の係数を変えて強制的に解を流すことができるようになりました。
レイノルズ数とか迎角もいじれますが、ちょっと高難度かなと。

4.翼型インプットに対するXFOILの積極的な利用

XFOILには、翼型の曲率が大きい所ほどたくさん点を入れてくれるといった便利な翼型補間機能(PANE)があったり、翼弦長が1じゃない翼型も相似拡大縮小して1にしてくれたり(NORM)、翼型ファイルの段階で迎え角(厳密には表現が違いますが)ついちゃったりしてる翼型の迎え角を0にしてくれたり(DERO)、いろいろ便利な機能があります。これらの機能を積極的に使うことによって、きちんと整理されていない翼型ファイルをXGAGに突っ込んでも大丈夫になりました。(もちろんきちんとしていた方が良いですが)また、この処置を行うことによって、ver1.00では必須な、難易度の高い速度分布調整を行う必要がなくなりました。つまり、XGAGで翼型を作って、そのままXFLR5とかで解析、実際に使用、といった流れが可能になったわけです。
計算の揚力係数が1.200だとか、翼厚11.00%とかの翼型が生成できたら、調整することなくそのまま使うことができるということです!(確認はしてくださいね)

以下はXGAGで作った翼型を速度分布調整することなくXFLR5解析に掛けた結果。圧力分布に不自然な振動がないのがわかります。XGAGとXFLR5ではともにXFOILを使っているので当たりまえっちゃ当たりまえだが、揚力係数の値が1.200(設計目標値)であることにも注目

5.各最適化係数の表示

以下の画像のとおり、最適化する8つのパラメータを表示しました。

これによって、「FX76MP120の割合高いなぁ…」とか「もっとDAE41使えばいいのに…」とか考えられるだけでなく、「この翼型前のと違うぞ!」とか議論することができます。

6.各最適化係数の範囲の設定

以前から要望のあった、最適化係数の範囲を変更できるようにしました。
「設定」タブの「遺伝子係数設定」で変更することができます。

この画面で先に説明したシェアリング半径の値を変えることができます。繰り返しますが、シェアリングを行わない場合はこの値を0として下さい。0.1とか1とかに設定すると、収束性が悪くなります。個人的にはデフォルト値ぐらいで良いんじゃないかなと。研究不足で何とも言えませんが。(実装したのが昨日だった)

7.グラフの表示の改良

具体的には結果の履歴タブで、点を線でつなぎました。これできるようにするのも大変だったんですよ!(汗

8.追加キャンバー表示

先に述べたとおりです。追加キャンバーは、翼型の微調整を行うためのものです。だからもちろんまっすぐだったりして変化してないように見えることもありますが、ちゃんと最適化されています!


いかがでしたでしょうか。いろいろ改善しました…大変でした…(遠い目

XGAGを用いて、もっと凄い飛行機がつくれたら、それは私の本望です。良いお話が聞けることを楽しみにしていますね!