Yalmip使用教程(6)-将约束条件写成矩阵形式

        博客中所有内容均来源于自己学习过程中积累的经验以及对yalmip官方文档的翻译:https://yalmip.github.io/tutorials/

        这篇博客将详细介绍如何借助yalmip工具箱将约束条件写成矩阵形式。

1.相关函数介绍

1.1 depends和getvariables函数

        depends和getvariables函数都可用于求出sdpvar类型变量在Yalmip工具箱内部的索引(可以简单理解为该变量是第几个使用的变量,比如索引为3,表示为第3个使用的变量),两个函数的使用语法分别为:

k = depends(x)
k = getvariables(x)

        其中,x为sdpvar类型变量,k为变量的索引。

        对于线性变量来说,两者的返回结果完全相同,例如下面的代码:

        例1:对线性变量使用depends和getvariables函数

yalmip('clear')
x = sdpvar(1);
y = sdpvar(2,3);
x_index1 = getvariables(x)
y_index1 = getvariables(y)
x_index2 = depends(x)
y_index2 = depends(y)

        运行结果为:

        两个函数的区别在于非线性的变量。对于非线性变量,depends函数只会返回其中涉及的线性变量,而getvariables函数则将直接返回非线性变量的索引。下面是一个例子:

        例2:对非线性变量使用depends和getvariables函数

yalmip('clear')
x = sdpvar(1);
z = x^2;
z_index1 = getvariables(z)
z_index2 = depends(z)

        运行结果为:

        上面的代码中涉及到1个线性变量x和一个非线性变量z,其中x的索引为1,z的索引为2。从结果中可以看到,getvariables函数将直接返回非线性变量z的索引,而depends函数只会输出非线性变量z中涉及到的线性变量x的索引。

1.2 getbase函数

        getbase函数将返回sdpvar类型变量中的full basis(我将其理解为变量的系数矩阵),使用语法如下:

B = getbase(x);

        其中x表示sdpvar类型的变量,B表示所涉及基本变量(也就是Yalmip内部中分配了索引号的1维变量)的系数矩阵。光看这个函数的文字描述也是比较难理解它的作用,我们还是结合一个实例进行讲解。

例3:

yalmip('clear')
x = sdpvar(1);
y = sdpvar(1);
z = [1;2*x;3*y;4*x+5*y + 6*x^2];
full(getbase(z))

        运行结果为:

ans =1     0     0     00     2     0     00     0     3     00     4     5     6

        首先我们可以知道,变量z为4×1的矩阵形式,其中共涉及3个基本变量,x,y和x²。那么我们可以把变量z用这三个基本变量进行表达,也就是:

        对于上面的例子来说:

        也就是系数矩阵为:

从分析结果可知,getbase函数所返回的就是所涉及基本变量的系数矩阵。

1.3 getbasematrix函数

        getbasematrix函数将返回sdpvar类型变量中指定基本变量的系数矩阵,使用语法如下:

B = getbasematrix(x,index)

        其中x表示sdpvar类型的变量,index表示指定的基本变量索引,B表示所涉及基本变量(也就是Yalmip内部中分配了索引号的1维变量)的系数矩阵。

        如果理解了getbase函数的用法,那么getbasematrix函数也就不难理解,无非是将返回所有涉及的基本变量系数矩阵变成了指定基本变量的系数矩阵。下面是一个示例:

        例4:

yalmip('clear')
x = sdpvar(1);
y = sdpvar(1);
z = [1;2*x;3*y;4*x+5*y + 6*x^2];
xB = full(getbasematrix(z,1))
yB = full(getbasematrix(z,2))

        运行结果如下:

1.4 recover函数

        recover函数通过索引来创建变量,标准语法如下:

x = recover(index)

        其中index表示变量索引,x表示所创建的变量。

        从本质上来讲,recover和getvariables函数是一个逆运算,即recover函数的输入是getvariables函数的输出,recover函数的输出是getvariables函数的输入。下面的代码说明了这一点:

