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

简介: 双层优化问题(Bilevel Programming Problems),也被称为双层规划,最早由Stackelberg与1934年在经济学相关研究中提出,因此也被称为Stackelberg问题。双层规划问题一般具有层次性、独立性、冲突性、优先性和自主性等特点。本文介绍了双层优化的原理与求解方法,并提供了相应的matlab代码供参考学习。

 1.介绍

       双层优化问题(Bilevel Programming Problems),也被称为双层规划,最早由Stackelberg与1934年在经济学相关研究中提出,因此也被称为Stackelberg问题。

       双层规划问题一般具有层次性、独立性、冲突性、优先性和自主性等特点:

       1)层次性

       优化时是分层管理的形式,下层优化服从上层优化,但下层优化有相对的自主权。

       2)独立性

       各层决策者各自控制一部分决策变量,以优化各自的目标。

       3)冲突性

       各层决策者有目标函数各不相同,且这些目标往往是相互矛盾的。

       4)优先性

       上层决策者优先做出决策,下层决策者在选择策略时,不能改变上层的决策。
       5)自主性

       上层的决策可能影响下层的行为,因而部分地影响下层目标的实现,但上层不能完全控制下层的选择行为,在上层决策允许范围内,下层有自主决策权。

       按照上下层优化的形式不同又可以分为线性双层优化以及非线性双层优化问题。当双层优化问题中所有目标函数和约束条件均为线性时,即为线性双层优化,否则就是非线性双层优化问题。其中双层优化的基本形式可描述为:


       其中,x和y是上层优化的决策变量,但x在下层优化中是参数。所以,双层优化模型是一个优化问题受制于另一个优化问题的模型。

2.问题分析

       下面是一个简单的线性双层优化问题:

image.gif

       上下层优化的目标函数和约束条件均为线性,该问题为线性双层优化问题,

       为说明原理,按照上下层优化迭代的方式进行求解。

       1)第一次迭代

       首先不考虑下层优化的决策,上层优化求出最优解为 x1*=6y1=8,上层最优目标函数为-22,将 x1*=6 带入下层优化中,求出 y1*=12,下层最优目标函数为-12

       2)第二次迭代

       将 y1*=12 带入上层优化中,此时上层优化的两个约束条件互相冲突,上层优化无最优解。 迭代无法收敛,是否意味着这个双层优化问题无解?很明显不是的,实际上这个问题存在最优解 x=8y=6,上层优化最优目标函数值为-20

matlab代码:

%% 清空
clc
clear
close all
warning off
%% 采用迭代方法进行求解
x=sdpvar(1);
y=sdpvar(1);
Constraints1=[2*x-3*y >= -12 , x+y <= 14 , x>=0 , y>=0];
objective1=-x-2*y;
objective2=-y;
ops=sdpsettings('verbose', 0 , 'solver', 'cplex');
result=optimize(Constraints1,objective1,ops);
if result.problem==0
    disp(['第一次迭代最优解:x=',num2str(value(x)),',y=',num2str(value(y))])
    disp(['第一次迭代最优函数值=',num2str(value(objective1))])
end
x_dot=zeros(1,100);
y_dot=zeros(1,100);
x_dot(1)=value(x);
for k=1:10
    Constraints2=[-3*x+y <= -3 , 3*x+y <= 30 , x==x_dot(k) , x>=0 , y>=0];
    result=optimize(Constraints2,objective2,ops);
    y_dot(k)=value(y);
    Constraints1=[2*x-3*y >= -12 , x+y <= 14 , y==y_dot(k) , x>=0 , y>=0];
    result1=optimize(Constraints1,objective1,ops);
    x_dot(k+1)=value(x);
    if result1.problem || result.problem
        disp('迭代无法收敛')
        break
    end
end

image.gif

       运行结果:


3.双层优化求解方法

       上面的问题是一个小规模线性双层优化问题,通过迭代也无法求出问题的解,实际我们要解决的问题一般都不会这么简单,通常规模比较大,或者模型中存在非线性,一般来说很难通过简单的迭代法进行求解,需要考虑其他方法。实际上,双层优化问题是一个 NP 难问题,通常采用的方式是利用 KKT(Karush-Kuhn-Tucker)条件将双层优化转换为单层优化问题。假设一个优化问题是如下的形式:


定义拉格朗日函数为:

