在 Matlab 中使用 fmincon 进行稳健优化?
根据对原始问题的评论中的讨论,您的问题似乎可以按照 fmincon 要求的形式表述为
受制于
其中、、和都是已知常数。您还没有说出来,但是如果您还想添加约束 ,我不会感到惊讶。请注意,我必须将大于或等于约束乘以负数才能将其变为小于或等于约束。
要使用 fmincon 解决此问题,您需要为目标定义一个 MATLAB 函数,并为非线性约束定义另一个 MATLAB 函数。这里的一个稍微棘手的问题是如何将参数、和放入这些函数中。这可以使用全局变量(老式方式)或使用匿名函数(Mathworks 现在推荐的方式)来完成。“help fmincon”中的示例说明了如何执行此操作
只需添加上面的答案,解开符号位以将其置于标准的稳健优化格式中。
你有其中不确定性已知满足并且你的半径恰好被参数化为.
在对不确定性进行最小化后,即消除不确定性约束中的 for-all 算子,归结为具有凸范数约束的标准二次问题。尽管 fmincon 很可能会起作用,但它并不是真正完成任务的最佳工具,因为这是一个非常特殊的问题类别,有专门的极其有效的求解器。
知道这个问题很容易推广到关于不确定性的其他规范球也可能很有趣。
为了好玩,这里是 MATLAB Toolbox YALMIP中的一些实验代码
首先,解决上面手动导出的问题。如果您安装了高效的二阶锥规划求解器,它将使用它。否则,它可能会使用 fmincon
n = 10;
alpha = randn(10,1);
S = randn(10);S = S'*S;
kappa = 0.01;
r0 = .01;
w = sdpvar(n,1);
Objective = w'*S*w;
Budget = [w >= 0, sum(w)==1];
Robust = [w'*alpha - kappa*norm(alpha)*norm(w) >= r0];
solvesdp([Budget,Robust], Objective)
double(w)
实际上,YALMIP 有一个内置的框架,可以自动推导出这些健壮的模型。因此,以下问题推导出论文中的结果并解决问题
w = sdpvar(n,1);
U = sdpvar(n,1);
rp = alpha + kappa*norm(alpha)*U;
Objective = w'*S*w;
Budget = [w >= 0, sum(w)==1];
Uncertainty = [rp'*w >= r0, uncertain(U), U'*U <= 1];
solvesdp([Budget,Uncertainty], Objective)
这允许我们尝试替代模型,例如框约束的不确定性(这会导致一个简单的二次规划,所以 fmincon 绝对不是要走的路)
w = sdpvar(n,1);
U = sdpvar(n,1);
rp = alpha + kappa*norm(alpha)*U;
Objective = w'*S*w;
Budget = [w >= 0, sum(w)==1];
Uncertainty = [rp'*w >= r0, uncertain(U), -1 <= U <= 1];
solvesdp([Budget,Uncertainty], Objective)
如果您安装了高效的混合整数 SOCP 求解器(例如 gurobi、cplex 或 mosek),您可以添加组合结构,例如对您的仓位进行基数约束
solvesdp([Budget,Uncertainty,nnz(w)<=3], Objective)
因此,通过更广泛地看待问题,我希望您意识到可以做更多的乐趣,而不是简单地将通用非线性求解器用于特定的问题定义。