yalmip('clear')
x = sdpvar(1);
assign(x,2);
x_index = getvariables(x);
x1 = recover(x_index);
x_value = value(x)
x1_value = value(x1)

        运行结果如下:

        从结果上来看,我们首先使用getvariables函数获取了变量x的索引,再利用recover函数,通过索引得到变量x1。由于我们提前使用了assign函数给变量x赋值为2,因此变量x的取值为2。但我们并没有给变量x1赋初值,但结果显示变量x1的取值也为2,说明变量x和变量x1本质上是同一个变量。也就是说通过recover函数和变量的索引号得到的新变量,和原变量是完全等价的。

1.5 see函数

        see函数在命令行返回sdpvar类型变量中所涉及基本变量的索引、常数矩阵和基本变量的系数矩阵,语法如下:

see(x)

        下面是一个例子:

        例5:

yalmip('clear')
x = sdpvar(1);
y = sdpvar(1);
z = [1;2*x;3*y;4*x+5*y + 6*x^2];
see(z)

        运行结果如下:

该结果和getvariables、getbase等函数返回结果的含义相同,此处不再赘述。

2.将优化问题改写为矩阵形式

        我们知道,在线性规划中一个变量对应优化问题中的一列,一个约束条件对应优化问题中的一行。对于有N个变量和M条约束的线性规划问题,那约束矩阵就有M行N列。我们可以将每一条约束都改写成≤0或≥0的形式,并使用一个中间变量表示这条约束,再通过上述函数确定中间变量所涉及的基本变量索引与系数矩阵,就可以间接表示出约束矩阵,进一步将优化问题改写为矩阵形式。

        下面通过1个实际例子进行说明。

        例6:

        假设我们想把上面的优化问题写成紧凑的矩阵形式:

        求矩阵A、b、c,然后使用矩阵形式求解优化问题的代码如下:

clc
clear
close all
warning off
yalmip('clear')%% 决策变量
sdpvar x1 x2%% 求系数矩阵
obj0 = x1 + 2*x2;z = [-2*x1 + 3*x2 - 12 ;x1 + x2 - 14;-3*x1 + x2 + 3;3*x1 + x2 - 30];M1 = full(getbase(z));
M2 = full(getbase(obj0));
index = depends([x1 x2]);
A = M1(:,index + 1);
b = -M1(:,1);
c = M2(index + 1)';%% 矩阵形式的目标函数
x = [x1;x2];
obj = c'*x;
C = [A*x <= b , x >= 0];%% 求解优化问题
ops = sdpsettings('verbose', 3, 'solver', 'gurobi');
sol = optimize(C , -obj ,ops);%% 判断求解是否成功
if sol.problem == 0disp('求解成功!!!');x = value(x)
elsedisp(['求解失败,原因为',sol.info]);
end

        运行结果如下:

        上面的例子是一个简单的线性规划问题,直接写出约束矩阵也很容易,采用Yalmip函数反而多此一举。但是实际问题通常涉及0-1变量,多重下标,需要用循环语句表达约束等等,手动写系数矩阵非常麻烦且容易出错,借助Yalmip的相关函数将会简单很多。

3.测试题

3.1测试1

        将下列优化问题建模为混合整数线性规划问题,并利用Yalmip函数改写为矩阵形式:

3.2测试2

        其中数据为:

        请将上述优化问题改写为下面的矩阵形式,并使用矩阵形式进行求解:

3.3测试3

        将旅行商问题(TravelingSalesmanProblem,TSP)的0-1规划模型改写成矩阵形式并进行求解:

3.4测试题参考答案

        第六章测试题的参考答案可以从下面的链接中获取:

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

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

相关文章

两个路由器如何连接设置的方法攻略

一、前言 随着智能家居时代来临&#xff0c;家里的网络部署需求开始复杂起来。往往一个路由器已经不能满足需求或者不利于拓展。两个路由器连接最常见的情况是家中已有一个路由器&#xff0c;并且已经通过这个路由器来正常上网。现在是因某些原因想在不改变已经在用的路由器的设…

