第17話 H1勾配法を用いた最適化のアルゴリズム
前回までの記事で、\(H^1\) 勾配法の理論的な背景について解説してきました。 数学的に込み入った話が続いてしまったので、今回の記事ではもう少しとっつきやすい話題として、OPTISHAPE-TSで採用している構造最適化のアルゴリズムの概略をご紹介します。
*****
はじめにアルゴリズムの全体像を眺めてみましょう。 アルゴリズムの都合で一部の処理がループの外に書かれることになるので、中身としては同じだということを表すために頭に数字を振っています。
少々複雑に感じますが、大きく分けると「状態方程式を解く(1.)」ということと「設計変数を更新する(2. ~ 5.)」ということの2つを、目的関数の減少が収束するまで繰り返しているだけです。 以下ではそれぞれの手順の詳細について説明します。
1. 状態方程式を解き、評価関数の値を計算する。
線形弾性問題や固有値問題などで表される状態方程式を解いて、その解である状態変数を求めます。 そして得られた状態変数を用いて評価関数の値を計算します。 状態変数はこの後で感度の計算にも用いられます。
2. 随伴方程式を解き、評価関数の感度を計算する。
評価関数の感度を計算するためには、状態変数に加えて随伴問題の解である随伴変数が必要となります。 随伴問題は評価関数の種類ごとに存在する方程式で、感度を理論的に導出する際に現れるものとなります。
この方程式は状態方程式に似た形をしますが、計算負荷がより軽い問題となることが多いです。 特に、コンプライアンスなどの一部の評価関数は随伴方程式が状態方程式と一致するため、そもそもこの方程式を解く必要がなくなることもあります。 このような評価関数は随伴変数が自身の状態変数と一致することから自己随伴とも呼ばれます。
3. \(H^1\) 勾配法で設計変数の変動を計算する。
それぞれの評価関数に対して感度が得られたら、\(H^1\) 勾配法を用いて設計変数の変動をそれぞれの評価関数ごとに求めます。
4. 変動の重み係数を計算する。
それぞれの評価関数ごとに設計変数の変動を求めたら、それらの適切な重み係数を求めます。 この「適切な重み」には次の3つの要件が含まれます:
- 最終的な設計変数の変動の大きさがある既定値となる。
- 目的関数の値が減少する。
- 制約関数で表される制約がすべて満たされる。
i. については、最適化を安定させるための要件となります。 設計変数の変動が大きすぎると最適化が不安定になり、小さすぎると最適化が収束するまでの反復の回数が増えてしまうので、最適化が不安定にならない程度に大きい値をとるようにします。
ii. および iii. については、最適化における評価関数の本質的な要件となります。 ある評価関数に対する変動の重みを効かせると別の評価関数の値が上昇してしまい、その別の評価関数の重みを効かせるとさらにまた別の評価関数の値が上昇してしまい、・・・ともぐら叩きのようになってしまうので、すべての制約関数が満たされつつ目的関数の値が減少するような重みの組み合わせをうまく求める必要があります。
5. 設計変数を更新する。
それぞれの評価関数に対する設計変数の変動について適切な重み係数が求まったら、その線形結合で表される変動が最終的な設計変数の変動となります。 それを設計変数に足して、設計変数を更新します。
6. 満たしていない制約関数を満たす。
4. のときの重み係数はそれぞれの評価関数の微分に基づいて計算されます。 したがって評価関数の非線形性が強い場合は、実際に設計変数を更新して評価関数の値を計算した際に制約関数が制約を満たさないことがあります。 そのような場合のみ、制約をすべて満たすように設計変数を修正します。 今回の記事では詳細まで立ち入りませんが、基本的には 1. から 5. までの処理の繰り返しと同じです。
*****
ざっくりとではありましたが、OPTISHAPE-TS における構造最適化のアルゴリズムをご紹介しました。 もちろんこのアルゴリズムは最適化問題の解法の一例にすぎませんが、なんとなくでもどのような手順で最適化を行っているかがご理解いただけたのであれば幸いです。
★ご意見・ご感想はこちらへ★
https://www.quint.co.jp/cgi-bin/qrepo-impr.cgi