Yalmip学习笔记

这里写自定义目录标题

  • 基本用法
    • 变量定义
    • 关于大M
    • Bilevel programming

注:这篇文章主要是留给自己查漏补缺的,所以从来没有使用过yalmip的读者看着会觉得跳来跳去。

基本用法

建模开始前,使用yalmip('clear')清空Yalmip的内部数据库。
下面是一个完整的建模例子,包括定义决策变量、约束、目标函数,并求解。如果求解成功,那么输出最优解;否则,使用sol.info,yalmiperror(sol.problem)分析求解出错的原因。

% It's good practice to start by clearing YALMIPs internal database 
% Every time you call sdpvar etc, an internal database grows larger
yalmip('clear')% Define variables
x = sdpvar(10,1);% Define constraints 
Constraints = [sum(x) <= 10, x(1) == 0, 0.5 <= x(2) <= 1.5];
for i = 1 : 7Constraints = [Constraints, x(i) + x(i+1) <= x(i+2) + x(i+3)];
end% Define an objective
Objective = x'*x+norm(x,1);% Set some options for YALMIP and solver
options = sdpsettings('verbose',1,'solver','quadprog','quadprog.maxiter',100);% Solve the problem
sol = optimize(Constraints,Objective,options);% Analyze error flags
if sol.problem == 0% Extract and display valuesolution = value(x)
elsedisplay('Hmm, something went wrong!');sol.infoyalmiperror(sol.problem)
end

变量定义

P=sdpvar(n,n)默认会定义出一个对称的决策变量矩阵,如果不希望它是对称的,那么要补全第三个参数P=sdpvar(n,m,'full');
约束P>=0中,如果P=sdpvar(n,n),那么这个约束是正定矩阵的约束,如果你想要表达每个元素都是非负的,可以使用P(:)>=0;如果P=sdpvar(n,m,'full'),那么这个约束表示矩阵中每个元素都要是非负的。
yalmip不支持严格不等式约束,如果你一定要用的话,可以自定义一个tolerance,选择合适的tolerance是需要技巧的,设置太小了可能会被忽略达不到你想要的效果,设置太大了可能会切掉问题可行域中的一大块。

my_tolerance_for_strict = 1e-5;
F = [0 <= P(1,1) <= 2-my_tolerance_for_strict, P >= eye(n)*my_tolerance_for_strict];

Note though, many times strict inequalities are part of a homogenous problem, and the problem should be dehomogenized by adding a single constraint such as P>=eye(n) and replace all other constraints with non-strict. 这句话没看懂,什么是同质问题??

关于大M

引入大M会给混合整数规划求解器带来糟糕的数值问题,并松弛后的问题变弱了,这引发过多的分支并增加求解时间。
可以考虑tight bound of the big-M reformulations来缓解松弛后的问题过弱的痛点,具体地,可以为每个决策变量增加相应的上下界约束。
大M建模的目的是,生成一个模型使得它的松弛能够尽可能地接近原约束的convex hull,也就是,原问题可行域的最好的凸近似。
在Yalmip中,可以直接使用hull生成convex hull,
在这里插入图片描述
结合生成的hull, 你可以得到更强的混合整数规划模型

M1 = 50;
M2 = 50;
M3 = 50;
M4 = 50;
F = sum(d) == 1;
F = [F, A1*x - b1 <= M1*(1-d(1))];
F = [F, A2*x - b2 <= M2*(1-d(2))];
F = [F, A3*x - b3 <= M3*(1-d(3))];
F = [F, A4*x - b4 <= M4*(1-d(4))];
F = [F, hull(A1*x <= b1,A2*x <= b2,A3*x <= b3,A4*x <= b4)];

注意,这里的hull()命令会引入很多约束和变量。

Bilevel programming

https://yalmip.github.io/tutorial/bilevelprogramming/
yalmip里面有KKT函数接口;
对于双层规划问题,yalmip内部的求解器要求内层问题有二次凸性(convex quadratic), 外层问题不一定要有凸性。
求解外层问题时,不停地重复分支定界流程,由互补松弛定理所带来的等式约束随后加入求解。

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

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

相关文章

【战报】2023年11月25日PMP考试战报来袭!!

