GAを用いた最適化の​途中経過を可視化しよ​うとすると世代数のカ​ウントがおかしい

6 ビュー (過去 30 日間)
tohu_sand
tohu_sand 2020 年 5 月 29 日
コメント済み: tohu_sand 2020 年 5 月 29 日
ga関数を使って最適化問題を解き、以下のサイトを参考に最適化の途中経過を動画化しようとしています。
評価関数は  で制約条件は  です。
rosenbrock.mが目的関数、constraint.mが制約関数、myfun.mが出力関数で、ga_main.mで最適化を実行しています。
最適化自体は上手くいっているようなのですが、出力されるfigureの下半分、世代を表すプロットの様子がおかしく、確認のためstate.Generationで現在の世代数を取得すると数が飛んだりもう一度1世代目から始まったりします。
非線形制約を入れていることが影響しているらしく、ga_main.mの27行目で制約条件を外してみると問題なく動きます。しかし根本的な解決策が分かりません。

採用された回答

michio
michio 2020 年 5 月 29 日
恥ずかしながら私も始めてみる現象でしたが、これは非線形制約が与えられたときに使われる Augmented Lagrangian Genetic Algorithm の挙動の様です。参考:https://jp.mathworks.com/help/gads/description-of-the-nonlinear-constraint-solver.html
myfun.m 内にブレークポイントを置いてみると flag に "interrupt" が発生していることが確認できます。"interrupt" の意味を調べてみると、
'interrupt' — Iteration of a subproblem of a nonlinearly constrained problem for the 'auglag' nonlinear constraint algorithm.
という記載が Genetic Algorithm Options のページにあります。
'auglag' nonlinear constraint algorithm、すなわち Augmented Lagrangian Genetic Algorithm は最適化問題を複数の subproblem に分けて解くようで、1つの subproblem が 1 generation と定義されています。対策としては myfunc.m 内で世代を表すプロットを描くコマンドを flag = "interrupt" の時は描かない、というのはいかがでしょう?
subproblem を解いている間は flag が interrupt であり、State.Generation は subproblem 内の世代を表しますが、1 つの subproblem が終了した時点で flag = iter に1度変化し、この時は定義通り State.Generation が 1 つ増える・・そんなことが起こっています。
  1 件のコメント
tohu_sand
tohu_sand 2020 年 5 月 29 日
ありがとうございます!
アドバイスに従った結果、解決しました。
大変勉強になりました。

サインインしてコメントする。

その他の回答 (0 件)

カテゴリ

Help Center および File ExchangeGenetic Algorithm についてさらに検索

Community Treasure Hunt

Find the treasures in MATLAB Central and discover how the community can help you!

Start Hunting!