image.gif

       其中,λjgj(x)=0 对应的拉格朗日乘数, uk是hk(x)<=0 对应的拉格朗日乘数,那么该优化问题取得最优解的必要条件(也就是 KKT 条件)为:


以上面提到的线性双层优化问题为例,其下层优化的拉格朗日函数为:

image.gif

KKT 方程组如下:


将下层优化的 KKT 条件添加到上层优化问题中,就将双层优化问题转换为了单层优化问题:

image.gif

       对于该问题,可以分三种情况讨论:

       1) u1 =0,模型可以简化为:


       2) u1∈(0,1)(1,+∞),模型可以简化为:


       3) u1=1,模型可以简化为:


matlab代码:

%% 清空
clc
clear
close all
warning off
%% u1=0
x=sdpvar(1);
y=sdpvar(1);
Constraints1=[2*x-3*y >= -12 , x+y <= 14 , x>=0 , y>=0 , -3*x+y <= -3 , 3*x+y == 30 ,];
objective=-x-2*y;
ops=sdpsettings('verbose', 0 , 'solver', 'cplex');
result1=optimize(Constraints1,objective,ops);
disp('***********u1=0时的最优解和最优函数值************')
if result1.problem==0
    disp(['最优解:x=',num2str(value(x)),',y=',num2str(value(y))])
    disp(['最优函数值=',num2str(value(objective))])
else
    disp('无最优解')
end
%% u1∈(0,1)∪(1,+∞)
x=sdpvar(1);
y=sdpvar(1);
Constraints1=[2*x-3*y >= -12 , x+y <= 14 , x>=0 , y>=0 , -3*x+y == -3 , 3*x+y == 30 ,];
objective=-x-2*y;
ops=sdpsettings('verbose', 0 , 'solver', 'cplex');
result2=optimize(Constraints1,objective,ops);
disp('****u1∈(0,1)∪(1,+∞)时的最优解和最优函数值*****')
if result2.problem==0
    disp(['最优解:x=',num2str(value(x)),',y=',num2str(value(y))])
    disp(['最优函数值=',num2str(value(objective))])
else
    disp('无最优解')
end
%% u1=1
x=sdpvar(1);
y=sdpvar(1);
Constraints1=[2*x-3*y >= -12 , x+y <= 14 , x>=0 , y>=0 , -3*x+y == -3 , 3*x+y <= 30 ,];
objective=-x-2*y;
ops=sdpsettings('verbose', 0 , 'solver', 'cplex');
result2=optimize(Constraints1,objective,ops);
disp('***********u1=1时的最优解和最优函数值************')
if result2.problem==0
    disp(['最优解:x=',num2str(value(x)),',y=',num2str(value(y))])
    disp(['最优函数值=',num2str(value(objective))])
else
    disp('无最优解')
end

image.gif

运行结果:

image.gif

       这样就完成了对上述简单线性双层优化问题的求解。通过下层优化的KKT条件将双层优化转换为单层优化是最常用的方法,但不是唯一的方法,后面我将继续更新这个系列,和大家一起学习双层优化问题。

参考文献:

[1] Bilevel Programming Problems

完整代码和相应资料可以从这里下载:

双层优化入门资料-基本原理和求解方法

