目的関数との MATLAB 最適化ルーチンの統合
概要
この例では、目的関数の局所的最小値を検出する .NET アプリケーションを MATLAB® 最適化関数 fminsearch と MWObjectArray クラスを使用して作成する方法を示します。
この例では、以下の手順を実行します。
MATLAB Compiler SDK™ 製品を使用してアセンブリ (
OptimizeComp) を作成します。このアセンブリは、.NET オブジェクトとして実装される目的関数に MATLAB 最適化ルーチンを適用します。C# アプリケーション (
OptimizeApp.cs) または Visual Basic® アプリケーション (OptimizeApp.vb) のどちらかでコンポーネントにアクセスします。C# (
BananaFunction.cs) または Visual Basic (BananaFunction.vb) を使用して、MWObjectArrayクラスを使用して .NET オブジェクトへの参照を作成し、そのオブジェクトをコンポーネントに渡します。Visual Studio® .NET 開発環境を使用してアプリケーションをビルドして実行します。
OptimizeComp アプリケーション
OptimizeComp アプリケーションは、目的関数の局所的最小値を検出し、最小値の位置と値を返します。このコンポーネントでは MATLAB 最適化関数 fminsearch を使用しています。この例では、fminsearch のドキュメンテーションで使用している Rosenbrock のバナナ関数を最適化します。
クラス OptimizeComp.OptimizeClass は、.NET オブジェクトとして実装される目的関数で制約なし非線形最適化を実行します。このクラスのメソッド doOptim は、目的関数を実装する初期値 (NET オブジェクト) を受け入れ、局所的最小値の位置と値を返します。
2 つ目のメソッド displayObj は、.NET オブジェクトの特性をリストするデバッグ ツールです。doOptim と displayObj の 2 つのメソッドで MATLAB 関数をカプセル化します。
ファイル
| MATLAB 関数 | doOptim.m displayObj.m |
| MATLAB 関数の場所 | |
| C# コードの場所 | |
| Visual Basic コードの場所 | |
| MWArray API リファレンスの場所 | |
手順
MATLAB に付属している以下のフォルダーを作業フォルダーにコピーします。
matlabroot\toolbox\dotnetbuilder\Examples\VSVersion\NET\OptimizeExampleMATLAB コマンド プロンプトで、作業フォルダー内の新しい
OptimizeExample\OptimizeCompサブフォルダーに移動します。アクセスする MATLAB コードを調べます。この例では、
doOptim.mとdisplayObj.mを使用します。function [x,fval] = doOptim(h, x0) mWrapper = @(x) h.evaluateFunction(x); directEval = h.evaluateFunction(x0) wrapperEval = mWrapper(x0) [x,fval] = fminsearch(mWrapper,x0)function className = displayObj(h) h className = class(h) whos('h') methods(h)
次の情報を使用して、.NET アセンブリ コンパイラ アプリまたは
compiler.build.dotNETAssemblyで .NET コンポーネントをビルドします。フィールド 値 ライブラリ名 OptimizeCompクラス名 OptimizeComp.OptimizeClassコンパイル対象ファイル doOptim.m
displayObj.mたとえば、
compiler.build.dotNETAssemblyを使用している場合は、以下を入力します。buildResults = compiler.build.dotNETAssembly(["doOptim.m","displayObj.m"], ... 'AssemblyName','OptimizeComp', ... 'ClassName','OptimizeComp.OptimizeClass');
詳細については、.NET アセンブリの生成と .NET アプリケーションのビルドの手順を参照してください。
コンポーネントにアクセスするために C# または Visual Basic のどちらを使用するのかを決定します。
C#
C# を使用する場合は、最適化するオブジェクト関数を実装するクラスのソース コードを記述します。
この例のサンプル アプリケーションは
OptimizeExample\OptimizeCSApp\BananaFunction.csにあります。Visual Basic
Visual Basic を使用する場合は、最適化するオブジェクト関数を実装するクラスのソース コードを記述します。
この例のサンプル アプリケーションは
OptimizeExample\OptimizeVBApp\BananaFunction.vbにあります。
BananaFunctionクラスは、fminsearchのドキュメンテーションで説明している Rosenbrock のバナナ関数を実装します。Visual Studio を使用して、ご使用のアプリケーション言語に対応した .NET プロジェクト ファイルを開きます。
C#
C# を使用する場合は、
OptimizeCSAppフォルダーにこの例の Visual Studio .NET プロジェクト ファイルが含まれています。Windows® エクスプローラーでOptimizeCSApp.csprojをダブルクリックして、Visual Studio .NET でプロジェクトを開きます。[OptimizeCSApp.csproj] を右クリックし、[MATLAB の外部で開く] を選択して、デスクトップから開くこともできます。Visual Basic
Visual Basic を使用する場合は、
OptimizeVBAppフォルダーにこの例の Visual Studio .NET プロジェクト ファイルが含まれています。Windows エクスプローラーでOptimizeVBApp.vbprojをダブルクリックして、Visual Studio .NET でプロジェクトを開きます。[OptimizeVBApp.vbproj] を右クリックし、[MATLAB の外部で開く] を選択して、デスクトップから開くこともできます。
アセンブリ ファイル
OptimizeComp.dllへの参照を追加します。MWArrayAPI への参照を追加します。MATLAB がシステムにインストールされている場合 matlabroot\toolbox\dotnetbuilder\bin\win64\<framework_version>\MWArray.dllMATLAB Runtime がシステムにインストールされている場合 <MATLAB_RUNTIME_INSTALL_DIR>\toolbox\dotnetbuilder\bin\win64\<framework_version>\MWArray.dllVisual Studio .NET で
OptimizeAppアプリケーションをビルドして実行します。
プログラムにより、次の出力が表示されます。
Using initial points= -1.2000 1
*****************************************************
** Properties of .NET Object **
*****************************************************
h =
MathWorks.Examples.Optimize.BananaFunction handle
with no properties.
Package: MathWorks.Examples.Optimize
className =
MathWorks.Examples.Optimize.BananaFunction
Name Size Bytes Class Attributes
h 1x1 60 MathWorks.Examples.Optimize.BananaFunction
Methods for class MathWorks.Examples.Optimize.BananaFunction:
BananaFunction addlistener findprop lt
Equals delete ge ne
GetHashCode eq gt notify
GetType evaluateFunction isvalid
ToString findobj le
**************** Finished displayObj ****************
*****************************************************
** Performing unconstrained nonlinear optimization **
*****************************************************
directEval =
24.2000
wrapperEval =
24.2000
x =
1.0000 1.0000
fval =
8.1777e-010
***************** Finished doOptim ******************
Location of minimum: 1.0000 1.0000
Function value at minimum: 8.1777e-010