项目管理认证 PMP项目管理课程介绍 PMP成绩查询及电子版证书下载-CSDN博客文章浏览阅读501次&#xff0c;点赞9次&#xff0c;收藏4次。2025.11.25的PMP考试成绩出来了&#xff01;https://blog.csdn.net/XMWS_IT/article/details/135939596?spm1001.2014.3001.5501 2023年1…

DSP系统时钟总结

一、stm32中断偏移向量介绍 1.1 为什么要设置中断向量偏移 上图可以看出程序上电先进入0x08000000开始运行&#xff0c;紧接着执行复位中断向量&#xff0c;然后执行复位中断程序&#xff0c;然后进入main函数。 如果想要app的中断正常运行&#xff0c;那就必须手动设置中断向…

C语言——深入理解指针3

目录 1. 数组名的理解1. 数组名1.2 数组名理解的特例 2. 使用指针访问数组3. 一维数组传参的本质4. 冒泡排序4.1 冒泡排序的概念4.2 冒泡排序的优化 5. 二级指针5.1 二级指针的概念5.2 二级指针的运算 6. 指针数组7. 指针数组模拟二维数组 1. 数组名的理解 1. 数组名 在上⼀个…

Python武器库开发-武器库篇之pdf文件暴力破解(五十二)

Python武器库开发-武器库篇之pdf文件暴力破解(五十二) PDF&#xff08;Portable Document Format&#xff0c;便携式文档格式&#xff09;是由Adobe公司开发的一种文件格式。PDF文件被广泛用于以可靠方式共享和传输电子文档。它能够保留文档的原始格式&#xff0c;包括字体、图…

[C语言][C++][时间复杂度详解分析]二分查找——杨氏矩阵查找数字详解!!!

一&#xff0c;题目 遇到的一道算法题&#xff1a; 1&#xff0c;已知有一个数字矩阵&#xff08;row行&#xff0c;col列&#xff09;&#xff0c;矩阵的每行 从左到右 递增&#xff0c;每列 从上到下 递增。 2&#xff0c;现输入一个数字 num &#xff0c;判断数字矩阵中…

微信小程序之下拉刷新事件、上拉触底事件和案例

学习的最大理由是想摆脱平庸&#xff0c;早一天就多一份人生的精彩&#xff1b;迟一天就多一天平庸的困扰。各位小伙伴&#xff0c;如果您&#xff1a; 想系统/深入学习某技术知识点… 一个人摸索学习很难坚持&#xff0c;想组团高效学习… 想写博客但无从下手&#xff0c;急需…

趣学Python算法100例-1.1 抓交通肇事犯

1&#xff0e;问题描述 一辆卡车违反交通规则&#xff0c;撞人后逃跑。现场有三人目击该事件&#xff0c;但都没有记住车号&#xff0c;只记下了车号的一些特征。甲说&#xff1a;牌照的前两位数字是相同的&#xff1b;乙说&#xff1a;牌照的后两位数字是相同的&#xff0c;但…

vue核心知识点

一、Vue基础知识点总结 开发vue项目的模式有两种&#xff1a; 基于vue.js&#xff0c;在html中引入vue.js&#xff0c;让vue.js管理div#app元素。基于脚手架环境&#xff1a;通过vue脚手架环境可以方便的创建一个通用的vue项目框架的模板&#xff0c;在此基础之上开发vue项目…

Python面向对象编程:探索代码的结构之美

文章目录 一、引言二、为什么学习面向对象编程2.1 提高代码的可维护性&#xff1a;通过封装、继承和多态实现模块化设计2.2 提升代码的复用性&#xff1a;通过类和对象的创建实现代码的重用 三、类和对象的基本概念3.1 类和对象的定义和关系&#xff1a;类是对象的模板&#xf…

【劳德巴赫 Trace32 高阶系列 3 -- trace32 svf 文件操作命令】

请阅读【嵌入式开发学习必备专栏 之 Trace32 系列 】 文章目录 Trace32 SVF 文件操作命令JTAG.PROGRAM.autoJTAG.PROGRAM.SVF命令参数介绍IRPREIRPOSTDRPREDRPOSTInitStateIgnoreTDOVerbose使用示例Trace32 SVF 文件操作命令 JTAG.PROGRAM.auto Format: JTAG.PROGRAM.</

