1

我正在使用全局最大化工具箱来最大化以下功能:

    function x = NameOfFunction (w1, w2, w3, a, b, c, Structure1, Structure2, Structure3)

我通过更改、和x的值来最小化。其余参数是常量和包含数据的结构。的值以及三个变量取决于通过结构输入函数的数据。w1w2w3xw

该函数返回x的是在运行过程中计算的 180 个值的平均值NameOfFunction

我想知道如何对 180 个值的标准偏差添加约束。我对最小化平均值和标准偏差不感兴趣,而是最小化x(平均值),同时允许标准偏差不大于某个特定值。我知道如何为决策变量(即w1w2w3)添加约束,但不知道如何为标准偏差等值添加约束。

编辑:更多细节,根据维尔纳的建议:

%the functions is f(w) rather than f(x)

%constraints:
Aeq = [1 1 1];
beq = 1;
lb = .10 * [1 1 1];
ub = .8 * [1 1 1];

w = [weight1, weight2, weight3];     
wstart = randn(3,1);

options = optimset('Algorithm','interior-point');

% function handle for the objective function (note that variables 
% aa through hh are additional parameters that the solver does not modify): 
h = @(w)NameOfFunction(w(1),w(2),w(3), aa, bb, cc, dd, ee, ff, gg, hh);

% problem structure:
problem = createOptimProblem('fmincon','x0',wstart,'objective',h,...'
'Aeq',Aeq,'beq',beq,'options',options,'lb',lb,'ub',ub);

gs = GlobalSearch;
run(gs,problem)

我正在运行GlobalSearchusing fmincon


2013 年 7 月 16 日,实施后,nonlcon我能够实现我试图做的事情。(我有一个后续问题,我把它放在这篇文章的底部)。这是我所做的:

如前所述,我添加了另一个函数 ( StdConstraintFunction)。所以现在我有以下内容:

stdMax = 0.01;
h = @(w)NameOfFunction(w(1),w(2),w(3),aa, bb, cc, dd, ee, ff, gg);
StdConstraint = @(w)StdConstraintFunction(w(1),w(2),w(3),aa, bb, cc, dd, ee, ff, gg,stdMax);

哪里是计算标准偏差而不是平均值 StdConstraintFunction的修改版本。NameOfFunction

这两个函数的最后一行是函数体中唯一不同的地方。

NameOfFunction中,最后一行是:

ReturnVariable = -1 * (nanmedian([vect1]));
%note: I added the -1 multiplication to search for the maximum rather than minimum

最后一行StdConstraintFunction是:

ReturnVariable = (std([vect1]) - stdMax);
ceq = []; 
%ceq is a required variable that is supposed to return the equality non-linear
%constraint; here it is blank because I don't have one.  The optimization 
%would produce an error if I exclude it

我的问题设置是:

problem = createOptimProblem('fmincon','x0',xstart,'objective',h,'Aeq',Aeq,'beq',beq,'options',options,'lb',lb,'ub',ub,'nonlcon',StdConstraint);

@Werner:如果您想将此作为问题的答案发布,我很乐意接受它作为官方答案。非常感谢你们的帮助!

4

1 回答 1

1

解决非线性条件下的优化问题,仅取决于被优化的变量

使用 matlab fmincon文档

x = fmincon(fun,x0,A,b,Aeq,beq,lb,ub,nonlcon,options)

在哪里:

nonlcon:计算非线性不等式约束 c(x)≤ 0 和非线性等式约束 ceq(x) = 0 的函数。nonlcon 接受向量 x 并返回两个向量 c 和 ceq。c 是包含在 x 处评估的非线性不等式的向量,而 ceq 是包含在 x 处评估的非线性等式的向量。nonlcon 应指定为文件或匿名函数的函数句柄,例如 mycon:

x = fmincon(@myfun,x0,A,b,Aeq,beq,lb,ub,@mycon)

其中 mycon 是一个 MATLAB 函数,例如

function [c,ceq] = mycon(x)
c = ...     % Compute nonlinear inequalities at x.
ceq = ...   % Compute nonlinear equalities at x.

如果还可以计算约束的梯度并且 GradConstr 选项为“on”,则设置为

options = optimoptions('fmincon','GradConstr','on')

那么 nonlcon 还必须在第三个和第四个输出参数中返回 GC,c(x) 的梯度和 GCeq,ceq(x) 的梯度。GC 和 GCeq 可以是稀疏的,也可以是密集的。如果 GC 或 GCeq 很大,非零条目相对较少,则通过将它们表示为稀疏矩阵来节省内点算法的运行时间和内存。有关详细信息,请参阅非线性约束

因此,为了添加非线性约束,您需要做的是使用 nonlcon 函数,该函数将返回 c 与 w 值的标准偏差。它可以使用匿名函数来完成:

nonlcon = @(x) std(x) - std_lim;

这意味着 std(x) <= std_lim,其中 x 是传递给 matlab 进行优化的变量,在本例中是wstart变量,但在第 k 次迭代。当然,你可以使用任何你想要的东西来代替 std,即x(1)^2 + x(2)^3 - sin(x(3))假设你有三个变量被优化。

然后将您的代码更改为:

problem = createOptimProblem('fmincon','x0',wstart,'objective',h,...
'Aeq',Aeq,'beq',beq,'options',options,'lb',lb,'ub',ub,'nonlcon',nonlcon);

注意:如果您没有上述一个或多个额外变量,即线性下边界lb,请不要将其添加到createOptimProblem.

解决非线性条件下的优化问题也取决于未优化的变量

在这个特定问题中,要优化的问题变量 (w) 并不是 @Mr 注意到的计算标准差所需的唯一变量。Kinn,因此需要为 matlab 非线性条件函数提供额外的变量,这些变量在每次迭代中都没有被优化。为此,我们将匿名函数句柄更改为:

StdConstraint = @(w)StdConstraintFunction(w(1),w(2),w(3),aa, bb, cc, dd, ee, ff, gg,stdMax);

这是一个带有一个输入变量的函数句柄,称为 w,通过 matlab 内部代码提供,变量被优化。在这个提出的解决方案中,这个变量作为三个参数提供给一个名为 StdConstrainFunction 的 matlab 文件函数,该函数还将aa,bb,cc,dd,ee,ff,gg,stdMax从创建句柄函数的环境中接收变量StdConstraint,因此在优化期间它们不会被 matlab 内部例程修改。

在那里,变量用于计算要遵守的非线性条件,请记住,正如 matlab 文档所述,非线性条件函数返回的值必须是两个c,ceq:第一个返回的输出 ,c是当它们被尊重时必须小于零的条件,当超出界限时是 oc。第二个输出ceq是必须遵守的非线性条件方程。

您可以通过更改传递给用作非线性约束的句柄函数的参数来针对您的问题调整此特定解决方案。

考虑也看到这个问题。

于 2013-07-15T19:49:04.020 回答