このページは機械翻訳を使用して翻訳されました。最新版の英語を参照するには、ここをクリックします。
遺伝的アルゴリズムを用いた混合整数エンジニアリング設計問題の解決
この例では、Global Optimization Toolbox の遺伝的アルゴリズム (ga) ソルバーを使用して、混合整数エンジニアリング設計問題を解決する方法を示します。
この例で示す問題は、段状の片持ち梁の設計に関するものです。特に、梁は規定の端部荷重に耐えることができなければなりません。さまざまなエンジニアリング設計の制約に従って梁の体積を最小限に抑える問題を解決します。
この例では、[1]で公開された問題の2つの境界バージョンを解きます。
段付き片持ち梁の設計問題
下の図に示すように、段付きの片持ち梁は一端で支えられ、自由端に荷重がかかります。梁は、サポートから一定の距離
で、指定された荷重
を支えることができなければなりません。梁の設計者は、各セクションの幅 (
) と高さ (
) を変更できます。カンチレバーの各セクションの長さは同じ、
であると仮定します。

ビームの体積
梁の体積
は、個体のセクションの体積の合計である。

設計上の制約:1 - 曲げ応力
座標の中心が梁の自由端の断面の中心にある、単一の片持ち梁を考えます。梁の点
における曲げ応力は次の式で与えられる。

ここで、
は
における曲げモーメント、
は端部荷重からの距離、
は梁の面積モーメントです。
ここで、図に示す段付き片持ち梁では、梁の各セクションの最大モーメントは
です。ここで、
は梁の各セクションの端部荷重
からの最大距離です。したがって、梁の
番目のセクション
の最大応力は次のように表される。

最大応力は梁の端で発生します(
)。梁の
番目の断面の断面2次モーメントは次のように与えられる。

これを
の式に代入すると、

カンチレバーの各部分の曲げ応力は、最大許容応力
を超えてはなりません。その結果、最終的に5つの曲げ応力制約(カンチレバーの各ステップに1つずつ)を述べることができる。





設計上の制約:2 - 端面偏向
片持ち梁の端のたわみは、カスティリアーノの第二定理を用いて計算することができる。

ここで、
は梁のたわみ、
は加えられた力によって梁に蓄えられるエネルギー、
です。
片持ち梁に蓄えられたエネルギーは次のように表される。

ここで、
は
における適用された力のモーメントです。
片持ち梁の
を考えると、上記の式は次のように書けます。
![$$U = P^2/2E \int_0^l \! [(x+4l)^2/I_1 \, + (x+3l)^2/I_2 \, + (x+2l)^2/I_3 \, + (x+l)^2/I_4 \, + x^2/I_5 ]\, \mathrm{d} x$$](../examples/globaloptim/win64/steppedCantileverExample_eq17007742970191506642.png)
ここで、
はカンチレバーの
番目の部分の面積モーメントです。積分を評価すると、
の次の式が得られます。

カスティリアーノの定理を適用すると、梁の端部のたわみは次のように表される。

ここで、カンチレバーの端部たわみ
は、最大許容たわみ
より小さくなるはずで、次の制約が与えられます。

設計上の制約:3 - アスペクト比
カンチレバーの各ステップのアスペクト比は、最大許容アスペクト比
を超えてはなりません。つまり、
(
用)
最適化問題を述べる
これで、規定された制約を前提として、段付き片持ち梁の最適なパラメーターを見つけるという問題を定義できるようになりました。
、
、
、
、
、
、
、
、
、
とします。
最小化:

以下を条件とする:






、
、
、
、
ビームの最初のステップは、最も近いセンチメートル単位でのみ機械加工できます。つまり、
と
は整数である必要があります。残りの変数は連続的です。変数の境界は以下の通りです。






この問題の設計パラメーター
この例で解決する問題では、梁がサポートしなければならない端部荷重は
です。
梁の長さと最大端部たわみは次のとおりです。
ビーム全長、

梁の個体のセクション、

最大梁端たわみ、

梁の各ステップにおける最大許容応力、
梁の各段のヤング率、
混合整数最適化問題を解く
ここで、「最適化問題を述べる」で説明した問題を解決します。
適応度関数と制約関数を定義する
MATLAB ® ファイル cantileverVolume.m および cantileverConstraints.m を調べて、適応度関数と制約関数がどのように実装されているかを確認します。
線形制約に関する注意:ga に線形制約を指定する場合、通常は A、b、Aeq、および beq 入力を介して指定します。この場合、非線形制約関数を介してそれらを指定しました。これは、この例の後半で、変数の一部が離散的になるためです。問題に離散変数がある場合は、非線形制約関数で線形制約を指定する方がはるかに簡単になります。代替案としては、線形制約行列を、変換された変数空間で動作するように変更することですが、これは簡単ではなく、おそらく不可能です。また、混合整数 ga ソルバーでは、線形制約は、指定方法に関係なく、非線形制約とは異なる扱いを受けません。
境界を設定する
下限制約 (lb) と上限制約 (ub) を含むベクトルを作成します。
lb = [1 30 2.4 45 2.4 45 1 30 1 30]; ub = [5 65 3.1 60 3.1 60 5 65 5 65];
オプションを設定する
より正確なソリューションを得るために、PopulationSize および MaxGenerations オプションをデフォルト値から増やし、EliteCount および FunctionTolerance オプションを減らします。これらの設定により、ga はより大きな母集団(PopulationSize の増加) を使用し、設計空間の探索を増やし (EliteCount の減少)、最適なメンバーがほとんど変化しなくなるまで (FunctionTolerance の減少) 処理を続行します。また、ga の進行に合わせてペナルティ関数の値を監視するためのプロット関数も指定します。
混合整数問題を解くときに使用できる ga オプションのセットには制限があることに注意してください。詳細については、Global Optimization Toolbox ユーザーズ ガイドを参照してください。
opts = optimoptions(@ga, ... 'PopulationSize', 150, ... 'MaxGenerations', 200, ... 'EliteCount', 10, ... 'FunctionTolerance', 1e-8, ... 'PlotFcn', @gaplotbestf);
問題を解決するにはgaに電話する
ga を呼び出して、問題を解きます。問題文では、
と
は整数変数です。これを指定するには、非線形制約入力の後、オプション入力の前にインデックス ベクトル [1 2] から ga を渡します。再現性を確保するために、ここで乱数ジェネレーターのシードと設定も行います。
rng(0, 'twister'); [xbest, fbest, exitflag] = ga(@cantileverVolume, 10, [], [], [], [], ... lb, ub, @cantileverConstraints, [1 2], opts);
ga stopped because it exceeded options.MaxGenerations.

