目的関数との 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)
次の情報を使用して、ライブラリ コンパイラ アプリまたは
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
への参照を追加します。MWArray
API への参照を追加します。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
参考
ライブラリ コンパイラ | compiler.build.dotNETAssembly
| deploytool