MyEnigma

とある自律移動システムエンジニアのブログです。#Robotics #Programing #C++ #Python #MATLAB #Vim #Mathematics #Book #Movie #Traveling #Mac #iPhone

GoogleのC++最適化ライブラリCeres Solverを使って制約付き最適化問題を解いてみる

目次

はじめに

今回もGoogleのC++最適化ライブラリCeres Solverを使ってようという記事です。

(これまでの関連記事は末尾のリンクを参照下さい)

 

今回は、これまでは制約条件の無い最適化問題を解いてきましたが、

制約条件付きの最適化問題を解いてみようと思います。

 

制約付き最適化

制約付き最適化問題は、下記の記事で説明しているとおり、

パラメータに範囲などの条件が付いた最適化問題のことを指します。

myenigma.hatenablog.com

 

最適化技術を実際のシステムに利用場合、

最適化パラメータに制約が無いというのは、ほとんどありません。

例えば、電圧値をパラメータとして利用する場合、

ハードウェアの制約として、最小電圧値や最大電圧値などは、

おのずと決まってきます。

この制約条件を無視して、最適化を実施した場合、

制約条件の範囲外の値が計算され、

その値を利用したとしても、

実際のシステムはその値を使用することができず、

システムが上手く動かなくなってしまいます。

(場合によっては、範囲外の入力によって、

システムが壊れてしまうことも有りえます)

 

ちなみにこのような制約付き最適化問題を解いて、

制御する制御手法のことをモデル予測制御と呼びます。

myenigma.hatenablog.com

 

Ceres Solverで制約付き最適化問題を解く

Ceres Solverで制約付き最適化問題を解く場合は、

各パラメータに対して、

SetParameterLowerBoundという関数と、

SetParameterUpperBoundという関数で、

上限、下限範囲を設定できます。

f:id:meison_amsl:20161010063707p:plain

あとは、通常通り最適化計算を実施するだけです。

 

今回は以前の記事で紹介した、

シンプルな最適化問題に、

制約条件を付けて最適化を実施してみようと思います。

myenigma.hatenablog.com

 

上記の記事の問題では、x=15からはじめて、x=10の最小値を推定しましたが、

今回は、12<x<14の制約を入れてみます。

コードとしては、下記のように下限と上限を設定するだけです。

最適化パラメータのベクトルと、制約をつけるパラメータのインデックス

そして下限値上限値の値を設定します。

//最適化問題を解く用のオブジェクトの生成
Problem problem;

//コスト関数の設定
//AutoDiffCostFunctionを使うことで、自動的にヤコビ行列を設定できる
CostFunction* cost_function=new AutoDiffCostFunction<CostFunctor,1,1>(new CostFunctor);

//最適化問題に残差項と変数を設定
problem.AddResidualBlock(cost_function,NULL,&x);

//制約設定
problem.SetParameterLowerBound(&x,0,12.0);
problem.SetParameterUpperBound(&x,0,14.0);

あとは最適化を実行すると、下記のような結果が得られます。

f:id:meison_amsl:20161010065835p:plain

上記の結果を見ると分かる通り、

制約範囲内での最小値x=12を選べていることがわかります。

複数のパラメータの場合も上記の制約設定を

それぞれのパラメータに設定すればOKです。

 

コードはこちらで公開しています。

github.com

 

参考資料

myenigma.hatenablog.com

myenigma.hatenablog.com

myenigma.hatenablog.com

myenigma.hatenablog.com

myenigma.hatenablog.com

 

MyEnigma Supporters

もしこの記事が参考になり、

ブログをサポートしたいと思われた方は、

こちらからよろしくお願いします。

myenigma.hatenablog.com