GAでのモデルの出力値の最適化

optimtoolのGAによってsimulink(simmechanics)によって作成したモデルの出力値が最小になるように最適化を行いたいです. 現在のコマンドが以下の通りになります.
function trqfuka=GArensyu01(x,ScopeData2)
y1=[0 x(1)]
y2=[0 x(2)]
open('GArensyu2')
sim('GArensyu2')
trq=ScopeData2(:,2)
trq_int=(trq*0.022222).^2
trqfuka=sum(trq_int)
GArensyu2というのはモデルの名前です. y1,y2はモデルの入力値でScopeData2がモデルの出力値です. ワークスペースに何もない状態でこのコマンドのGAを実行すると,エラーで
「パラメーター 'VariableName' に対する 'GArensyu2/Subsystem3/From Workspace' 内の設定が無効です。」
と表示されます.これの解決策は何かないでしょうか. また,仮の値をy1,y2に与えてGAを実行するとエラーは出ないんですが,モデルが永遠に回り続け,全くGAの計算がされません.この解決策も教えて頂きたいです.よろしくお願いします.

13 Kommentare

michio
michio am 30 Jan. 2017
「このコマンドのGAを実行する」というのは例えば
[X,Y]=ga(@(x) GArensyu01(x,ScopeData2), 2)
と実行するということですか?
fumito ito
fumito ito am 30 Jan. 2017
はい,そういうことです. 分かりづらくて申し訳ないです.
fumito ito
fumito ito am 1 Feb. 2017
すいません,前回の回答のacceptが出来ていませんでした. 出来ればこちらの回答もお願いいたします.
michio
michio am 1 Feb. 2017
閲覧者も現象(エラー)を再現させられるようモデルを添付頂くことは可能でしょうか?簡易的なもので構いませんので、原因の検証のためにどうぞよろしくお願いします。
mizuki
mizuki am 1 Feb. 2017
Bearbeitet: mizuki am 1 Feb. 2017
モデルに対する入力値が Simulink モデルに渡されていないことが、このエラーの原因ではないかと思います。
- 関数 MATLAB ファイルで SIM 関数を実行するとエラーが発生するのはなぜですか?
Michio さんの言われている通り、再現モデルがあると、より具体的なアドバイスが可能かと思います。
fumito ito
fumito ito am 1 Feb. 2017
簡易的なものですが少し見づらいかもしれません.申し訳ないです.
michio
michio am 1 Feb. 2017
Bearbeitet: michio am 1 Feb. 2017
モデルファイルそのままの添付は難しそうですか? 可能であればこちらでも
[X,Y]=ga(@(x) GArensyu01(x,ScopeData2), 2)
と実行するだけでエラーを再現できればいいなと考えていました。
fumito ito
fumito ito am 1 Feb. 2017
すいません,モデルファイルの添付はできませんでした. 別の方からもご指摘をもらったのですが,GAのコマンドで入力しているy1,y2がsimulinkモデルのGArensyu2内のy1,y2になっていないのが原因な気がします. そこの解決方法等はありますか?
michio
michio am 1 Feb. 2017
sim('GArensyu2')
sim('GArensyu2','SrcWorkspace','current');
に変更して試して頂けますか?
mizuki
mizuki am 1 Feb. 2017
私が先ほど案内しましたリンクにありますように、sim コマンドの引数に 'SrcWorkspace','current' を追加する内容は実行されましたでしょうか。
もし実行されていなければ、一度実行してみていただけませんか。うまくいかない場合、結果も併せてお知らせください。
fumito ito
fumito ito am 1 Feb. 2017
実行したところ,べつの問題だと思いますが
「ScopeData2が定義されていません」
とエラーがでました.自分の感覚ではsimによってGArensyu2が実行されScopeData2がワークスペースに保存されて,用いることができるという認識だったのですが...
michio
michio am 1 Feb. 2017
Bearbeitet: michio am 1 Feb. 2017
GArensyu01 関数内では ScopeData2 は確かに定義されていないですね。入力引数として与えられているだけです。
画像から判断するに GArensyu2 が実行された結果は 2 つのToWorkspace ブロックから simout1, simout2 という変数で出力されていそうですよ?
ブロックの挙動はこちらを確認してみてください。 https://jp.mathworks.com/help/simulink/slref/toworkspace.html
fumito ito
fumito ito am 1 Feb. 2017
scopeブロックの設定で,「データをワークスペースに保存」にチェックを入れているため,GArensyu2を実行するとベースワークスペースにScopeData2が出力されます.
ベースワークスペースの変数を使うやり方は以前教えて頂いたやり方でできていたので,GAを実行する際に
sim('GArensyu2')
が実行されていないということなんでしょうか. 何度も質問申し訳ないです.

Melden Sie sich an, um zu kommentieren.

 Akzeptierte Antwort

michio
michio am 1 Feb. 2017
Bearbeitet: michio am 1 Feb. 2017

2 Stimmen

