双层优化入门(4)—基于对偶变换的双层优化求解

本文介绍了如何通过对偶变换求解双层线性规划问题,强调了适用条件和步骤,如原问题需为线性且无0-1变量,目标方向一致或部分相同。通过实例演示了如何将双层优化转化为单层问题并使用Yalmip和商业求解器求解。
摘要由CSDN通过智能技术生成

        之前的博客介绍了双层优化的基本原理、以及如何使用KKT条件和智能优化算法求解双层优化问题,这篇博客将继续介绍如何通过对偶变换求解双层优化问题。

1.线性规划的对偶问题

        参考资料:

运筹学修炼日记:如何优雅地写出大规模线性规划的对偶_刘兴禄的博客

        首先说明一下,能应用强对偶定理求解的双层优化问题一定是线性规划问题,不能含有非线性目标函数和非线性约束,且不能含有0-1变量或者整数变量,如果有的话则需要考虑使用其他方法进行求解。

        用上面博客中提到的一个简单的线性规划来说明如何写出线性规划问题的对偶问题。

        原问题:

        对偶问题: 

        其中原问题为max问题,决策变量为x1和x2,对偶问题为min问题,决策变量为y1和y2,总结出的规律如下: 

        我们挨个来对比一下:

        1)原问题为max问题,对偶问题为min问题。

        2)原问题中有2个变量,因此对偶问题中有2个约束条件

        3)原问题中变量都≥0,因此对偶问题中约束条件的符号也是≥0

        4)原问题中目标函数的系数为2和3,因此对偶问题的约束条件中≥号右边的常数也为2和3

        5)原问题中有2个约束条件,因此对偶问题有2个决策变量

        6)原问题中约束条件的符号为≤,因此对偶问题中决策变量的取值都≥0

        7)原问题中第1个约束条件中x1和x2的系数分别为5和4,因此对偶问题的约束条件中,变量y1在两个不同的约束条件中的系数分别为5和4

        8)原问题中第2个约束条件中x1和x2的系数分别为2和3,因此对偶问题的约束条件中,变量y2在两个不同的约束条件中的系数分别为2和3

        对于上面这种简单的优化问题,我们可以很容易写出其对偶问题,但如果原优化问题比较复杂,或者规模很大,就不太容易写出其对偶问题,即使写出来也容易出错。上面的博客中提到了用excel表格来进行对偶变换,这是一种比较好的方法。文献中另一种常见的做法是将优化问题先改写成紧凑的矩阵形式,然后使用矩阵变换就可以方便地表达原问题和对偶问题。

2.利用对偶变换求解双层优化

        通过上面的分析可知,经过对偶变换之后,优化问题的目标函数将从min变为max或者从max变为min,那么对于min-max或者max-min类型的双层优化问题,首先可以使用对偶变换将下层优化转为和上层优化方向一致,然后就可以将双层优化问题转为单层优化。

        再次总结双层优化可以使用对偶变换求解的条件:

        1.下层优化为线性规划,没有非线性项及0-1变量,整数变量。

        2.上下层优化的目标方向不一致,可以为min-max类型,也可以为max-min类型。

        3.上下层优化目标相同或者有一部分相同,这样下层优化经过对偶变换后就可以和上层优化进行合并。

        下面是一个简单线性双层优化的例子:

        首先这个双层优化问题只有两个变量,可以简单推断一下,这个双层优化问题的最优解中,x将取得其定义域内的最大值,y将取得其定义域内的最小值。当然猜想归猜想,还是要实际求解才知道是否正确。

        下面使用对偶变换求出该问题的最优解,验证我们的想法是否正确。我们可以把优化问题的目标函数进行拆分,然后把下层优化问题单独列出来:

        我们分析一下,下层优化问题共1个变量,5个约束条件,因此其对偶问题共有1个约束条件,5个变量。由于优化问题比较简单,我们直接写出其对偶问题: 

        进一步将这个对偶问题和上层优化问题合并可以得到: 

        其中Ωx表示原问题中x的可行域。 

        这样就把一个线性双层优化问题转换为了一个单层二次规划问题,可以使用Yalmip调用Cplex,Gurobi等求解器进行求解,代码如下:

%% 清空
clc
clear
close all
warning off
 
%% 目标函数和约束条件
x = sdpvar(1);
z = sdpvar(5,1);
y = sdpvar(1);
Constraints = [[-3 -1 -1 -1 1]*z <= 2 , z >= 0 , x >= 0 , y >= 0];
xy_Constraints = [-3*x+y <= -3 , 3*x+y <= 30 , 2*x-3*y >= -12 , x+y <= 14 , x >= 0 , y >= 0];
figure
plot(xy_Constraints,[],[],[],sdpsettings('plot.shade',0.1));
Constraints = [Constraints , boundingbox(xy_Constraints , [] , [x,y])];
objective = x + [-12-2*x x-14 3-3*x 3*x-30 0]*z;
ops = sdpsettings('verbose', 0 , 'solver', 'gurobi');
result = optimize(Constraints , -objective , ops);
 
%% 输出结果
disp(['最优解:x=',num2str(value(x)),',y=',num2str(value([-12-2*x x-14 3-3*x 3*x-30 0]*z/2))])
disp(['最优函数值=',num2str(value(objective))])

        运行结果:

      这个是变量x和y的取值范围。因为对偶变换之后,约束条件中都与变量z相关的项,没有对x进行约束,所以还需要从原来的上层优化问题中提取出变量x的取值范围,也就是上面提到的Ωx,Yalmip中可以直接使用boundingbox函数进行提取。

        由结果可知,当x取10,y取0时,整个双层优化有最优解10,这和我们根据常理进行的推断相同,x取得定义域内的最大值,y取得定义域内的最小值。 

  • 15
    点赞
  • 46
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 4
    评论
Gurobi是一种常用的数学规划和优化求解器,可以用于解决各种双层优化问题。 双层优化是一种特殊类型的优化问题,其中存在两个相互依赖的优化问题。通常,第一个优化问题称为上层问题,决策者试图在给定一组限制条件的情况下最大化或最小化某个目标函数。而第二个优化问题称为下层问题,其决策变量受到上层问题的变量值的影响。 使用Gurobi求解双层优化问题时,可以通过建立数学模型来表示问题。第一步是定义上层问题的目标函数和约束条件。然后,将上层问题的变量值传递给下层问题,并定义下层问题的目标函数和约束条件。最后,可以使用Gurobi进行求解,得到上层问题的最优解以及对应的下层问题的最优解。 Gurobi提供了大的优化算法和求解技术,可以高效地求解双层优化问题。它支持数学规划(线性规划、整数规划、混合整数规划等)和约束编程等不同类型的优化模型。同时,它还提供了丰富的接口和工具,可以与各种编程语言(如Python、Java等)和软件(如MATLAB)进行集成使用。 通过使用Gurobi求解双层优化问题,决策者可以得到最优的上层决策和下层决策,从而在给定的约束条件下实现最佳的综合目标。这种能力使得Gurobi在许多领域(如供应链管理、能源系统优化等)的决策问题中得到广泛应用。
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

配电网和matlab

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值