matlab中的非线性约束

matlab中的非线性约束,matlab,optimization,constraints,solver,nonlinear-optimization,Matlab,Optimization,Constraints,Solver,Nonlinear Optimization,我正在使用matlab中的解算器fmincon,我想添加一个非线性约束,以便要优化的变量具有固定数量的非零元素。这个数字等于25,如下面的函数所示是固定的 因此,我将非线性约束设置为: nonlcon = @limitSizeBasket; function [c,ceq] = limitSizeBasket(x,maskTop,maskBottom) %This function limit the size of the basket c = sum(any(x(1,:),1))

我正在使用matlab中的解算器fmincon,我想添加一个非线性约束,以便要优化的变量具有固定数量的非零元素。这个数字等于25,如下面的函数所示是固定的

因此,我将非线性约束设置为:

nonlcon = @limitSizeBasket;

function [c,ceq] = limitSizeBasket(x,maskTop,maskBottom)
%This function limit the size of the basket

    c = sum(any(x(1,:),1)) - 25;
    ceq = [];
end

x = fmincon(@(x)fun(x,scoreTop,scoreBottom),x0,A,b,Aeq,beq,lb,ub,@(x)nonlcon(x,maskTop,maskBottom),options)';

不幸的是,x的结果值似乎根本没有考虑这个约束,因为所有x都不是零。这里x是70个元素的向量,我将非零元素的数量限制为最多25个。我定义约束的方式有问题吗?还是问题来自其他方面?

通常我们会使用MINLP(混合整数非线性规划)解算器来处理此类基数条件。我知道matlab有MILP解算器,但我没有听说过MINLP。你知道吗?MINLP解算器随时可用。例如,BonMin、Knitro、Couenne、Baron等,如果非线性是二次的,则有更广泛的选择。如果我需要让x变量在两个边界之间灵活,但我还需要限制非零项的数量,您将如何解决该问题。最好使用MINLP并添加表示金额的变量,还是像我一样使用带有附加约束的FMINCON?已经感谢您的见解。通常会使用二进制变量来指示变量是否为非零。这方面有标准的配方。