皆様こんにちは。
AMDlabの齋藤です。
今回はGenePoolを操ってみたいと思います。
実はGenePoolの個数、最大値、最小値、小数点を操れるHETEROPTERAというアドオンが存在しており、
そちらでも、実行可能ですが、GenePool操るためだけにインストールするのは面倒で、GenePoolの中のパラメーターを変更したいので、GHPythonから操ってみようと思います。
今回のデータはこちらに挙げております。
https://github.com/AMDlab/TechBlog-Control_GenePool_by_GH_Python
GenePoolとは
まず、初めにGenePoolとは何か説明します。
GenePoolはNumber Sliderが沢山増えたようなものになっており、最大値、最小値、小数点以下、個数が一括で設定できるため、今では色々と使われておりますが、実はGalapagosコンポーネントの付属品だったりします。
ですので、Galapagosはもちろん、Octopus、Wallacei、Tunny等はGenePoolを設計変数として利用できますが、この仕様を知らない他最適化アドオンはGenePoolを入れること、変数として扱うことができなかったりします。
そして、GenePoolは一括で数値を変更することや、1パラメーターを数字入力で編集することはできません。
そこで、それらができるGHPythonを作りたいと思います。
STEP 1: GenePoolにアクセス
ここからはGenePoolを操るところまで、丁寧に解説していきます。
まずはGenePoolにアクセスします。
GenePoolにGHPythonをつないでください。
ここでGは、
Tree Access に設定してください。
次にGHPythonを書いていきます。
1 2 |
par = ghenv.Component.Params gp = par.Input[0].Sources[0] |
このPythonコードでは先ほど入力として作ったGは出てこないです。理由は、Gにつないであるコンポーネントを調べるだけでいいので、Gの値自体は必要ありません。
ghenv からこのコンポーネント(GHPython)を呼び出すことができ、そこからGenePoolまでを呼び出します。それらプロパティが示すものは以下の図に示すものと同じになっております。
これでGenePoolにアクセスできました。 print させてみましょう。
このように出力されればOKです。
STEP 2: GenePoolを操る
次は操ってみようと思います。GHPythonをこのように作ります。
ここで、スライダーの minimum maximum は、GenePoolの最小値、最大値で、範囲は0<20、
dec は、GenePoolの小数点の設定(Decimals)で、範囲は0<20、
cnt は、GenePoolの要素数(count)で、範囲は1<20、
df は、GenePoolすべての要素の値(defalt)で、範囲は0<20、
Buttonの df_update は、GenePoolすべての要素の値を一括で変更するボタン、
Recom は、GenePoolの出力を更新するボタン
としており、Slider Typeは今回すべてIntegersにしています。
ただし、
minimum 、
maximum 、
df はFloating pointでも構いません。
Python側のType hintは、 今回は設定しておりません。
次は操るコードを書いていきます。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
Par = ghenv.Component.Params gp = Par.Input[0].Sources[0] gp.Minimum = minimum gp.Maximum = maximum gp.Decimals = dec gp.Count = cnt if df_update: for i in range(gp.Count): gp.Value[i] = df if Recom: gp.ExpireSolution(True) |
ここでgpのプロパティに関してですが、GenePoolコンポーネントをコピーして、テキストエディタに張り付けると、以下のように見ることができます。
この辺りの話は昔森山さんがこちらに書いていました。
このnameがGenePoolのプロパティに該当しているので、それを入力していくだけです。
df_update では True になったとき、設定した df を gp の Value プロパティに入力しているものです。
gp.ExpireSolution(True) はGenePoolコンポーネントをまた計算させるために必要となります。
Recomボタンを押さない限り、GenePoolの出力は元のままになります。
この関数はif文の外に(つまり Recom 関係なしにずっと True になるよう)にしてもいいのですが、その場合、GenePoolの計算-GHPythonの無限ループになり、ずっと実行され続けるため、処理が重くなる可能があります。
これで、GenePoolを操ることができました。
STEP 3: GenePoolの指定した1パラメーターを変更する
今度はGenePoolの指定した1パラメーターを変更してみます。GHPythonをこのように作ります。
ここで、 G は前と一緒で Tree Access に設定し、
スライダーの index は、GenePoolの変更したい要素番号、範囲は0<20、
value は、GenePoolの変更したい数値で、範囲は0<20、
Buttonの update は、GenePoolの指定した要素を指定した値に変更とGenePoolの出力を更新するボタン
としており、Slider Typeは今回すべてIntegersにしています。
ただし、
value はFloating pointでも構いません。
Python側のType hintは、 今回も設定しておりません。
GenePoolの指定した1パラメーターを変更できるコードを書いていきます。
1 2 3 4 5 6 |
Par = ghenv.Component.Params gp = Par.Input[0].Sources[0] if update: gp.Value[index] = value gp.ExpireSolution(True) |
これで、 update されれば変更できるコンポーネントができました。
最後に
今回はGenePoolを操りました。
ここで皆さんの中には、設計変数の数を変更しながら最適化しようと考える人がいると思います。
実際に設計変数の数を変化して最適化できるアルゴリズムはありますが、GrassHopperのGalapagos、Octopus、Wallaceiはそういった使い方を想定されていません。
ですので、そのような最適化させる場合はGenePoolに最大の設計変数の数を設定して最適化を試しにしてみましょう。
COMMENTS