ハンドルクラス内のf​mincon使用に関​する不具合

11 views (last 30 days)
MF
MF on 14 Jun 2022
Commented: MF on 16 Jun 2022
現在、私はMATLABで強化学習を行っています。ハンドルクラスを作成し、その中のfunction内でfminconを使用していますが値0しか返さない状態になって困っています。以下にコードを示します。
x;
A = [];
b = [];
Aeq = [];
beq = [];
lb = [];
ub = [];
nonlcon = [];
x0 = [0,0];
obj.fun = @(x)100*(obj.x(2)-obj.x(1)^2)^2 + (1-obj.x(1))^2;
obj.x = fmincon(obj.fun,obj.x0,obj.A,obj.b,obj.Aeq,obj.beq,obj.lb,obj.ub,obj.nonlcon)
私は最初のコードの一部であるobj.fun = @(x)をobj.fun = @(obj.x)と記述していないことが原因なのではないかと考えているのですが、この記述方法ではドットを使用しているので実行時に「演算子の使用が無効です。」とエラーが出てきてしまいます。fminconが0しか返さない原因はこのobj.funの記述が悪いからでしょうか?また、その場合、どのようにすればハンドルクラス内でobj.funを定義できるのでしょうか?

Accepted Answer

Atsushi Ueno
Atsushi Ueno on 14 Jun 2022
【回答】無名関数@(x)の引数はxです。引数xを使わなければ、引数xを渡した意味がありません。
obj.fun = @(x)100*(obj.x(2)-obj.x(1)^2)^2 + (1-obj.x(1))^2; % 【誤】
obj.fun = @(x)100*( x(2)- x(1)^2)^2 + (1- x(1))^2; % 【正】
>最初のコードの一部であるobj.fun = @(x)をobj.fun = @(obj.x)と記述していないことが原因なのではないかと...
⇒@(x)のxは無名関数の引数です。同関数内でobj.xやobj.x0にアクセスすると無名関数を使う意味がなくなります。
>fminconが0しか返さない原因はこのobj.funの記述が悪いからでしょうか?
はい。obj.funの記述を上記のように変更すべきである事は間違いありません。obj.xはfmincon関数の答えを格納する為のメモリなのに、最小化関数obj.funの要素としてアクセスしてしまっています。仮にobj.xに何らかの値が入っていればそれを使った答えが再びobj.xに代入される事になるでしょう。ただ「fminconが0しか返さない」問題を再現しようとしてもエラーが出てしまい再現できませんでした。何か背景が異なるのだと思います。
fminconの例にある非線形制約関数 unitdisk (添付ファイル) も追加し、出力が同ドキュメントと同じになる事を確認しました。
obj = MyHandleClass();
obj.fun = @(x)100*(x(2)-x(1)^2)^2 + (1-x(1))^2;
obj.nonlcon = @unitdisk;
obj.x0 = [0,0];
obj.x = fmincon(obj.fun,obj.x0,obj.A,obj.b,obj.Aeq,obj.beq,obj.lb,obj.ub,obj.nonlcon)
Local minimum found that satisfies the constraints. Optimization completed because the objective function is non-decreasing in feasible directions, to within the value of the optimality tolerance, and constraints are satisfied to within the value of the constraint tolerance.
obj =
MyHandleClass with properties: fun: @(x)100*(x(2)-x(1)^2)^2+(1-x(1))^2 x: [0.7864 0.6177] A: [] b: [] Aeq: [] beq: [] lb: [] ub: [] nonlcon: @unitdisk x0: [0 0]
追記:余談ですがfmincon関数のドキュメントに問題構造体説明があります。強化学習の為にハンドルクラスを作る必要があるのかもしれませんが、専用の構造体が準備されていて、引数一つ渡せば良いので便利そうです。
  1 Comment
MF
MF on 16 Jun 2022
ご回答ありがとうございます。
ご指摘していただいたように記述を直したところ、動作するようになりました。
また、私のプログラムの他の部分にもミスがあったため、そちらも直したところ正常に動作しました。ありがとうございました。

Sign in to comment.

More Answers (0)

Community Treasure Hunt

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

Start Hunting!