Matlab 找到正确的解算器

Matlab 找到正确的解算器,matlab,optimization,constraints,nonlinear-optimization,Matlab,Optimization,Constraints,Nonlinear Optimization,我需要解决以下带有约束的非线性问题,但我不确定在从算法更改为“内点”到“sqp”时是否使用适当的函数和解算器会给出不同的答案。您是否可以首先帮助确保fmincon是这里最合适的功能,以及是否应该以不同的方式设置选项,以确保优化不会过早停止。我尝试将“MaxFunctionEvaluations”设置为1000000,将“MaxIterations”设置为10000,这很有帮助,但所需的时间也急剧增加 w是一个必须优化其值的向量。 分数是一个与w大小相同的向量 w和分数的大小通常在10到40之间

我需要解决以下带有约束的非线性问题,但我不确定在从算法更改为“内点”到“sqp”时是否使用适当的函数和解算器会给出不同的答案。您是否可以首先帮助确保fmincon是这里最合适的功能,以及是否应该以不同的方式设置选项,以确保优化不会过早停止。我尝试将“MaxFunctionEvaluations”设置为1000000,将“MaxIterations”设置为10000,这很有帮助,但所需的时间也急剧增加

w是一个必须优化其值的向量。 分数是一个与w大小相同的向量

w和分数的大小通常在10到40之间

以下是优化设置:

目标函数:sum(log(abs(w))

线性不等式1:w_i>0(如果分数>0)

线性不等式2:w_i<0如果分数_i<0

非线性等式1:sum(abs(w))=1

非线性不等式1:sqrt(w*σ*w')=0)=-1; 温度(分数<0)=1; A=诊断(温度); b=零(N,1); %%%边界约束 lb=[]; ub=[]; w0=一(1,N)/N; nonlcon=@(w)nonlconstr(w,sigma,tgtVol); options=optimoptions('fmincon','Algorithm','interior-point','MaxFunctionEvaluations',1000000,'MaxIterations',10000); %选项=最佳选项('fmincon'、'Algorithm'、'interior-point'、'OptimimityTolerance',1e-7); [w,fval,exitflag,output]=fmincon(@(w)objectfun(w),w0,A,b,Aeq,beq,lb,ub,非LCON,选项); 函数[c,ceq]=非LConstr(w,sigma,tgtVol) c=sqrt(w*西格玛*w')-tgtVol; ceq=总和(绝对值(w))-1; 结束 函数f=objectfun(w) f=总和(-log(abs(w)); 结束
警告:
abs()
是不可微分的。我总是试着重新设计一些东西来摆脱这个。有关最近的示例,请参见。我怀疑您的问题是非凸的(这可能是不同解算器给出不同解的另一个原因)。感谢您的见解。我想我知道该怎么走了。但是,如果我在使用绝对值时有N个变量,去掉它意味着有3*N个变量。我会得到每一个w_I额外的w_I+和w_I-。是这样吗?我认为在这种情况下不需要变量拆分就可以做到:你从数据中知道$w_I$的符号。是的,这是一个非常好的观点。现在我们得到了一个线性目标函数,使用另一个处理线性目标函数的matlab函数来加速优化是否有意义?据我所知,没有NLP解算器可以利用线性目标。然而,有一些有效的解算器可以处理约束中的二次项(特别是凸项)。恐怕不是内置的Matlab函数。警告:
abs()
是不可微的。我总是试着重新设计一些东西来摆脱这个。有关最近的示例,请参见。我怀疑您的问题是非凸的(这可能是不同解算器给出不同解的另一个原因)。感谢您的见解。我想我知道该怎么走了。但是,如果我在使用绝对值时有N个变量,去掉它意味着有3*N个变量。我会得到每一个w_I额外的w_I+和w_I-。是这样吗?我认为在这种情况下不需要变量拆分就可以做到:你从数据中知道$w_I$的符号。是的,这是一个非常好的观点。现在我们得到了一个线性目标函数,使用另一个处理线性目标函数的matlab函数来加速优化是否有意义?据我所知,没有NLP解算器可以利用线性目标。然而,有一些有效的解算器可以处理约束中的二次项(特别是凸项)。恐怕不是作为一个内置的Matlab函数。
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