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

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

Accepted Answer

michio
michio on 29 May 2020
恥ずかしながら私も始めてみる現象でしたが、これは非線形制約が与えられたときに使われる 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 Comment
tohu_sand
tohu_sand on 29 May 2020
ありがとうございます!
アドバイスに従った結果、解決しました。
大変勉強になりました。

Sign in to comment.

More Answers (0)

Community Treasure Hunt

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

Start Hunting!