双层优化入门(2)—基于yalmip的双层优化求解(附matlab代码)

这篇具有很好参考价值的文章主要介绍了双层优化入门(2)—基于yalmip的双层优化求解(附matlab代码)。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

        上一篇博客介绍了双层优化的基本原理和使用KKT条件求解双层优化的方法:

双层优化入门(1)—基本原理与求解方法

        这篇博客将介绍使用yalmip的双层优化问题的求解方法。

1.KKT函数

        通过调用yalmip工具箱中的KKT函数,可以直接求出优化问题的KKT条件,省去自己手动写的步骤,函数用法如下:

[KKTsystem, details] = kkt(Constraint,Objective,z)

        其中z表示优化变量,KKTsystem存储KKT条件的约束表达式,details是一个结构体变量,用于存储KKT条件的细节。以上一篇博客中双层优化问题的下层优化问题为例:

双层优化入门(2)—基于yalmip的双层优化求解(附matlab代码)

 matlab代码:

%% 目标函数和约束条件
x=sdpvar(1);
y=sdpvar(1);
Constraints=[-3*x+y <= -3 , 3*x+y <= 30];
objective=-y;
[KKTsystem, details] = kkt(Constraints,objective,x);

运行结果:

双层优化入门(2)—基于yalmip的双层优化求解(附matlab代码)

双层优化入门(2)—基于yalmip的双层优化求解(附matlab代码)

        将下层优化的KKT条件作为约束添加到上层优化中,就可以求出这个双层优化的结果:

%% 清空
clc
clear
close all
warning off
%% 目标函数和约束条件
x=sdpvar(1);
y=sdpvar(1);
Constraints_down=[-3*x+y <= -3 , 3*x+y <= 30];
objective_down=-y;
[KKTsystem , details] = kkt(Constraints_down,objective_down,x);
Constraints_up=[2*x-3*y >= -12 , x+y <= 14];
objective_up=-x-2*y;
ops=sdpsettings('verbose', 0 , 'solver', 'gurobi');
result=optimize([KKTsystem,Constraints_up,boundingbox([Constraints_up,Constraints_down])],objective_up,ops);
%% 输出模型
saveampl(KKTsystem,objective_down,'KKT_model');
%% 输出结果
disp(['最优解:x=',num2str(value(x)),',y=',num2str(value(y))])
disp(['最优函数值=',num2str(value(objective_up))])

        求解的结果如下:

双层优化入门(2)—基于yalmip的双层优化求解(附matlab代码)

        和上一篇博客手动写KKT的求解结果一致。

        上面的例子是一个简单的线性双层优化问题,yalmip官方文档中给出了使用KKT函数求解非线性双层优化的例子。这个双层优化问题如下:

双层优化入门(2)—基于yalmip的双层优化求解(附matlab代码)

一样可以用KKT函数求解,代码如下(这是官网提供的代码):

sdpvar x1 x2 y1 y2 y3

OO = -8*x1-4*x2+4*y1-40*y2-4*y3;
OO = OO+OO^2;
CO = [x1>=0, x2>=0];

OI = (x1+2*x2+y1+y2+2*y3)^2;
CI = [[y1 y2 y3] >= 0,
       -y1+y2+y3 <= 10,
      2*x1-y1+2*y2-0.5*y3 <= 10,
      2*x2+2*y1-y2-0.5*y3 <= 9.7];

[K,details] = kkt(CI,OI,[x1 x2])
optimize([K,CO,boundingbox([CI,CO]),details.dual<=100],OO)

求解结果为:

最优目标函数为-0.25

x1=0.0625,x2=0,y1=0,y2=0,y3=0。

2.solvebilevel函数

        solvebilevel是yalmip工具箱内置的求解双层优化问题的函数。也就是通过这个函数,不需要咱手动写KKT条件,也不需要使用KKT函数,直接把上、下层优化的目标函数、约束条件往里面一放,就能求出结果。

        代码如下:

%% 清空
clc
clear
close all
warning off
%% 目标函数和约束条件
x=sdpvar(1);
y=sdpvar(1);
Constraints_down=[-3*x+y <= -3 , 3*x+y <= 30];
objective_down=-y;
Constraints_up=[2*x-3*y >= -12 , x+y <= 14];
objective_up=-x-2*y;
solvebilevel(Constraints_up,objective_up,Constraints_down,objective_down,y)
%% 输出结果
disp(['最优解:x=',num2str(value(x)),',y=',num2str(value(y))])
disp(['最优函数值=',num2str(value(objective_up))])

求解结果如下:

双层优化入门(2)—基于yalmip的双层优化求解(附matlab代码)

         和上篇博客手动写KKT条件,这篇博客利用KKT函数求解的结果都是一样的,确实比较省事。但也要注意,这个函数只适用于规模较小的问题,如果问题规模比较大,还是需要自己手动进行双层问题的求解。

完整代码可以从这里获取:

双层优化入门(2)-基于yalmip的双层优化求解

参考资料均来源于yalmip官方文档:

[1]KKT函数的用法介绍

[2]双层优化的求解

[3]双层优化求解的备用方法

[4]solvebilevel函数用法介绍文章来源地址https://www.toymoban.com/news/detail-467379.html

到了这里,关于双层优化入门(2)—基于yalmip的双层优化求解(附matlab代码)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包