elk之安装和简单配置

写在前面 本文看下elk的安装和简单配置&#xff0c;安装我们会尝试通过不同的方式来完成&#xff0c;也会介绍如何使用docker&#xff0c;docker-compose安装。 1&#xff1a;安装es 1.1&#xff1a;安装单实例 下载es安装包 在这里 下载&#xff0c;下载后解压到某个目录…

通过Nacos权重配置,实现微服务金丝雀发布效果(不停机部署)

在微服务项目迭代的过程中&#xff0c;不可避免需要上线&#xff1b;上线对应着部署&#xff0c;或者升级部署&#xff1b;部署对应着修改,修改则意味着风险。 传统的部署都需要先停止旧系统&#xff0c;然后部署新系统&#xff0c;之后需要对新系统进行全面的功能测试&#xf…

用STM32手搓一个体温计

前言 市面上大多额温计、测温计精度偏差太大。 而水银温度计&#xff0c;等待时间又太久。 因此就产生了用STM32自己做一个——精度高、便宜、测速快 的产品级 温度仪/体温计的想法。 01 这个温度仪的亮点&#xff1f; ”1精度高&#xff0c;误差小于0.1度 2带有显示屏&a…

【buuctf Reverse】[GXYCTF2019]luck_guy wp

[GXYCTF2019]luck_guy https://buuoj.cn/challenges#[GXYCTF2019]luck_guy 只有一个可执行文件&#xff0c;IDA 64位直接干 进main函数&#xff0c;F5反编译&#xff0c;看主要处理函数&#xff0c;跳转进去 在这里看到。flag是由f1和f2拼出来的&#xff0c;f1在汇编中有…

STM32读取MPU6050数据并通过角度值控制舵机运动(STM32、GY-521 MPU6050、SG90舵机、MG946舵机)

通过STM32F103C8T6读取MPU6050数据控制舵机运动&#xff08;STM32、GY-521 MPU6050、SG90舵机、MG946舵机&#xff09; 最终现象一、MPU6050数据读取二、舵机控制原理①什么是PWM&#xff1f;②STM32F103C8T6如何生成PWM&#xff1f;③控制舵机需要什么样的PWM波&#xff1f; 三…

飞桨paddlespeech语音唤醒推理C INT8 定点实现

前面的文章&#xff08;飞桨paddlespeech语音唤醒推理C定点实现&#xff09;讲了INT16的定点实现。因为目前商用的语音唤醒方案推理几乎都是INT8的定点实现&#xff0c;于是我又做了INT8的定点实现。 实现前做了一番调研。量化主要包括权重值量化和激活值量化。权重值由于较小且…

微信活动投票小程序源码系统:自主创建活动小程序带完整的安装代码包以及搭建教程

微信小程序的日益普及&#xff0c;越来越多的企业和个人开始关注如何利用小程序进行活动推广和用户互动。在这个背景下&#xff0c;微信活动投票小程序源码系统应运而生。这款源码系统旨在帮助用户快速创建自己的活动投票小程序&#xff0c;降低技术门槛&#xff0c;提高开发效…

主从数据库MySQL服务重启步骤与注意事项

主从数据库MySQL服务重启步骤与注意事项 实验环境&#xff1a; 172.20.26.34 &#xff08;主应用服务器&#xff09; 172.20.26.26 &#xff08;备应用服务器&#xff09; 172.20.26.37 &#xff08;主库服务器&#xff09; 172.20.26.38 &#xff08;从库服务器&…

迅为3588开发板Ubuntu安装Docker

在使用迅为 RK3588 开发板的时候&#xff0c;我们一般采用的是虚拟机安装 Ubuntu20.04 来编译 Android 源码或者 linux 源码&#xff0c;但是编译源码最让人头疼的是主机环境问题。假如我手上有很 多块开发板&#xff0c;每个开发板都使用不同的编译环境&#xff0c;而我本地电…

Java 类的加载流程

一、类的加载 指的是将类的.class 文件中的二进制 数据读入到内存中&#xff0c;将其放在运行时数据区的方法区内&#xff0c;然后在堆区创 建一个 java.lang.Class 对象&#xff0c;用来封装类在方法区内的数据结构。 类从被加载到虚拟机内存中开始&#xff0c;到卸载出内…