結果を分析する
問題に整数制約がある場合、ga はそれを内部的に再定式化します。特に、問題における適応度関数は、制約を処理するペナルティ関数に置き換えられます。実行可能な母集団メンバーの場合、ペナルティ関数は適応度関数と同じになります。
ga から返されたソリューションを以下に示します。サポートに最も近いセクションは、幅 (
) と高さ (
) が整数値に制限されており、この制約は GA によって尊重されていることに注意してください。
display(xbest);
xbest =
Columns 1 through 7
3.0000 60.0000 2.8504 57.0057 2.6114 50.6243 2.2132
Columns 8 through 10
44.2349 1.7543 35.0595
ga にビームの最適なボリュームを返すように要求することもできます。
fprintf('\nCost function returned by ga = %g\n', fbest);
Cost function returned by ga = 63408.9
離散非整数変数制約を追加する
エンジニアたちは、カンチレバーの 2 段目と 3 段目の幅と高さは標準セットからのみ選択できることを知らされます。このセクションでは、この制約を最適化問題に追加する方法を示します。この制約を追加すると、この問題は[1]で解決された問題と同一になることに注意してください。
まず、上記の最適化に追加される制約を述べる。
梁の2段目と3段目の幅は、次のセットから選択する必要があります:- [2.4、2.6、2.8、3.1] cm
梁の2段目と3段目の高さは、次のセットから選択する必要があります:- [45、50、55、60] cm
この問題を解決するには、変数
、
、
、
を離散変数として指定できる必要があります。コンポーネント
がセット
から離散値を取るように指定するには、1 から
までの値を取る整数変数
を使用して最適化し、離散値として
を使用します。範囲(1 から
) を指定するには、下限として 1 を設定し、上限として
を設定します。
そこで、まず離散変数の境界を変換します。各セットには4つのメンバーがあり、離散変数を範囲[1、4]の整数にマッピングします。したがって、これらの変数を整数にマッピングするには、各変数の下限を 1 に、上限を 4 に設定します。
lb = [1 30 1 1 1 1 1 30 1 30]; ub = [5 65 4 4 4 4 5 65 5 65];
ga ソルバーが呼び出されると、
、
、
、
の変換された (整数) バージョンが適応度関数と制約関数に渡されるようになりました。これらの関数を正しく評価するには、
、
、
、および
をこれらの関数内の指定された離散セットのメンバーに変換する必要があります。これがどのように行われるかを確認するには、MATLAB ファイル cantileverVolumeWithDisc.m、cantileverConstraintsWithDisc.m、および cantileverMapVariables.m を調べてください。
これで、ga を呼び出して離散変数の問題を解決できるようになりました。この場合、
は整数です。つまり、インデックス ベクトル 1:6 を ga に渡して整数変数を定義します。
rng(0, 'twister'); [xbestDisc, fbestDisc, exitflagDisc] = ga(@cantileverVolumeWithDisc, ... 10, [], [], [], [], lb, ub, @cantileverConstraintsWithDisc, 1:6, opts);
ga stopped because it exceeded options.MaxGenerations.

結果を分析する
xbestDisc(3:6) は ga から整数として (つまり、変換された状態で) 返されます。エンジニアリング単位での値を取得するには、変換を逆にする必要があります。
xbestDisc = cantileverMapVariables(xbestDisc); display(xbestDisc);
xbestDisc =
Columns 1 through 7
3.0000 60.0000 3.1000 55.0000 2.6000 50.0000 2.2430
Columns 8 through 10
44.8603 1.8279 36.5593
前と同様に、ga から返されるソリューションは、
と
が整数であるという制約に従います。また、
、
は[2.4、2.6、2.8、3.1] cmのセットから選択され、
、
は[45、50、55、60] cmのセットから選択されていることもわかります。
変数 x(3)、x(4)、x(5)、x(6) に追加の制約を追加したことを思い出してください。予想どおり、これらの変数に追加の離散制約がある場合、最適ソリューションの最小ボリュームは高くなります。さらに、[1]で報告された解は最小体積が
であり、[1]で報告された解とほぼ同じ解が見つかることにも注意する。
fprintf('\nCost function returned by ga = %g\n', fbestDisc);
Cost function returned by ga = 64795
まとめ
この例では、遺伝的アルゴリズム ソルバー ga を使用して、整数制約を持つ制約付き非線形最適化問題を解決する方法を示します。この例では、問題の定式化において離散変数を持つ問題を処理する方法も示しています。
参考文献
[1] Thanedar、P.B.、および G.N. Vanderplaats。"Survey of Discrete Variable Optimization for Structural Design."Journal of Structural Engineering 121 (3), 1995, pp. 301–306.