1

このように呼び出して fmincon を介して解決した、かなり複雑な最適化問題の設定があります。

myfun = @(x5) 0.5 * (norm(C*x5 - d))^2 + 0.5 * (timeIntervalMeanGlobal * powerAbsMaxMaxGlobal * sum(x5(28:128),1))^2;
[x5, fval] = fmincon(myfun, initialGuess, -A, b, Aeq, beq, lb, []);

コンポーネントはここに印刷するには長すぎますが、寸法は次のとおりです。

C: 49 x 128  
x5: 128 x 1  
d: 49 x 1  
timeIntervalMeanGlobal, powerAbsMaxMaxGlobal: constants  
initialGuess: 128 x 1  
A: 44541 x 128  
b: 44541 x 1  
Aeq: 24 x 128  
beq: 24 x 1  
lb: 128 x 1  

これはコードで機能しますが、完全に満足できる結果は得られません。似たような方法で呼び出されるMATLABに組み込まれているga関数と比較したいのですが、このように実行しようとするとエラーになります。

[x5, fval] = ga(myfun, nvars, -A, b, Aeq, beq, lb, []);  

ここで nvars = 128. で始まる約 8 つのエラーの長いリストがあります。

??? ==> mtimes の使用エラー
内部行列の次元は一致する必要があります。

で終わる

原因:
ユーザー提供のフィットネス関数評価の失敗。GA を続行できません。

誰かが ga を適切に呼び出す方法を教えてくれますか? また、同じコードが fmincon でエラーを引き起こさないのに、ga 呼び出しでこのエラーが発生する理由について洞察を与えることができますか? 私はすべての MATLAB ヘルプ ファイルと例をいくつかの異なる順列で試しましたが、うまくいきませんでした。ありがとう。

更新: 問題は見つかったと思いますが、修正方法がわかりません。ga のドキュメントには、「フィットネス関数は長さ nvars の行ベクトルを受け入れる必要があります」と記載されています。私の場合、myfun はフィットネス関数ですが、x5 は列ベクトルです (lb もそうです)。したがって、数学的には C*x5 = d が非正方行列の場合でも x5'*C' = d' と同じであることはわかっていますが、ga ソルバーについてそのように問題を定式化することはできません。試しました-フィットネス機能を通過しますが、エラーが発生します

A の行数は、b の長さと同じでなければなりません。

この問題をソルバーに適した形式で取得する方法について何か考えはありますか? ありがとう!

4

1 に答える 1

1

とった!すべての制約で列ベクトルであっても、x5 を行ベクトルとして使用するようにフィットネス関数を操作する必要がありました。

myfun = @(x5) 0.5 * (norm(x5 * C' - d'))^2 + 0.5 * (timeIntervalMeanGlobal * powerAbsMaxMaxGlobal * sum(x5(28:128)))^2;

ふぅ!

于 2013-10-08T20:55:22.057 に答える