このように呼び出して 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 の長さと同じでなければなりません。
この問題をソルバーに適した形式で取得する方法について何か考えはありますか? ありがとう!