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

news2024/12/24 2:13:54

        之前的博客介绍了双层优化的基本原理、以及如何使用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取得定义域内的最小值。 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/899269.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

spring boot 整合支付宝微信支付

1.目录结构 2.引入依赖 <!--引入阿里支付--><dependency><groupId>com.alipay.sdk</groupId><artifactId>alipay-sdk-java</artifactId><version>4.11.8.ALL</version></dependency><!--引入微信支付--><depe…

Redis中的淘汰策略

前言 本文主要说明在Redis面临key过期和内存不足的情况时&#xff0c;可以采用什么策略进行解决问题。 Redis中是如何应对过期数据的 正如我们知道的Redis是基于内存的、单线程的一个中间件&#xff0c;在面对过期数据的时候&#xff0c;Redis并不会去直接把它从内存中进行剔…

运用工具Postman快速导出python接口测试脚本

Postman的脚本可以导出多种语言的脚本&#xff0c;方便二次维护开发。 Python的requests库&#xff0c;支持python2和python3&#xff0c;用于发送http/https请求 使用unittest进行接口自动化测试 一、环境准备 1、安装python&#xff08;使用python2或3都可以&#xff09;…

HCIP之VLAN实验

目录 一、实验题目 二、实验思路 三、实验步骤 3.1 将接口划入vlan&#xff0c;设置trunk干道 3.2 启动DHCP服务&#xff0c;下发地址 四、测试 一、实验题目 实验要求&#xff1a; 1&#xff0c;PC1/3的接口均为access模式&#xff0c;且属于vlan2&#xff0c;处于同一…

pyltp 0.2.1安装

1. LTP及pyltp pyltp是 LTP的 Python封装&#xff0c;它里面提供了包括分词&#xff0c;词性标注&#xff0c;命名实体识别&#xff0c;句法分析等等能力。 比较坑的是我们可能无法直接通过pip install pyltp0.2.1方式来安装&#xff0c;所以本文就简单记录下如何通过源码安装…

04_15页表缓存(TLB)和巨型页

前言 linux里面每个物理内存(RAM)页的一般大小都是4kb(32位就是4kb),为了使管理虚拟地址数变少 加快从虚拟地址到物理地址的映射 建议配值并使用HugePage巨型页特性 cpu和mmu和页表缓存(TLB)和cache和ram的关系 CPU看到的都是虚拟地址&#xff0c;需要经过MMU的转化&#xf…

langchain-ChatGLM源码阅读:模型加载

文章目录 使用命令行参数初始化加载器模型实例化清空显存加载模型调用链loader.py的_load_model方法auto_factory.py的from_pretrained方法modeling_utils.py的from_pretrained方法hub.py的get_checkpoint_shard_files方法modeling_utils.py的_load_pretrained_mode方法回到loa…

电脑远程接入软件可以进行文件传输吗?快解析内网穿透

电脑远程接入软件的出现&#xff0c;让我们可以在两台电脑之间进行交互和操作。但是&#xff0c;很多人对于这些软件能否进行文件传输还存在一些疑问。下面的文章将解答这个问题。 1.电脑远程接入软件可以进行文件传输。传统上&#xff0c;我们可能会通过传输线或者移动存储设…

听GPT 讲Prometheus源代码--promql/promdb

Prometheus的promql目录包含PromQL(Prometheus Query Language)的解析和执行代码: parser.go 定义PromQL语法结构和parser,用于将PromQL查询语句进行语法解析。 semantic.go 实现PromQL的语义分析,检查查询是否语法正确且语义合理。 engine.go 定义PromQL执行引擎的接口和数据结…

Chapter 15: Object-Oriented Programming | Python for Everybody 讲义笔记_En

文章目录 Python for Everybody课程简介Object-oriented programmingManaging larger programsGetting startedUsing objectsStarting with programsSubdividing a problemOur first Python objectClasses as typesObject lifecycleMultiple instancesInheritanceSummaryGlossa…

AlexNet阅读笔记

ImageNet classification with deep convolutional neural networks 原文链接&#xff1a;https://dl.acm.org/doi/abs/10.1145/3065386 中文翻译&#xff1a;https://blog.csdn.net/qq_38473254/article/details/132307508 使用深度卷积神经网络进行 ImageNet 分类 摘要 大…

all in one之安装群辉和加硬盘(第五章)

安装群辉和加硬盘 安装群辉 群辉系统选择和介绍 PVE7.1虚拟机安装黑群晖教程 安装教程2 下载对应的群辉系统&#xff0c;根据自己的电脑性能来选择并下载&#xff1a; 百度网盘链接:提取码: 4itr 下载链接【私人博客】 第一步&#xff0c;把下载的img镜像上传到pve 记住上…

idea2023 springboot2.7.5+mybatis+jsp 初学单表增删改查

创建项目 因为2.7.14使用量较少&#xff0c;特更改spring-boot为2.7.5版本 配置端口号 打开Sm01Application类&#xff0c;右键运行启动项目&#xff0c;或者按照如下箭头启动 启动后&#xff0c;控制台提示如下信息表示成功 此刻在浏览器中输入&#xff1a;http://lo…

UltraEdit2023代码编辑器下载安装教程

UltraEdit是深受编程人士喜爱的代码编辑器之一&#xff0c;简洁干净的工作界面&#xff0c;标配的语法高亮功能&#xff0c;代码折叠等高效编程功能&#xff0c;并且&#xff0c;还支持HTML、PHP和JavaScript等语法&#xff0c;让代码编辑、文档内容处理更加方便。 作为一款广…

文心一言 VS 讯飞星火 VS chatgpt (78)-- 算法导论7.4 2题

二、如果用go语言&#xff0c;证明&#xff1a;在最好情况下&#xff0c;快速排序的运行时间为 Ω(nlgn)。 文心一言&#xff1a; 在最好情况下&#xff0c;快速排序的运行时间为Ω(nlgn)的证明如下&#xff1a; 快速排序是一种分治算法&#xff0c;它将一个数组分成两个子数…

Android webrtc实战(一)录制本地视频并播放,附带详细的基础知识讲解

目录 一、创建PeerConnectionFactory 初始化 构建对象 二、创建AudioDeviceModule AudioDeviceModule JavaAudioDeviceModule 构建对象 setAudioAttributes setAudioFormat setAudioSource 创建录制视频相关对象 创建VideoSource 创建VideoCapturer 创建VideoTra…

一台电脑访问另一台电脑的虚拟机

打开虚拟机的ip&#xff1a;端口映射 虚拟网络编辑器设置&#xff1a;端口转发 访问虚拟机的主机IP 转发端口 ssh root另一台电脑的虚拟机主机ip: 9000注意&#xff1a;不是虚拟机的ip

通讯录实现【C语言】

目录 前言 一、整体逻辑分析 二、实现步骤 1、创建菜单和多次操作问题 2、创建通讯录 3、初始化通讯录 4、添加联系人 5、显示联系人 6、删除指定联系人 ​7、查找指定联系人 8、修改联系人信息 9、排序联系人信息 三、全部源码 前言 我们上期已经详细的介绍了自定…

docker学习(十五)docker安装MongoDB

什么是MongoDB? MongoDB 是一个开源的、面向文档的 NoSQL 数据库管理系统&#xff0c;它以高性能、灵活的数据存储方式而闻名。与传统的关系型数据库不同&#xff0c;MongoDB 采用了一种称为 BSON&#xff08;Binary JSON&#xff09;的二进制 JSON 格式来存储数据。它是一种非…