Modelicaで最適化を志す
Modelicaで最適化(動的計画法)を行う場合いくつか選択肢があるが
OpenModelica, JModelicaにはOptimizationクラスが用意されており最適化を行うことが出来る
JModelicaで試した結果はこちら
https://qiita.com/UedaShigenori/items/4452d95cfa440658163a
OpenModelicaで試した結果はこちら
https://qiita.com/UedaShigenori/items/fbd2209363c117476827
結論として両者はあまり使えなかった
OpenModelicaは期待する結果を得る方法が分からなかったし
JModelicaはパラメータ変数に計算式が入っているとダメだし、Fluidパッケージのモデルが全然計算できない
そこでExcelからOpenModelicaで計算を実行するライブラリを昔作ったのでそれを拡張して最適化できるようにしてみる
https://github.com/UedaShigenori/OpenModelica_Excel_Interface_ClassPackage
本当は格好よくPythonとかでやりたいし、OpenModelicaにPython InterfaceもあるのだがPython使えないから仕方ない
またPythonが使えない環境も製造業では多いためVBAで書いていく
試みとしてはまだ途中である
実装手順
-
ExcelからOpenModelicaを計算実行出来るようにする
-
それからパラメータを変更出来るようにする
ここでパラスタ機能を付けてもいいかもしれない -
計算結果をExcelに取得するようにする
-
計算結果から次のパラメータを決定出来るようにする
1.ExcelからOpenModelicaの計算を実行
以下のExamples1.xlsmはHelloWorld.moをOMShellから実行するサンプルマクロである
https://github.com/UedaShigenori/OpenModelica_Excel_Interface_ClassPackage
先日まではWindows10では動かなかったが、本日動くように修正した
躓いていたのはSendkeysでOMShellにコマンドを送るところで
Win10だとちゃんとコマンドを送れなかった
色々原因はあるらしいが以下のサイトを参考にWSHから送るようにした
https://qiita.com/nukie_53/items/f069a1e48cddca0024c2
ちゃんと動くことを確認できた
次のステップ
次はExcelからモデルのパラメータ変更するのだが
OMShellにコマンドが用意されているため用意と思われる
結果の取得もcsvで吐き出せば簡単に読み込める
ただ、結果ファイルは大きいので全部読み込むか、特定の変数の結果のみ読み込むかは後々判断する
難しいのは動的にパラメータを変えることだと認識する
ある目的関数を最小化(最大化)するため、パラメータ変数を変更するのだが
目的関数は時系列で出力されるため、一つの評価関数にする必要がある
最小二乗法などが候補となる
次に、最小化のためのアルゴリズムだが導関数を取得するかどうかで計算コストも変わる
代数的に求める二分法などもあるが、おそらくPythonはこの辺りのライブラリが充実しているのだと思う。
ExcelVBAでそのようなライブラリがあればだれか教えてほしい
ただ、ExcelのSolver機能などのセルに依存した機能は可読性が大きく下がり拡張性も悪くなるので
それ以外でお願い致します。
** パラメータを変更する
以下のコードを参照
Sub Examples2_2()
'
' パラメータを変更して計算を実行するマクロです
' mosスクリプトを書いて、OMShellに投げます
'
'宣言
Dim ThisWorkbookPath As String
Dim mosFileName As String
Dim modelFile As String
Dim className As String
'mosファイルの設定インスタンス
Dim mosScript As MosSetting
Set mosScript = New MosSetting
'OMShellの操作インスタンス
Dim OMShell As OperateOMShell
Set OMShell = New OperateOMShell
'計算を実行するmoファイル, クラス名, mosファイル名. ワークブックパスを定義
modelFile = "He"
className = "hel"
mosFileName = "He"
ThisWorkbookPath = ThisWorkbook.Path
'mosファイルの設定
Call mosScript.MakeMos(mosFileName)
Call mosScript.loadFile(modelFile)
Call mosScript.build(className, 0, 1, 500, 0.0001, "dassl", "csv")
Call mosScript.ChangeParameter(className, "a", 100)
Call mosScript.exe(className, "res14", "csv")
Call mosScript.EndMos
'OMShellからmosファイルを実行
Call OMShell.StartOMShell
Call OMShell.Cd(ThisWorkbookPath)
Call OMShell.runScript(mosFileName)
End Sub