遺伝的アルゴリズムを​回すために、simu​linkにおいてロー​カル関数から全体のシ​ミュレーションを回し​たい。

タイトルの通りです。
simulinkにおいて、下記画像1つ目のようなモデルを組みました。
そして、このモデルに対して遺伝的アルゴリズムを行おうとしています。具体的には、GAというmatlabファイル内にて定義されているevaluation という名前のローカル関数を回すたびに、この下記画像1つ目のPath_Planにevaluationから値を渡し、シミュレーションを最後まで回して、いくつかのデータを収集するという操作を行いたいと考えています。シミュレーションが終わったあとは、evaluationに戻り、再びpath_planにevaluationから変数を渡す ということを任意回繰り返します。(下記画像2つ目はGAとPath_Planの画像です。)
しかし以下のような問題が発生しました。
①evaluationを回すたびに、他のmatlabファイルに変数を渡す方法が分からない。
②evaluationを回すたびに、他のmatlabファイルに変数を渡したとしても、またGAというmatlabファイルに戻る方法が分からない。
コードの中身は事情によりお見せ出来ません。
もし解決策がある方がいらっしゃればご教授いただければ幸いです。

11 个评论

Atsushi Ueno
Atsushi Ueno 2021-9-25
MATLAB(evaluation関数)を中心に動かせば、他のMATLABファイル(関数)にデータを渡して実行する事も可能ですし、自分で決めた通りの順序で実行出来ますよ。
  1. evaluation関数を実行する
  2. 他のmatlabファイルに変数を渡す
  3. 実行結果を引数として入力し、モデルをsimで実行
  4. モデル実行結果(データ)を収集する
  5. 1に戻る
重要なことを書き忘れていましたので補足します。
1枚目の画像のシミュレーションを回す際にはPath_Planを何度も回します。(これを一度の"走行"と名づけます)つまり一度の走行において、Path_Planを何度も回します。
そのために、もしPath_Planをevaluationから変数を受け取るようにした場合、Path_Planにevaluationからパラメータを渡すとなると、一度の走行の間に、何度もパラメータを受け取ることになります。
自分が行いたい操作は、あるパラメータのリストを与えて、各パラメータに対して、走行を行いデータを取ります。そしてパラメータの数だけ走行をした後、データをGAに送るというものです。
つまり、「パラメータのリストからパラメータを保持して、同じパラメータでPath_Planを何度も回す。その間はデータを収集してある終了条件を満たしたら、全てを初期条件に戻して、リストから次のパラメータを取ってきてPath_Planを何度も回す。これを繰り返す」という操作が行いたいです。データを取る方法については分かるのですが、「パラメータのリストからパラメータを保持して、同じパラメータでPath_Planを何度も回す。終了条件を満たしたら、全てを初期条件に戻して、リストから次のパラメータを取ってきてPath_Planを何度も回す。これを繰り返す。」方法が分かりません。
Atsushi Ueno
Atsushi Ueno 2021-9-25
编辑:Atsushi Ueno 2021-9-25
つまり「GAの各世代をevaluation関数で評価するのにこのモデルを回したい」って事ですよね。
やっぱりGAのプログラムをMATLABで動かして、sim関数経由で「走行」モデルにパラメータを与えて、結果を受け取るのが良いと思いますよ。プロセスの例を挙げるとこんな感じ
  • 1.選択/淘汰/突然変異等、次世代の遺伝子を作る
  • 2.evaluation関数を実行する
  • 2-1.モデルをsim関数で実行
  • 2-1-1.モデルにresult(遺伝子によるパラメータ)を渡す
  • 2-1-2.モデルが回る(走行する)
  • 2-1-3.モデルから結果のデータを収集する
  • 2-2.結果から適合度を計算する
  • 3.適合度が終了条件を満たせば終了、そうでなければ1に戻る
