数値の最適化を行う、Galapagosの使い方について解説します。
グラスホッパー上では、上の画像のコンポーネントになります。
今回使用したグラスホッパーデータは、ダウンロード可能です。
ダウンロードできるデータのご利用に関しては、利用規約をご覧ください。
Galapagosでできること
Galapagosを使うことで、入力した変数から、数値を最大か最小で最適化を行うことができます。
また、工夫や設定次第では、任意の数値に最適化することも可能です。
2種類の最適化方法
Galapagosには、2種類の最適化方法があります。
Evolutionary Solver(遺伝的アリゴリズム)
1つ目の方法は、Evolutionary Solver(遺伝的アリゴリズム)で、Galapagosのデフォルトの最適化方法になっています。
この方法は、生物の進化の過程のような最適化です。
ランダムに生成された個体の中から、理想に近い個体を選択、交叉(2つの個体を掛け合わせること)、当然変異させます。
この過程を複数世代繰り返すことで、より理想にに近い世代を生み出し、最終的に最後の世代から最も理想に近い個体を選択します。
Simulated Annealing Slover(焼きなまし法)
2つ目の方法は、Simulated Annealing Slover(焼きなまし法)です。
この方法は、金属工学のアニーリング(焼きなまし)から名付けられ、金属を高温にしてから次第に温度を下げていく過程があります。
高温になるほど、分子は大きく動き、温度が下がるほど分子の動きが遅くなる考えが最適化に使われています。
いくつかの最適化の手法の中には、局所的に最適解にたどり着いてしまう場合があります。
上の画像の場合、赤い点が一番理想的な結果ですが、左端の範囲のみの場合、黄色の一部の範囲の中で最適化が行われてしまうことがあります。
Simulated Annealing Slover(焼きなまし法)を使うことで、高い温度の場合は全体をシミュレーションします。
その後、徐々に温度を下げて大域的に理想的な最適解のある範囲から、最適化をすることができるようになります。
FitnessとGenome端子のつなげ方
Galapagosには、FitnessとGenomeの2つの端子があります。
Fitness
Fitnessは、日本語では適合や適性という意味です。
最適化させたい数値に、Fitness端子をつなげます。
通常の端子は、左から右につなげますが、Galapagosの場合は逆方向から端子をつなげます。
Fitnessを、最適化させたい数値のコンポーネントの右側の端子にドラッグして近づけます。
すると、緑色の矢印が表示されます。
すると、Fitness端子がつながりました。
Genome
Genomeは、日本語でゲノム(遺伝情報)という意味です。
最適化させたい数値を変える、変数の数値に、Genome端子をつなげます。
Genome端子も、右から左につなげます。
最適化させたい数値を変える、変数の数値に、Genome端子をドラッグして近づけます。
すると、赤色の矢印が表示さえます。
すると、Genome端子がつながりました。
Galapagosの変数には、Gene Poolを使いGenome端子につなげることも多くあります。
Gene Poolを使うことで、複数の変数を1つのコンポーネントで管理することができます。
今回の使用例でも、Gene Poolを使います。
基本的な最適化手順
細かい設定をしない場合の、基本的な最適化手順の流れを見てみましょう。
まず、Galapagosをダブルクリックします。
すると、このようなGalapagosの設定画面が表示されます。
その後、数値を最大値に最適化するか、最小値に最適化するかを選択します。
数値を最大化させるには、+のアイコンを選択します。
すると、FitnessがMaximizeになり、最大化させる設定になります。
数値を最小化させるには、-のアイコンを選択します。
すると、FitnessがMinimizeになり、最小化させる設定になります。
最大値か最小値の設定後、Solversタブを選択します。
その後、最適化方法を選択します。
左側のアイコンが、Evolutionary Solver(遺伝的アリゴリズム)の最適化方法です。
右側のアイコンが、Simulated Annealing Slover(焼きなまし法)の最適化方法です。
今回は、左側のEvolutionary Solver(遺伝的アリゴリズム)を使います。
最適化方法を選択後、Start Solverをクリックします。
すると、最適化が始まります。
最適化完了後、右下のOKボタンを押します。
これで、基本的な最適化ができます。
最適化の各種設定
次は、最適化の各種設定を見てみましょう。
Galapagosには、Options、Solvers、Recordの3つのタブがあります。
Optionsタブ
Optionsタブでは、最適化の一般的な設定と、Evolutionary Solver(遺伝的アリゴリズム)とSimulated Annealing Slover(焼きなまし法)の2つの最適化の設定ができます。
Generic
Genericでは、最適化の一般的な設定を行います。
Fitnessでは、数値を最大か最小のどちらに最適化をするかを決めます。
+マークを押すとMaximizeの最大、-マークを押すとMinimizeの最小に最適化されるようになります。
Thresholdでは、閾値を設定できます。
例えば、数値を50まで最大化して最適化できる場合でも、Thresholdで40と指定した場合、40を超えないようになります。
同様に数値を50まで最小化して最適化できる場合、Thresholdで60と指定すれば、60より数値が下回ることはなくなります。
Runtime LimitのEnableにチェックマークを入れると、最適化にかかる時間を制限することができます。
その後、Max. DurationのHoursに時、Minutesに分の時間数値を指定しすれば、時間制限の設定が完了します。
Evolutionary Solver
Evolutionary Solverでは、Evolutionary Solver(遺伝的アリゴリズム)の最適化方法の設定を行います。
Max. Stagnantでは、何世代分繰り返すかの数値を設定します。
数値が50の場合、50回分の世代が作成され、50回目の世代の中から理想的な個体が選択されます。
Populationでは、1つの世代の個体数の数値を設定します。
数値が50の場合、1世代に50の個体が生成されます。
Initial Boostでは、最初の第一世代の個体数を通常の何倍生み出すかの数値です。
Populationの数値が50で、Initial Boostの数値が2の場合、50×2で100個の個体が第一世代で生成されます。
第二世代以降は、50個の個体が生成されます。
Annealing Slover
Annealing Sloverでは、Simulated Annealing Slover(焼きなまし法)の最適化方法の設定を行います。
Temperatureは、他の良い解を探索する可能性の数値です。
温度だと、数値が高いほど分子が多く動くように、Temperatureの数値が高いほど、多くの可能性を探ります。
Coolingは、異なる可能性を探る際に、どれだけTemperatureの温度を下げるかの数値です。
Temperatureの温度が下がるほど、他の解を探索しなくなります。
そのため、この比率が低いほど温度が低くなるスピードが上がります。
Temperatureが100で数値が0.95の場合、100×0.95で95、95×0.95で90.25のようになっていきます。
Drift Rateは、パラメーターの変数を変更する割合の数値です。
Drift Rateが25%の場合、1回の処理で25%の四分の一の変数が変わります。
ブログページのI Eat Bugs for Breakfast のURLリンク
右半分の部分には、英語ですがGalapagosのアルゴリズムに関して書かれてあるブログのI Eat Bugs for Breakfast のURLリンクが掲載されています。
Solversタブ
Solversタブでは、最適化を実行することや、実行に関する設定を行うことができます。
左上の2つのアイコンから、最適化方法を選択できます。
左側が、Evolutionary Solver(遺伝的アリゴリズム)です。
右側が、Simulated Annealing Slover(焼きなまし法)です。
Start Solverを押すことで、最適化を始めることができます。
基本はStart From Slider Setupですが、右下の一度最適化された結果を選択している状態だと、Start From Selected Genomeを選択することができます。
この場合、選択された結果を基に再度最適化を行うことができます。
Stop Sloverを押すと、最適化を途中で止めることができます。
止めた場合、止めた時点までの最適化の結果を使うことができます。
右上のアイコンで、最適化途中の個体をライノセラス上で表示するの設定を行うことができます。
一番左のアイコンの場合、全ての最適化途中の個体が、ライノセラス上で表示されます。
左から2番目のアイコンの場合、良い個体が出現した場合のみ、ライノセラス上で表示します。
左から3番目のアイコンの場合、どの個体もライノセラス上で表示されなくなります。
一番右の卵のアイコンは、Aboutなので最適化に関する内容のはずですが、2024年9月現在では何も起きません。
最適化完了後、Reinstateを使うことができます。
右側に表示されている優れた個体を選択し、Reinstateを押すと、その結果がグラスホッパーのパラメーターに反映されるようになります。
上の赤い枠の部分は、Evolutionary Solver(遺伝的アリゴリズム)のみに表示されるアイコンです。
一番左のアイコンを選択すると、出現した全ての個体を見ることができます。
左から2番目のアイコンを選択すると、上位50%の個体のみを見ることができます。
左から3番目のアイコンを選択すると、上位25%の個体のみを見ることができます。
左から4番目のアイコンを選択すると、上位10%の個体のみを見ることができます。
最適化中に一番右のアイコンをクリックすると、新しい突然変異を起こすことができ、新たな可能性を追求することができます。
上の赤い枠の部分は、Simulated Annealing Slover(焼きなまし法)のみに表示されるアイコンです。
最適化中にクリックすると、その段階での最適化をスキップし、次の段階の最適化に進みます。
Recordタブ
Recordタブには、最適化完了後に行われた最適化で行われた処理内容が表示されます。
使用例
使用例として、10階分のフロアの2~8階に点をランダムに作成し、1階と10階の対角線の位置までの最短距離を最適化します。
最適化の事前準備
全体コンポーネント:①Rectangle ②Series ③Unit Z ④Move ⑤Cull Index ⑥Populate 2D ⑦List Length ⑧Gene Pool ⑨List Item ⑩Deconstruct Brep ⑪Point ⑫Polyline ⑬Length ⑭Galapagos
まずは、10階分のフロアを作成します。
まずは、Rectangleで正方形を作成します。
今回は、XとY端子に数値の7を入れて、7×7の正方形にしています。
その後、Seriesで等差数列を作成します。
Seriesのn端子に、数値の3を入力します。
SeriesのC端子に、数値の10を入力します。
これにより、0から3ずつ増加する数値が10個作成されました。
さらに、MoveのG端子にRectangleのR端子をつなげ、MoveのT端子にUnit Zをつなげます。
すると、Z軸の真上方向に、間隔が3の10個の正方形が作成されました。
次は、2~8階にランダムに点を作成します。
MoveのG端子を、Cull IndexのL端子につなげます。
さらに、Cull Indexのi端子に、0と-1を入力します。
すると、一番最初と最後のデータである1階と10階が削除され、2~8階のみ抽出できました。
その後、Cull Indexを、Populate 2DのR端子につなげます。
Populate 2DのN端子に、点の個数の数値を入力します。
今回は、10を入力しました。
すると、各フロアに点が10個ランダムに生成されました。
その後、List ItemのL端子に、Populate 2Dをつなげます。
そして、List Itemのi端子に、Gene Poolをつなげます。
また、Cull Indexを、List Lengthにつなげます。
すると、Cull Indexの中にあるデータ数を確認できます。
この際に、Gene Poolの設定をします。
Gene Poolを右クリックし、Editを選択します。
すると、Gene Poolの設定ウィンドウが表示されます。
Gene Countでは、List Lengthで確認した8の数値を入力します。
Decimalsでは、小数点単位を指定するのですが、今回は整数にするので0にします。
Minimunは0、Maximumは10にしてください。
すると、8つのデータに対して、個別に0~10の変数を設定できました。
Gene PoolをList Itemのi端子につなげる際に、i端子を右クリックしてGraftにしてください。
すると、このように各フロアの点が1つ選択されるようになります。
この選択される点は、変数を変えることで変わります。
また、このList Itemの右端子を右クリックし、Flattenに設定しておいてください。
次は少し戻り、1階と10階の点を取得します。
MoveのG端子を、2つのList ItemのL端子につなげます。
さらに、1つ目List Itemのi端子には0、2つ目には-1を入力します。
すると、最初と最後のデータである、1階と10階のフロアのみを抽出できます。
その後、2つのDeconstruct Brepに先程のList Itemを、それぞれつなぎます。
すると、正方形が分解され、頂点を取得できるようになります。
その後、2つのDeconstruct Brepを、新しい2つのList ItemのL端子にそれぞれつなげます。
1つ目のList Itemのi端子には0、2つ目には2を入力します。
すると、1階と10階の対角の位置にある点を取得できました。
この際、先程の2つのList Itemの右端子を右クリックし、Flattenに設定してください。
その後、3つのList Itemを、Pointにつなげます。
この際、つなげる順番に気を付けてください。
順番は、i端子が0のList Item→Gene PoolのList Item→-1のList Itemにしてください。
理由として、線でつなげる時、1階から10階の順番にしたいからです。
すると、このように各階の1つの点をつないで線が作成されます。
PolylineをLengthにつなぐと、線の長さを取得できます。
最後に、GalapagosのFitness端子をLength、Genome端子をGene Poolにつなげます。
これで、最適化の事前準備は完了です。
最適化を実行
実際に最適化を行います。
上の画像は、変数を適当にした最適化前の状態です。
この線が最短距離で短くなるように、最適化をします。
現段階での線の長さは、約50です。
最適化をするため、Galapagosをダブルクリックします。
数値を最小化するので、-のアイコンをクリックし、Minimizeに設定します。
Sloversタブを選択します。
今回は、一番左上のアイコンのEvolutionary Solver(遺伝的アリゴリズム)の最適化方法を選択します。
最適化方法選択後、Start Solverを押して最適化を実行します。
すると、最適化が始まりました。
最適化完了後、右下のOKボタンを押します。
最短距離の結果として、上の画像のようになりました。
線の距離も約31となり、先程の約50よりも非常に小さく最適化できています。
気を付ける点
Galapagosを使う際の、いくつかの注意点を記載します。
特定の数値に最適化する場合
Galapagosが初期設定の場合、数値を最小化か最大化にしか最適化することができません。
そのため、ある特定の数値に近づけたい場合、プログラミングを工夫するか設定をする必要があります。
基本的には、Thresholdで閾値を設定することで、その数値を超えないようにすることができます。
また、数値を0にしたいのに-に永久に最適化され続ける場合には、閾値を設定する以外にもAbsoluteを使用して絶対値にすることで、0以下に最適化されないようにすることもできます。
また、計算式を使って最適化する数値を調整することも、場合によっては有効です。
重くならない工夫をする
Galapagosなどで最適化をする場合、最適化するモデルを重くならないようにすることが重要です。
重ければ重いほど、処理の時間も長くなってしまいます。
今回の使用例では、各フロアを作成していますが、軽くするために線データの状態のみにしており、立体的なモデルを作成することを避けました。
このように、モデルを単純化したり減らすことで、最適化にかかる時間を短縮することができます。
最適化後に、モデルの詳細部分を作成していくことをおすすめします。
途中で処理を止めることもできる
様々な工夫をしても、最適化の処理時間が非常に長くなることもあると思います。
プロジェクトなどの進行状況にも左右されますが、最後まで処理が終わるのを待つのではなく、最適化を途中で止めてその時点での最適化状況を採用することも、場合によっては有効です。
複数パターンを検討する
最適化は、必ずしも最も良い理想的な結果になるとは限りません。
そのため、複数回最適化を行い、様々なパターンを見てから使用する結果を選ぶことをおすすめします。
Galapagosコンポーネントを使用しているグラスホッパー記事はこちら↓