#author("2023-01-28T05:51:14+00:00","","")
#author("2023-02-23T15:20:32+00:00","","")
[[水上/技術資料]]



----
目次
#contents
----

*目標 [#z00fd092]
pymooというモジュールを使って多目的最適化問題を解きます。

*最適化問題とは [#h82a02b0]
最適化問題とは、制約を満たしつつ、目的の値を最大化or最小化する条件を求める問題のこと。
&br;
特に、目的関数が複数存在する最適化問題を多目的最適化問題という。&br;
多目的最適化問題を解く手法としてNSGA2があり、本ページではpythonでnsga2を用いて多目的最適化問題を解く方法を紹介する。 &br;&br;
最適化問題について学びたいときはこちら↓&br;
https://science-log.com/%E6%95%B0%E5%AD%A6/%E3%80%90%E6%9C%80%E9%81%A9%E5%8C%96%E5%95%8F%E9%A1%8C%E3%81%AE%E5%9F%BA%E7%A4%8E%E3%80%91%E6%95%B0%E7%90%86%E6%9C%80%E9%81%A9%E5%8C%96%E3%81%A8%E3%81%AF%E4%BD%95%E3%81%8B/
&br;

多目的最適化とNSGA2について↓&br;
https://logmi.jp/tech/articles/325211
&br;



*環境 [#h82a02b0]
Python 3.10.1 64bitでやってますが,たぶんどのバージョンもできるはず...&br;
pymooはバージョン0.5.0を使いましょう。

**準備 [#j661bc61]
まず、pymooをインストールします。pymooはpythonでNSGA2を実行するためのモジュールです。&br;
また、pymooはバージョンによってコードの書き方が変わります。&br;
自分は0.5.0を使っているので0.5.0をインストールする。&br;
 pip install pymoo == 0.5.0

&br;
*実験 [#bb5c41a2]
**問題設定 [#s10f289d]
以下の問題について考えてみる。

#ref(pro1.png,,400x220)

これは目的関数として (x1^2 + x2^2)を最小化かつ、(x1 - 1)^2 + x2^2 を最小化し &br;
制約条件として2(x1 - 0.1)(x1 - 0.9)/0.18 =< 0 、-20(x1 - 0.4)(x1 - 0.6)/4.8 =< 0
を満たしている問題について考えている。

&br;
**サンプルプログラムの解説 [#s10f289d]
#ref(pro1.py)
多目的最適化問題のコードの解説をする。&br;
#ref(program.png,,550x700)

&br;
***Myprogram全体の部分 [#s10f289d]
・class MyProgram(program): の中は最適化問題全体の計算するコードである。 &br;
#ref(program1.png,,)

&br;
***def __init__(self) [#s10f289d]
def __init__(self): の中は最適化問題の引数の設定をしている。
#ref(program2.png,,)
引数の説明はこちら↓ &br;
#ref(pro2.png,,400x220)
また、__init__ についてはこちらを参考に↓ &br;
https://qiita.com/ishigen/items/2d8b6e6398743f2c8110 &br;

&br;
***evaluate [#s10f289d]
evaluateの部分は目的関数と制約条件を書くところです。 &br;
#ref(program3.png)

out["F"]に評価関数の値,out["G"]に制約条件の値を書き込む。&br;
※制約条件、目的関数は=<0制約と設定してあるため、>=とする場合は-1をかける。&br;

&br;
***プログラム実行部分 [#s10f289d]
#ref(program4.png,,)

problem = MyProblem()で、記述した問題を定義。 &br;
algorithm = NSGA2(pop_size=100)でアルゴリズムの種類を定義(本研究ではNSGA2を使用)&br;
vurpose = True で処理の途中を可視化している(Trueで以下のように表示される)&br;

#ref(program6.png,,360x360)
n gen は現在の
世代数,n evel はこれまでの個体を評価した数,cv (min),cv (avg) はそれぞれ現在の母集
団における最小の制約違反,&br;
現在の母集団における平均の制約違反,n nds は多目的最適化問題の場合の非劣解の数,&br;
eps は過去数世代にわたるインジケーターの変化,indicatorはパフォーマンスインジケーターを表す.&br;

***グラフ、解を表示する部分 [#s10f289d]
#ref(program5.png)

plot.の4行はNSGA2によって出力したパレート解を表示するコードである。&br;
表示されるグラフ↓&br;
#ref(program7.png,,300x300)

最後の行はres.F,resXを表示している。
#ref(program8.png,,360x360)
res.Fは、目的関数の値(ここでいうとres.Fはx1^2+xx2^2と(x1-1)^2+x2^2)、res.Xはその時のx1,x2の値を表示している。
*組み合わせ最適化問題とは [#h82a02b0]
最適化問題とは、制約を満たしつつ、目的の値を最大化or最小化する条件を求める問題のこと。
&br;
組合せ最適化問題とは、様々な制約の下で多くの選択肢の中から、ある指標(価値)を最も良くする変数の値(組合せ)を求めること。&br;
多目的最適化とNSGA2について↓&br;
https://logmi.jp/tech/articles/325211
&br;
*実験 [#bb5c41a2]
**問題設定 [#s10f289d]
スクレイピングしたレシピデータを活用したNSGA2のコードは以下の通り。&br;
①&br;
#ref(code1.png,,)
#ref(code2.png,,)
#ref(code3.png,,)
②&br;
#ref(code4.png,,)
③&br;
#ref(code5.png,,)
*解説 [#bb5c41a2]
①は制約式の記述部分である。リスト化した各変数(コストや時間や各栄養素など)を足したりしている。具体的な式はコメントアウト部分に記載。&br;
記述した制約式をpの配列にいれ、out["G"]の部分に書き込んでいる。&br;
②はそれぞれサンプリング、クロスオーバー、ミューテーションの部分である、nsga2で組み合わせ最適化を使うときはこの3つをコピペして用いる。&br;
③はプログラム実行部分である。&br;
proble= SubsetProblem(... の部分が①で記述したコードを組み合わせ最適化問題として置き換えている。&br;
algorithm=NSGA2(...の部分でアルゴリズムの設定をしている。②で記述したサンプリング、クロスオーバー、ミューテーションを使用する。&br;
res=minimize(...の部分でアルゴリズムを実行している。初めにminimize(とすることで最小化問題としてとらえる。

*参考文献 [#ddfa4bf2]
↓ここ参考にしました &br;
https://yuyumoyuyu.com/2021/07/23/howtousepymoo/

トップ   編集 差分 履歴 添付 複製 名前変更 リロード   新規 一覧 検索 最終更新   ヘルプ   最終更新のRSS