専門ゼミ(堀)/遺伝的アルゴリズム
の編集
Top
/
専門ゼミ(堀)
/
遺伝的アルゴリズム
[
トップ
] [
編集
|
差分
|
履歴
|
添付
|
リロード
] [
新規
|
一覧
|
検索
|
最終更新
|
ヘルプ
]
-- 雛形とするページ --
島部/menu/template
---- 目次 #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を使いましょう。 **プログラムの解説 [#s10f289d] ***準備 [#j661bc61] まず、pymooをインストールします。pymooはpythonでNSGA2を実行するためのモジュールです。&br; また、pymooはバージョンによってコードの書き方が変わります。&br; 自分は0.5.0を使っているので0.5.0をインストールする。&br; pip install pymoo == 0.5.0 *実験 [#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.1.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の値を表示している。 補足&br; 最大化したい場合は2つの目的関数の符号を逆にしてください *実験2 [#bb5c41a2] **問題設定 [#s10f289d] 以下の問題について考えてみる。 #ref(program11.png,,400x220) これは目的関数として (x1^3 + x2^2+6)を最小化かつ、(x1 - 3)^5 + x2 - 100を最小化し &br; 制約条件として2(x1 - 0.1)(x1 - 1.5) =< 0 、-4(x1 - 1.7)(x1 - 5)/2.5 =< 0 を満たしている問題について考えている。 **プログラム [#effef93b] #ref(pro_sample.py) #ref(program9.png,,) **実験結果 [#effef93b] ↓出力されたグラフ #ref(program10.png,,) *参考文献 [#ddfa4bf2] pymoo公式サイト(日本語訳をして見てね)&br; https://pymoo.org/algorithms/moo/nsga2.html &br; pymooの使い方まとめ&br; https://yuyumoyuyu.com/2021/07/23/howtousepymoo/
タイムスタンプを変更しない
---- 目次 #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を使いましょう。 **プログラムの解説 [#s10f289d] ***準備 [#j661bc61] まず、pymooをインストールします。pymooはpythonでNSGA2を実行するためのモジュールです。&br; また、pymooはバージョンによってコードの書き方が変わります。&br; 自分は0.5.0を使っているので0.5.0をインストールする。&br; pip install pymoo == 0.5.0 *実験 [#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.1.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の値を表示している。 補足&br; 最大化したい場合は2つの目的関数の符号を逆にしてください *実験2 [#bb5c41a2] **問題設定 [#s10f289d] 以下の問題について考えてみる。 #ref(program11.png,,400x220) これは目的関数として (x1^3 + x2^2+6)を最小化かつ、(x1 - 3)^5 + x2 - 100を最小化し &br; 制約条件として2(x1 - 0.1)(x1 - 1.5) =< 0 、-4(x1 - 1.7)(x1 - 5)/2.5 =< 0 を満たしている問題について考えている。 **プログラム [#effef93b] #ref(pro_sample.py) #ref(program9.png,,) **実験結果 [#effef93b] ↓出力されたグラフ #ref(program10.png,,) *参考文献 [#ddfa4bf2] pymoo公式サイト(日本語訳をして見てね)&br; https://pymoo.org/algorithms/moo/nsga2.html &br; pymooの使い方まとめ&br; https://yuyumoyuyu.com/2021/07/23/howtousepymoo/
テキスト整形のルールを表示する