稔彦 廣瀬
稔彦 廣瀬 2021-9-25
编辑:稔彦 廣瀬 2021-9-25
> つまり「GAの各世代をevaluation関数で評価するのにこのモデルを回したい」って事ですよね。
おっしゃる通りです。
> matlabで動かして、sim関数経由で「走行」モデルにパラメータを与える 
というのは、matlabのコマンドウインドウからGAを実行するという意味でしょうか?
全体を動かすのではなく、GAという一部を動かして、「sim関数経由」で「走行」モデルにパラメーターを渡すという認識で合っていますか?
稔彦 廣瀬
稔彦 廣瀬 2021-9-25
编辑:稔彦 廣瀬 2021-9-25
(追記)
sim関数経由で「走行」モデルにパラメータを与えて というのは、set_paramでPath_Planへパラメータを渡せば良い。ということでしょうか?(パラメータを渡す場合はset_paramを使うものと認識しております。)
(追追記)
ここによると、simOut = sim(model,Name,Value) によってパラメータを指定できるとありますね。こちらを使うということですね。
稔彦 廣瀬
稔彦 廣瀬 2021-9-25
编辑:稔彦 廣瀬 2021-9-25
すみません。少しややこしくなってしまったのでまとめると、matlabからGAを単体で実行し、パラメータを生成した後、それをsim関数を使って渡すということですね。
つまり、全体としてはfor文などで、GAの実行によるパラメータ生成とsim関数によるパラメータの受け渡しを繰り返すような操作をするmatlabファイルを別に作り、それを実行すれば任意の世代だけ回すことができるということでしょうか?
Atsushi Ueno
Atsushi Ueno 2021-9-25
编辑:Atsushi Ueno 2021-9-25
>というのは、matlabのコマンドウインドウからGAを実行するという意味でしょうか?
⇒そうです
>全体を動かすのではなく、GAという一部を動かして、「sim関数経由」で「走行」モデルにパラメーターを渡すという認識で合っていますか?
⇒合っています。MATLAB Function ブロックを含む「走行」モデルは、一つの塊(システム)とみなして下さい。下の図において、Simulinkモデルは「走行」をシミュレーションし適合値を得る為の評価手段の一部になったのです。下の図において、一つのシステム(四角)はMATLAB関数でもSimulinkモデルでもどちらでも良いのです。
>sim関数経由で「走行」モデルにパラメータを与えて というのは、set_paramでPath_Planへパラメータを渡せば良い。ということでしょうか?(パラメータを渡す場合はset_paramを使うものと認識しております。)
⇒set_paramは一度忘れてください。「sim関数経由で「走行」モデルにパラメータを与えて」とは下図で言うと、「走行」モデルに対し遺伝子から作った入力パラメータを渡す事で、具体的にはsim関数の引数として渡します。MATLABプログラム内でモデルを関数と同じ様に動かす手段がsim関数です。
>ここによると、simOut = sim(model,Name,Value) によってパラメータを指定できるとありますね。こちらを使うということですね。
⇒そうです
>matlabからGAを単体で実行し、パラメータを生成した後、それをsim関数を使って渡すということですね。
⇒そうです
>つまり、全体としてはfor文などで、GAの実行によるパラメータ生成とsim関数によるパラメータの受け渡しを繰り返すような操作をするmatlabファイルを別に作り、それを実行すれば任意の世代だけ回すことができるということでしょうか?
⇒そうです。プログラムを書いた通りに動きます
絵を描けば分かり易くなるかなと思いましたが、なんか余計に分かり難くなったかも・・・simulinkモデルを一つの塊(システム)とみなして、それに外から時系列データを与えて実行する概念が伝われば良いのですが。
稔彦 廣瀬
稔彦 廣瀬 2021-9-25
编辑:稔彦 廣瀬 2021-9-25
図解での説明、ありがたいです
自分が最初に挙げた画像では、GAが走行モデルの一部になってしまっていてうまく行かなかったわけですが、sim関数を使えばそれを外部化できると。
こちら側の理解できてるかの確認ですが、Atsushi Ueno さんが回答をしてくださっている間に、追記を何度もしてしまったようなので、そちらにも目を通していただければ。
Atsushi Ueno
Atsushi Ueno 2021-9-25
コメントを読み直して、私のコメントも追記修正しました
Atsushi Ueno
Atsushi Ueno 2021-9-25
Simulinkモデルの中でGAのパラメータを最適化しながら実行を進める方法も勿論やろうと思えば実現すると思いますが、なにぶんややこしくなると思います。
set_paramを実行している時点で貴方はもうSimulinkマニアです。
丁寧な説明ありがとうございます!
Atsushi Uenoさんの方針で実装してみます。
この質問に関連した問題が発生したときは、この質問に追加返信いたします。

请先登录,再进行评论。

 采纳的回答

Atsushi Ueno
Atsushi Ueno 2021-9-25

0 个投票

evaluation関数をSimulinkのMATLAB Function ブロック上ではなくMATLAB上で実行すれば:
①evaluationを回すたびに、他のmatlabファイルに変数を渡す方法が分からない。
⇒他のmatlabファイルに変数を渡す事が出来る
②evaluationを回すたびに、他のmatlabファイルに変数を渡したとしても、またGAというmatlabファイルに戻る方法が分からない。
⇒sim関数経由でSimulinkモデルの実行が終わればevaluation関数の実行に戻る
上記の考え方が一つの方法です。

更多回答(0 个)

产品

版本

R2021a

Community Treasure Hunt

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

Start Hunting!