【huggingface】数据集及模型下载并保存至本地

目录 数据集ChnSentiCorppeoples_daily_ner 模型bert-base-chinesehfl/rbt3t5-baseopus-mt-zh-enChinese_Chat_T5_Base 环境&#xff1a;没有代理&#xff0c;无法访问部分国外网络 数据集 正常情况下通过load_dataset加载数据集&#xff1b;save_to_disk保存至本地&#xff1b…

jupyter notebook 魔术命令介绍和简单使用

在Jupyter notebook中&#xff0c;“魔法命令”是特殊的命令&#xff0c;不是Python语言的一部分&#xff0c;但可以使您的生活更轻松。这些命令前面有%符号。 魔法命令很有用&#xff0c;可以直接嵌入到python代码中&#xff0c;并解决常见问题&#xff0c;例如列出当前目录中…

2020年下半年系统架构设计师上午真题及答案解析

1.按照我国著作权法的权利保护期&#xff0c;&#xff08; &#xff09;受到永久保护。 A.发表权 B.修改权 C.复制权 D.发行权 2.假设某计算机的字长为32位&#xff0c;该计算机文件管理系统磁盘空间管理采用位示图记录磁盘的使用情况&#xff0c;若磁盘的容量为3…

视频集中存储/云存储/磁盘阵列EasyCVR平台分组批量绑定/取消设备功能详解

安防视频监控/视频集中存储/云存储/磁盘阵列EasyCVR平台视频能力丰富灵活&#xff0c;可支持的主流标准协议有国标GB28181、RTSP/Onvif、RTMP等&#xff0c;以及支持厂家私有协议与SDK接入&#xff0c;包括海康Ehome、海大宇等设备的SDK等。视频汇聚融合管理平台EasyCVR既具备传…

springmvc5.x-mvc实现原理及源码实现

上文&#xff1a;spring5.x-声明式事务原理及源码实现 系列文章&#xff1a; spring5.x-声明式事务原理及源码实现 spring5.x-AOP实现原理及源码分析 spring5.x-监听器原理及源码实现 spring5.x-解决循环依赖分析 spring5.x-IOC模块源码学习 spring5.x介绍及搭配spring源码阅读…

GoT:用大语言模型解决复杂的问题

GoT&#xff1a;用大语言模型解决复杂的问题 摘要介绍背景和符号表示语言模型和上下文学习Input-Output&#xff08;IO&#xff09;Chain of thought&#xff08;CoT&#xff09;Multiple CoTTree of thoughts&#xff08;ToT&#xff09; GoT框架推理过程思维变换聚合变换&…

群晖 DS918通过CISCO SG250 LACP 链路聚合效果不佳的问题解决

问题表现 使用的是CISCO交换机打开LACP 链路聚合&#xff0c;且DS918上完成接口聚合并配置为平衡TCP模式后。通过IPREF测速整体网络性能仅能达到300Mbps左右。 问题解决 检查CISCO交换机LAG配置中&#xff0c;针对DS918的接口组是否正确配置了流量配置。请按照如下图所示&#…

无涯教程-Android Intent Standard Extra Data函数

下表列出了各种重要的Android Intent Standard Extra Data。您可以查看Android官方文档以获取额外数据的完整列表- Sr.NoExtra Data & Description1 EXTRA_ALARM_COUNT 用作AlarmManager intents(意图)中的int Extra字段,以告诉正在调用的应用程序intents(意图)释放了多少…

使用Android原生制作毛玻璃效果图片

毛玻璃效果&#xff0c;也被称为模糊效果&#xff0c;是许多现代应用中流行的一种视觉效果。在 Android 中&#xff0c;我们可以通过多种方式实现该效果。本文将探讨如何使用 Android 原生的 Bitmap 类和 RenderScript 来实现毛玻璃效果。 1. 准备工作 首先&#xff0c;你需要…

NIFI关于Parameter Contexts的使用

