我需要用约束解决以下非线性问题,但我不确定使用适当的函数和求解器来改变算法:'interior-point'到'sqp'给出不同的答案。您能否首先确保fmincon是最合适的功能,以及是否应以不同的方式设置选项以确保优化不会过早停止。我试图设置:'MaxFunctionEvaluations'到1000000和'MaxIterations'到10000,这有帮助,但所需的时间也大大增加。
w是一个必须优化其值的向量。 得分是与w相同大小的向量。
大小如果w和分数通常在10到40之间。
以下是优化设置:
目标函数:sum(log(abs(w)));
线性不等式1:w_i>如果scores_i> 0,则为0 0
线性不等式2:w_i&lt;如果得分_i <0,则为0 0
非线性等式1:sum(abs(w))= 1
非线性不等式1:sqrt(w * sigma * w')&lt; = 0.1
这是我的代码:
N = numel(scores);
%%%LINEAR EQUALITIES CONSTRAINTS
Aeq = [];
beq = [];
%%%LINEAR INEQUALITIES CONSTRAINTS
temp = ones(0,N);
temp(scores >= 0) = -1;
temp(scores < 0) = 1;
A = diag(temp);
b = zeros(N,1);
%%%BOUNDs CONSTRAINTS
lb = [];
ub = [];
w0 = ones(1,N)/N;
nonlcon = @(w)nonlconstr(w,sigma,tgtVol);
options = optimoptions('fmincon','Algorithm','interior-point','MaxFunctionEvaluations',1000000,'MaxIterations',10000);
%options = optimoptions('fmincon','Algorithm','interior-point','OptimalityTolerance',1e-7);
[w,fval,exitflag,output] = fmincon(@(w)objectfun(w),w0,A,b,Aeq,beq,lb,ub,nonlcon,options);
function [c,ceq] = nonlconstr(w,sigma,tgtVol)
c = sqrt(w*sigma*w') - tgtVol;
ceq = sum(abs(w)) - 1;
end
function f = objectfun(w)
f = sum(-log(abs(w)));
end