Help us understand the problem. What is going on with this article?

MATLABのGlobal Optimization Toolboxの使い方(GA実践編)

概要

Global Optimization Toolboxには大域的最適解(最小値)を求めるのに特化した関数が用意されています.
私は普段その中のメタヒューリスティック的な最適化手法の関数(Simulated annealing, Particle swarm, Genetic algorithm)を用いています.
数理最適化はツールとして用いており,専門ではありません・・・
ですので,専門用語など間違っていましたらご指摘お願い致します.
最適化の理論的な部分は今回省かせていただいて,Genetic algorithm(以下GA)を例に実際の使い方について書かせていただきます.
基本的な使い方は他の最適化手法の関数(特にParticle swarm)についても同様です.
Global Optimization Toolboxの関数それぞれの公式リファレンスはいまだ英語の物が多く,触りたての時とまどいました.
しかし公式リファレンスの数は非常に手厚いです(英語と格闘する必要はありますが).
ざっくり触ってみたい,いますぐ使いたいんだ!という方のお役に立てれば幸いです.

GAの理論の参考資料

こちらのページはとてもわかりやすく,大変おせわになりました.
http://ipr20.cs.ehime-u.ac.jp/column/ga/index.html
こちらは専門用語の英語と日本語がまとまっているのでリファレンスを解読するのに助かりました.
https://www.sist.ac.jp/~suganuma/kougi/other_lecture/SE/opt/GA/GA.htm

関数gaの使い方

それではここからGAの関数gaを使っていきます.
公式リファレンスはこちらです
https://jp.mathworks.com/discovery/genetic-algorithm.html
https://jp.mathworks.com/help/gads/ga.html

入力引数・出力引数

ます,gaの基本的な構成です.

x = ga(fun,nvars,A,b,Aeq,beq,lb,ub,nonlcon,IntCon,options)

入力引数について軽く説明します.

  • fun・・・最適化の目的関数.
  • nvars・・・最適化したい変数の個数.変数をそのまま受け渡すのではないので注意
  • A, b・・・線形不等式制約の行列とベクトル
  • Aeq, beq・・・線形等式制約の行列とベクトル
  • lb・・・下限
  • ub・・・上限
  • nonlcon・・・非線形制約
  • IntCon・・・整数制約のベクトル.ここで指定された変数は正の整数として最適化される.これありがたいんじゃ〜
  • options・・・オプション

funnvarsは必須です.
そのほかの使わない引数は空行列として渡します.
注意しなければならないのは,例えばこのうちAeqbeq使わないけど続くlbubは指定するという場合,Aeqbeqに空行列を渡さなければなりません.
忘れるとエラーとなります.
末尾optionsまでかなりの引数があるので,そのほかの指定しない引数に空行列渡すのを忘れがちです・・・
逆にubよりあとの引数(nonlcon,IntCon,options)は特に指定しないという場合,空行列を渡さず省略することができます.
これらすべての引数は構造体にして渡すことができますので,その方がミスが少ないかもしれません.

次に出力引数です.

[x,fval,exitflag,output,population,scores] = ga(_)

目的関数の作成

基本的に引数funには関数ハンドルを渡します.
つまり目的関数を関数として記述し,その関数名のまえに@をつけたものを引数funとして与えればOKです.
たとえばベンチマーク関数Beale functionを使って作ってみます.
Beale.png

Beale functionの式は以下です.

f(x1,x2)=(1.5−x1+x1x2)^2+(2.25−x1+x1x2^2)^2+(2.625−x1+x1x2^3)^2\\\
f_{min}(3,0.5)=0

そして次のように目的関数を作成します.

Beale.m
function fval=Beale(x)
x1=x(1);
x2=x(2);
fval=(1.5-x1+x1*x2)^2+(2.25-x1+x1*(x2)^2)^2+(2.625-x1+x1*(x2)^3)^2;

メインスクリプトは次のようになります.

ga_test.m
fun=@(x)Beale(x); %objective fuction
[x,fval]=ga(fun,2); %nvars=2

線形制約・非線形制約

gaでは線形や非線形の等式・不等式制約を設けることができます.
上限下限の指定では対応できない場合や変数同士の関係が決まっている場合に用いています.
公式日本語リファレンスが非常に詳しいです.
線形制約の指定方法についてはこちら
https://jp.mathworks.com/help/optim/ug/linear-constraints.html
非線形制約についてはこちら
https://jp.mathworks.com/help/optim/ug/nonlinear-constraints.html

上限下限

上限下限を指定します.
lbubのベクトルの長さはnvarsと一致させてください.
Beale fuctionにおけるGAの探索範囲を

-4.5<=x1<=4.5, -4.5<=x2<=4.5

とすると,

ga_test.m
fun=@(x)Beale(x); %objective fuction
[x,fval]=ga(fun,2,[],[],[],[],[-4.5;-4.5],[4.5;4.5]); %nvars=2

となります.
gaではlb,ubnvars行1列のベクトルで指定します.
しかし,Simulated Annealing(simulannealbnd, https://jp.mathworks.com/help/gads/simulannealbnd.html) やParticle Swarm(particleswarm, https://jp.mathworks.com/help/gads/particleswarm.html) では1行nvars列ベクトルで指定するので,最適化手法を切り替えた時に注意しなければならない点です.

オプション

オプションではその他様々な設定ができます.
オプションは以下のように記述します.

options = optimoptions('ga','Display','off'); % 最適化完了時の最適値の状態のメッセージを表示しない

オプションはかなり種類が多いので,まだ理解が追いついていない部分が多いです.
そこで,私が普段使っているoptionsを紹介したいと思います.

初期集団の指定

デフォルトでは,初期集団には乱数が与えられます.
InitialPopulationMatrixオプションを使えば,初期集団を指定することが可能です.
指定するには以下のように記述します.
Beale fuctionの最適解[3,0.5]から少し離れた初期集団を作成します.

ga_test.m
x0=[4,4]; %start point
initpop=10*randn(20,2) + repmat(x0,20,1); %平均x0,分散10で正規分布する初期集団を作成
options=optimoptions('ga','InitialPopulationMatrix',initpop);
[x,fval]=ga(fun,2,[],[],[],[],[-4.5;-4.5],[4.5,4.5],[],options);

GAの並列処理

GAやParticle Swarmでは並列処理が可能です.
デフォルトではオフになっています.

options=optimoptions('ga','UseParallel',true);

おわりに

6種の最適化手法(fminunc,patternsearch,ga,particleswarm,surrogateopt,GlobalSearch)のベンチマークのページがありますのでこちらもご覧ください.
https://jp.mathworks.com/help/gads/example-comparing-several-solvers.html
また,最適化手法のベンチマーク関数がこちらの記事でまとめられております.
https://qiita.com/tomitomi3/items/d4318bf7afbc1c835dda

それでは楽しいMATLABライフを!

Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Comments
No comments
Sign up for free and join this conversation.
If you already have a Qiita account
Why do not you register as a user and use Qiita more conveniently?
You need to log in to use this function. Qiita can be used more conveniently after logging in.
You seem to be reading articles frequently this month. Qiita can be used more conveniently after logging in.
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
ユーザーは見つかりませんでした