说明 nifi版本&#xff1a;1.23.2&#xff08;docker镜像&#xff09; 作用 Parameter Contexts&#xff08;参数上下文&#xff09;&#xff1a;参数上下文由 NiFi 实例全局定义/访问。访问策略可以应用于参数上下文&#xff0c;以确定哪些用户可以创建它们。创建后&#x…

什么是RTC

参考&#xff1a; https://zhuanlan.zhihu.com/p/377100294 RTC&#xff08;Real time communication&#xff09;实时通信&#xff0c;是实时音视频的一个简称&#xff0c;我们常说的RTC技术一般指的是WebRTC技术&#xff0c;已经被 W3C 和 IETF 发布为正式标准。由于几乎所…

【数据结构】堆的基础功能实现与PriorityQueue

文章目录 &#x1f340;堆的插入与删除&#x1f6eb;堆的插入&#x1f6a9;代码实现&#xff1a; &#x1f6ec;堆的删除 &#x1f38b;堆的常见习题&#x1f388;习题一&#x1f388;习题二&#x1f388;习题三 &#x1f384;PriorityQueue&#x1f431;‍&#x1f453;Priori…

【LeetCode】202. 快乐数 - hash表 / 快慢指针

目录 2023-9-5 09:56:152023-9-6 19:40:51 202. 快乐数 2023-9-5 09:56:15 关键是怎么去判断循环&#xff1a; hash表&#xff1a; 每次生成链中的下一个数字时&#xff0c;我们都会检查它是否已经在哈希集合中。 如果它不在哈希集合中&#xff0c;我们应该添加它。如果它在…

基于平台快速搭建企业信息化系统的低代码PaaS平台源码

低代码快开平台是一种快速开发应用系统的工具&#xff0c;用户通过少量代码甚至不写代码就可以快速构建出各种应用系统。 随着信息化技术的发展&#xff0c;企业对信息化开发的需求正在逐渐改变&#xff0c;传统的定制开发已经无法满足企业需求。低代码开发平台&#xff0c;让…

C++——STL容器【map和set】

文档&#xff1a;map、set 文章目录 &#x1f36f;1. 关联式容器&#x1fad6;2. set&#x1f37c;1. 模板参数&#x1f37c;2. 构造函数&#x1f37c;3. 修改&#x1f37c;4.操作&#x1f95b;find&#x1f95b;count&#x1f95b;lower_bound & upper_bound & equal_…

Java运算符

目录 一、运算符的概念 二、算数运算符 三、关系运算符 五、逻辑运算符 六、移位运算符 七、条件运算符 八、运算符的优先级 一、运算符的概念 计算机的最基本的用途之一就是执行数学运算&#xff0c;比如: 上述 和 < 等就是运算符&#xff0c;即&#xff1a;对操作…

2023年MySQL实战核心技术第二篇

目录 五 . 日志系统&#xff1a;一条SQL更新语句是如何执行的&#xff1f; 5.1 解释 5.2 重要的日志模块&#xff1a;redo log 5.2.1 解释 5.2.2 WAL&#xff08;Write-Ahead Logging&#xff09; 5.2.3 crash-safe。 5.3 重要的日志模块&#xff1a;binlog 5.3 .1 为什么会有…

存储数据恢复- raid5多块硬盘出现坏道的数据恢复案例

存储数据恢复环境&#xff1a; 某单位一台存储&#xff0c;1个机头4个扩展柜&#xff0c;有两组分别由27块和23块硬盘组建的RAID5阵列。其中由27块磁盘组建的那一组RAID5阵列崩溃&#xff0c;这组RAID5阵列存放是Oracle数据库文件。存储系统上层共划分了11个卷。 存储故障&…

利用Hutool+自定义注解实现数据脱敏

利用Hutool自定义注解实现数据脱敏 前言 我们在使用手机银行的时候经常能看到APP上会将银行卡的卡号中间部分给隐藏掉使用 ***** 来代替&#xff0c;在某些网站上查看一些业务密码时&#xff08;例如签到密码等&#xff09;也会使用 ***** 来隐藏掉真正的密码&#xff0c;那么…