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 回答