まとめます。
まず Simulink モデルで参照しているワークスペースがデフォルトでは、”ベースワークスペース” であるため、関数ワークスペース(simコマンドの呼び出し元)で定義されている変数 y1,y2 にアクセスできず、エラーが生じていました。
ワークスペースについての参照ページ: ベース ワークスペースと関数ワークスペース
解決方法として、sim 関数実行時に、SrcWorkspace プロパティを 'current' に 設定し、モデルが参照するワークスペースを呼び出し元のワークスペース(GArensyu01関数内)に設定すること紹介しました。
sim('GArensyu2','SrcWorkspace','current');
この時、スコープから出力されるはずの変数 ScopeData2 は sim 関数から出力される構造体に保存され、ScopeData2 という変数は単体としては、関数ワークスペース、ベースワークスペースどちらにも保存されません。詳細は下記 URL を確認ください。
上記のURLで説明されている通り、sim コマンドの出力変数を
simOut = sim('GArensyu2','SrcWorkspace','current');
と simOut で受けた上で、simOut 構造体内の ScopeData2 の値を
trq= simOut.ScopeData2(:,2)
という様に使用できるのではと考えています。
また、
[X,Y]=ga(@(x) GArensyu01(x, ScopeData2), 2)
との実行をされた場合(ベースワークスペースでの実行と想定)、この実行時に ScopeData2 変数が定義されていない場合エラーが発生します。
既に上述の様に ScopeData2 は simOut という構造体の一部として sim 関数の呼び出し元で定義されベースワークスペースには登場しないので、実際は
[X,Y]=ga(@(x) GArensyu01(x), 2)
との実行で十分だと考えられます。

12 Kommentare

michio
michio am 1 Feb. 2017
以上をコードに落としこむと、、
function trqfuka=GArensyu01(x)
y1=[0 x(1)]
y2=[0 x(2)]
open('GArensyu2');
simOut = sim('GArensyu2','SrcWorkspace','current');
trq= simOut.ScopeData2(:,2)
trq_int=(trq*0.022222).^2
trqfuka=sum(trq_int)
と GArensyu01.m を定義し
[X,Y]=ga(@(x) GArensyu01(x), 2)
と ga 関数を実行してみてください。手元で実行できないのである程度推測を含んで回答していますが、これでうまくいかない場合はまず、上で紹介したURLページなどを参考に試行錯誤してみてください。
fumito ito
fumito ito am 1 Feb. 2017
 
 trq= simOut.ScopeData2(:,2)
の部分を
trq= simOut.get('ScopeData2')
trqa=trq(:,2)
にしたところエラーが出ずに回りました.本当にありがとうございます.
最後に一つだけ質問があるのですが,自分はGAをoptimtoolの画面をクリックすることによって実行しているので探索計算中の反復数が見れます.ですが,今回は反復数は増えずにモデルが何度も回っていたのですが,この状態は探索計算をしてくれているという認識でよろしいのでしょうか.様子をみていたら以下のようなエラーがでで,MATLABが強制終了されました.何かわかることがありましたらお教えください.
今回の質問に関しては協力してくださり本当にありがとうございました.
fumito ito
fumito ito am 1 Feb. 2017
すいません.エラーの文です
fumito ito
fumito ito am 1 Feb. 2017
mizuki
mizuki am 1 Feb. 2017
sim コマンドで変数が使用できない件、問題が解決されたとのことで良かったです。
添付していただいたエラー画面は、エラーが起こっていることを示しているもので、エラーの詳細は記載されていません。Details をクリックすると詳細を見ることができます。そちらを見ていただき、解決法が分からなければ内容を教えていただけますか。
ちなみにこの画面はMATLABクラッシュ時に出る画面です。out of memory などでよく出ます。
今回はこちらで問題ありませんが、別のご質問は別のスレッドを立てていただくと、後で同様の問題が起こって検索してきた方が見やすいのでご協力のほどよろしくお願いします!
mizuki
mizuki am 2 Feb. 2017
[追加情報]
このクラッシュ画面で Send ボタンを押しますと、既知の問題であれば solution のメールがきます。
michio
michio am 2 Feb. 2017
> mizukiさん、詳細ありがとうございます!
> fumito ito さん クラッシュログを見ていないので(みても分からない可能性は高いですが・・是非 Send ボタンで情報を送ってみてください)ただの推測ですが、GArensyu01 関数内の
open('GArensyu2');
が毎回実行されるのはよろしくない気がしますね。この一行を消して、代わりに
load_system('GArensyu2')
とコマンドラインで実行した上で、optimtool 上で ga を実行してみてください。
fumito ito
fumito ito am 2 Feb. 2017
Mhchioさん,mizukiさん毎回ありがとうございます. エラーの文は毎回でる感じではありませんでした.すいません. Micioさんに教えて頂いたコマンドも試しました. ただ,GAの反復回数が1増える間にモデルは何回も実行されるんですが,何故でしょうか.自分の認識では一回反復するたびにモデルが一回実行されると思っていたのですが...
michio
michio am 2 Feb. 2017
遺伝的アルゴリズムはそういうものです。
各反復で複数のパラメータセット(いわゆるポピュレーション、ga 関数だと既定では変数が5個以下の場合は50)に対してそれぞれモデルを実行して、適応度を評価します。つまり各反復で50回はモデルが実行されているかと思います。
遺伝的アルゴリズム に関連する情報がまとまっておりますので、参考にしてください。
fumito ito
fumito ito am 2 Feb. 2017
そういうものなんですね... 時間に余裕が出来たら,またしっかりと勉強します. 本当にありがとうございました!
michio
michio am 2 Feb. 2017
Good luck :)
mizuki
mizuki am 2 Feb. 2017
System Error の方は、頻繁に出るようであれば Technical Support にお問い合わせください。MATLAB が強制終了されてしまう状況であれば、全てではありませんが可能な限りのヘルプは Technical Support でできるということでした。計算結果が正常に得られるといいですね。

Melden Sie sich an, um zu kommentieren.

Weitere Antworten (0)

Kategorien

Gefragt:

am 30 Jan. 2017

Kommentiert:

am 2 Feb. 2017

Community Treasure Hunt

Find the treasures in MATLAB Central and discover how the community can help you!

Start Hunting!

Translated by