相关文章
|
14天前
|
算法 调度
基于遗传模拟退火混合优化算法的车间作业最优调度matlab仿真,输出甘特图
车间作业调度问题(JSSP)通过遗传算法(GA)和模拟退火算法(SA)优化多个作业在并行工作中心上的加工顺序和时间,以最小化总完成时间和机器闲置时间。MATLAB2022a版本运行测试,展示了有效性和可行性。核心程序采用作业列表表示法,结合遗传操作和模拟退火过程,提高算法性能。
|
19天前
|
机器学习/深度学习 算法 调度
基于ACO蚁群优化的VRPSD问题求解matlab仿真,输出规划路径结果和满载率
基于ACO蚁群优化的VRPSD问题求解MATLAB仿真,输出ACO优化的收敛曲线、规划路径结果及每条路径的满载率。在MATLAB2022a版本中运行,展示了优化过程和最终路径规划结果。核心程序通过迭代搜索最优路径,更新信息素矩阵,确保找到满足客户需求且总行程成本最小的车辆调度方案。
|
25天前
|
人工智能 算法 数据安全/隐私保护
基于遗传优化的SVD水印嵌入提取算法matlab仿真
该算法基于遗传优化的SVD水印嵌入与提取技术,通过遗传算法优化水印嵌入参数,提高水印的鲁棒性和隐蔽性。在MATLAB2022a环境下测试,展示了优化前后的性能对比及不同干扰下的水印提取效果。核心程序实现了SVD分解、遗传算法流程及其参数优化,有效提升了水印技术的应用价值。
|
28天前
|
机器学习/深度学习 算法 调度
基于ACO蚁群优化的VRPSD问题求解matlab仿真,输出规划路径结果和满载率
该程序基于ACO蚁群优化算法解决VRPSD问题,使用MATLAB2022a实现,输出优化收敛曲线及路径规划结果。ACO通过模拟蚂蚁寻找食物的行为,利用信息素和启发式信息指导搜索,有效求解带时间窗约束的车辆路径问题,最小化总行程成本。
|
27天前
|
机器学习/深度学习 算法 数据安全/隐私保护
基于贝叶斯优化CNN-LSTM网络的数据分类识别算法matlab仿真
本项目展示了基于贝叶斯优化(BO)的CNN-LSTM网络在数据分类中的应用。通过MATLAB 2022a实现,优化前后效果对比明显。核心代码附带中文注释和操作视频,涵盖BO、CNN、LSTM理论,特别是BO优化CNN-LSTM网络的batchsize和学习率,显著提升模型性能。
|
1月前
|
算法
基于粒子群算法的分布式电源配电网重构优化matlab仿真
本研究利用粒子群算法(PSO)优化分布式电源配电网重构,通过Matlab仿真验证优化效果,对比重构前后的节点电压、网损、负荷均衡度、电压偏离及线路传输功率,并记录开关状态变化。PSO算法通过迭代更新粒子位置寻找最优解,旨在最小化网络损耗并提升供电可靠性。仿真结果显示优化后各项指标均有显著改善。
|
1月前
|
机器学习/深度学习 算法 数据挖掘
基于GWO灰狼优化的GroupCNN分组卷积网络时间序列预测算法matlab仿真
本项目展示了基于分组卷积神经网络(GroupCNN)和灰狼优化(GWO)的时间序列回归预测算法。算法运行效果良好,无水印展示。使用Matlab2022a开发,提供完整代码及详细中文注释。GroupCNN通过分组卷积减少计算成本,GWO则优化超参数,提高预测性能。项目包含操作步骤视频,方便用户快速上手。
|
1月前
|
机器学习/深度学习 算法 数据安全/隐私保护
基于WOA鲸鱼优化的GroupCNN分组卷积网络时间序列预测算法matlab仿真
本项目展示了一种基于WOA优化的GroupCNN分组卷积网络时间序列预测算法。使用Matlab2022a开发,提供无水印运行效果预览及核心代码(含中文注释)。算法通过WOA优化网络结构与超参数,结合分组卷积技术,有效提升预测精度与效率。分组卷积减少了计算成本,而WOA则模拟鲸鱼捕食行为进行优化,适用于多种连续优化问题。
|
1月前
|
机器学习/深度学习 算法 数据安全/隐私保护
基于GA遗传优化的GroupCNN分组卷积网络时间序列预测算法matlab仿真
该算法结合了遗传算法(GA)与分组卷积神经网络(GroupCNN),利用GA优化GroupCNN的网络结构和超参数,提升时间序列预测精度与效率。遗传算法通过模拟自然选择过程中的选择、交叉和变异操作寻找最优解;分组卷积则有效减少了计算成本和参数数量。本项目使用MATLAB2022A实现,并提供完整代码及视频教程。注意:展示图含水印,完整程序运行无水印。
|
1月前
|
算法 数据挖掘
基于粒子群优化算法的图象聚类识别matlab仿真
该程序基于粒子群优化(PSO)算法实现图像聚类识别,能识别0~9的数字图片。在MATLAB2017B环境下运行,通过特征提取、PSO优化找到最佳聚类中心,提高识别准确性。PSO模拟鸟群捕食行为,通过粒子间的协作优化搜索过程。程序包括图片读取、特征提取、聚类分析及结果展示等步骤,实现了高效的图像识别。

热门文章

最新文章

下一篇
无影云桌面