質問: gaを用いた最適化の途中経過を可視化しようとすると世代数のカウントがおかしい ga関数を使って最適化問題を解き、以下のサイトを参考に最適化の途中経過を動画化しようとしています。 【matlab】遺伝的アルゴリズムを可視化する 評価関数は で制約条件は です。 rosenbrock.mが目的関数、constraint.mが制約関数、myfun.mが出力関数で、ga_main.mで最適化を実行しています。 最適化自体は上手くいっているようなのですが、出力されるfigureの下半分、世代を表すプロットの様子がおかしく、確認のためstate.generationで現在の世代数を取得すると数が飛んだりもう一度1世代目から始まったりします。 非線形制約を入れていることが影響しているらしく、ga_main.mの27行目で制約条件を外してみると問題なく動きます。しかし根本的な解決策が分かりません。
回答: 恥ずかしながら私も始めてみる現象でしたが、これは非線形制約が与えられたときに使われる 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 のページにあります。 参考:https://jp.mathworks.com/help/gads/genetic-algorithm-options.html#f17843 '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 つ増える・・そんなことが起こっています。