Yalmip入门教程(4)-约束条件定义的相关函数

news2024/11/14 4:10:36

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

        这篇博客将详细介绍yalmip工具箱中约束条件定义等相关函数的用法。

1.约束条件定义的相关函数

1.1 alldifferent函数

alldifferent函数用于表示某个矩阵或向量中所有元素都不相同,使用语法如下:

F = alldifferent(X)

其中,X为决策变量,F为约束条件,表示X中所有元素都不同。

下面是一个代码示例,可以使用alldifferent函数产生整数1-5的一组排列:

x = intvar(1,5);
F = [alldifferent(x), 1<=x<=5];
optimize(F)value(x)

运行结果如下:

ans =

     1     5     4     2     3

图1 一个数独问题 

        合理地使用alldifferent函数解决实际的优化问题,可以大大降低建模的难度,例如,上一篇博客中提到的数独问题,就是要使得数组中每一行,每一列以及每一个3×3的子块中的数字从1-9各不相同,那么使用alldifferent函数很方便地完成建模。针对图1所示的数组问题,采用alldifferent函数进行建模的代码如下:

A0 = [
    0 4 7 0 5 0 0 0 8;
    6 0 5 0 3 0 2 0 1;
    0 0 0 7 0 6 0 3 0;
    0 0 6 0 7 0 0 2 4;
    9 0 0 8 0 4 0 0 6;
    4 5 0 0 1 0 9 0 0;
    0 1 0 5 0 2 0 0 0;
    2 0 8 0 4 0 5 0 3;
    5 0 0 0 9 0 7 1 0;
    ];

A = intvar(9,9,'full');

fixed = find(A0);
F = [1 <= A <= 9, A(fixed) == A0(fixed)];

for i = 1:3
    for j = 1:3
        block = A((i-1)*3+(1:3),(j-1)*3+(1:3));
        F = [F, alldifferent(block)];
    end
end

for i = 1:9
    F = [F, alldifferent(A(i,:))];
    F = [F, alldifferent(A(:,i))];
end


F = [F, sum(A,1) == 45, sum(A,2) == 45];
optimize(F);
value(A)

运行结果如下:

ans =

     3     4     7     2     5     1     6     9     8

     6     8     5     4     3     9     2     7     1

     1     2     9     7     8     6     4     3     5

     8     3     6     9     7     5     1     2     4

     9     7     1     8     2     4     3     5     6

     4     5     2     6     1     3     9     8     7

     7     1     3     5     6     2     8     4     9

     2     9     8     1     4     7     5     6     3

     5     6     4     3     9     8     7     1     2

        通过该函数的使用,可以非常快速地解决数独问题。但需要注意的是,由于alldifferent函数内部使用了大M法进行建模,因此为了提高问题的求解效率,需要用到该函数的变量最好要提前给定上下限。所以这份代码在最开始就令变量A位于区间[1,9]。此外,该函数一般只适用于整数变量,如果对连续型变量使用,模型可能会存在不可解的问题。

1.2 complements函数

        在数学优化领域,互补性条件是一个非常重要的概念,在KKT条件,对偶变换,最值变换等理论中都有所应用,yalmip工具箱中的complements函数可用于互补性条件的建模,在这里只对该函数的用法进行介绍,不涉及相关原理。

        互补性条件要求要求一对变量满足互补关系,即它们的乘积为零。这种情况下,其中一个变量的取值为零,就意味着另一个变量的取值为非零,它们之间存在一种互相排斥的关系,例如对于变量x1和变量x2,互补性条件可以写做:

x1≥0,x2≥0,x1×x2=0

complements函数的基本语法如下:

F = complements(Constraint1,Constraint2)

其中,Constraint1和Constraint2表示两个不同的约束条件,F表示他们形成的互补性条件。

        例1:使用yalmip中的complements函数对下列约束条件进行建模:

y≥0,x+z≥1,y(x+z)=0

Matlab代码如下:

sdpvar x y z

F = complements(y >= 0, x+z >= 1)

        和alldifferent函数一样,complements函数内部使用了大M法进行建模,因此为了提高问题的求解效率,需要用到该函数的变量最好要提前给定上下限。

1.3 cone函数

        二阶锥规划(Second-Order Cone Programming, SOCP)是最常用的凸优化之一,对于含二次约束的非线性规划,可以通过二阶锥松弛将其转为凸优化问题,具体原理可以查看相关资料进行学习,这里不再赘述,只重点讲解函数用法。该函数基本语法为:

c = cone(x,y)

这段代码表示了下面形式的二阶锥约束:

1.4 iff函数

iff函数用于表示两个约束之间的等价关系,其标准语法为:

F = iff(A,B)

约束F的含义为:当约束A成立时,约束B也成立,当约束B成立时,约束A也成立。

例2:使用yalmip工具箱中的iff函数对下列约束条件进行建模

        使用iff函数对其进行建模的代码如下:

A = 2;
b = 0.5;
x = sdpvar(1);
d = binvar(1);
F = iff(d,A*x <= b);

        实际上,iff也可以用”==”符号进行替换,下面的代码一样可以实现例2中的约束,和iff函数的建模完全等价:

A = 2;
b = 0.5;
x = sdpvar(1);
d = binvar(1);
F = [d == A*x <= b];

实际应用的过程中可以根据自己的需要合理地选择两种不同的方式。

1.5 ismember函数

ismember函数用于约束变量的取值位于某个离散集中,标准语法如下:

F = ismember(x,Y)

其中x表示变量,Y表示离散集合。例如要使连续变量x取值只能为{0.5, 1, 1.5, 2}其中一个数,可以用ismember函数表示为:

sdpvar x

F = ismember(x,[0.5 1 1.5 2]);

巧妙地应用ismember函数,可以提升优化问题求解的效率,更多的应用之后会展开来讲。

1.6 isoutside函数

        需要注意的是,isoutside函数是新版yalmip工具箱中给出的函数,如果在使用时提示找不到函数或变量,说明下载的不是最新版工具箱,更新一下即可。isoutside函数的标准用法如下:

Model = isoutside(P)

        P表示一组线性不等式约束,Model也是一组约束,但是Model所表示的可行域将位于P表示的可行域外部。这么说可能非常难理解,举个简单的例子。假设约束P为:

P = [1 <= x <=2 , 2 <= y <=5];

        显然该约束所表示的可行域为一个矩形,那么isoutside(P)所表示的可行域则为矩形的外部。在yalmip工具箱中,重写了可以应用于lmi类型变量的plot函数,可以绘制出线性约束条件所表示的可行域,约束P和isoutside(P)表示的可行域对比如下:

sdpvar x y
P = [1 <= x <= 2 , 2 <= y <= 5];
 
S = isoutside(P);
figure
plot(P,[],[],[],sdpsettings('plot.shade',0.1));
figure
plot(S,[],[],[],sdpsettings('plot.shade',0.1));

运行结果为:

图2 约束P所代表的可行域

 图3 约束isoutside(P)所代表的可行域

isoutside函数在日常求解优化问题中也有很多用处,下面是一个例子:

例3:求坐标原点(0,0)到下列约束组成的五边形区域边界距离的最小值:

 首先,我们利用针对lmi类型变量的plot函数,画出该可行域,如图4所示:

sdpvar x y
F = [2*x - 3*y + 6 >= 0 , ...
     x + y - 2 <= 0 , ...
     x - y - 4 <= 0 , ...
     x + 2*y + 8 >= 0 , ...
     3*x + y + 9 >= 0];
figure
axis([-3.5 3.5 -4.5 2.5])
plot(F,[],[],[],sdpsettings('plot.shade',0.1));

图4 例3中变量的可行域 

        问题中要求的是原点到该五边形区域边界距离的最小值,在已知约束F的情况下,似乎不好对目标函数进行建模。但是如果我们转换一下思维,也可以认为是求原点到F描述的可行域之外区域距离的最小值,这样就可以利用isoutside函数,很轻松地完成建模,matlab代码和结果如下: 

sdpvar x y
F = [2*x - 3*y + 6 >= 0 , ...
     x + y - 2 <= 0 , ...
     x - y - 4 <= 0 , ...
     x + 2*y + 8 >= 0 , ...
     3*x + y + 9 >= 0];
 
F1 = isoutside(F);
optimize([F1, -3.5 <= x <= 3.5 , -4.5 <= y <= 2.5] , x^2 + y^2);
 
figure
axis([-3.5 3.5 -4.5 2.5])
plot(F,[],[],[],sdpsettings('plot.shade',0.1));
hold on;grid on
plot(value(x),value(y),'*')
r = sqrt(value(x^2 + y^2));
t = 0:0.01:2*pi;
plot(r*cos(t),r*sin(t),'--')

图5 可行域F边界上到(0,0)距离最小的点所在位置

1.7 uncertain函数

        uncertain函数是利用Yalmip工具箱求解鲁棒优化的一个功能函数,用于将变量定义为不确定变量,之前我写过博客进行介绍,这里不再赘述,想要了解可以打开我之前的博客(https://blog.csdn.net/weixin_44209907/article/details/125691435)或者官方文档。

1.8 implies函数

        implies函数是使用yalmip工具箱将非线性约束转为线性约束最常用的函数之一,作用是定义约束条件之间的逻辑关系,用法如下:

F = implies(A,B)

        其中,A,B均为约束条件,F表示当约束条件A成立时,约束条件B也一定成立。(需要注意和iff函数的区别,iff函数也是定义两组约束之间的逻辑关系,但表示的是两者完全等价,而使用implies函数定义的约束则只能由A成立得到B成立,反之则不确定)。

        在优化问题的约束条件含有逻辑关系、具有分段函数等情况时,采用implies函数可以方便地进行数学建模,下面是一个示例:

        例4:使用yalmip工具箱对下列分段函数进行建模

        仅仅从逻辑上分析,可以使用matlab中的if-else语句完成这个函数的建模,代码如下: 

sdpvar e
 
if e <= -5
    f = 7;
elseif e >= -5 && e <= -2
    f = 2-e;
elseif e>=-2 && e <= 2
    f = e^2;
elseif e>=2 && e <= 5
    f = 2+e;
elseif e >= 5
    f = 7;
end

 

但是在运行上面的代码一定会出现下列报错,这是因为sdpvar类型的变量不支持在if-esle语句中进行逻辑判断。

从 constraint 转换为 logical 时出现以下错误:

无法从 constraint 转换为 logical。

出错 test (line 3)

if e <= -5

为了实现分段函数建模,可以利用implies函数,matlab代码如下:

sdpvar e
d = binvar(5,1);
 
Model = [sum(d) == 1,
implies(d(1), [e <= -5, f == 7]);
implies(d(2), [-5 <= e <= -2, f == 2-e]);
implies(d(3), [-2 <= e <= 2,  f == e^2]);
implies(d(4), [ 2 <= e <= 5,  f == 2+e]);
implies(d(5), [ 5 <= e,       f == 7])];

        在建模时,引入了一个5维的0-1变量d,限制sum(d)=1表示五种情况只能取得其中一种。这样就可以简单直观地完成分段函数建模。implies函数还有更多用法,这里不再赘述。此外,implies函数内部也是使用大M法完成建模的,因此使用implies函数时最好保证涉及的变量都指定了上下限。

2测试题

2.1测试1

        使用Yalmip工具箱求下列数独问题的解,并比较采用alldifferent函数与不采用alldifferent函数时模型的求解速度:

2.2测试2

请使用yalmip工具箱求解下列优化问题(需使用complements函数):

 

2.3测试3

        画出下列约束表示的可行域的范围,并求坐标原点(0,0)到下列约束组成的可行域边界距离的最小值:

 

2.4测试4

        已知商品A的单价随购买数量的增大而减小,购买0-500件时单价为10元,购买500-1000件时超出500件的商品单价为8元,购买1000件以上时超出1000件的商品单价为6元。某次进货后计算得到该商品的的平均单价为7.875元,请问共买了多少件商品A?(使用yalmip工具箱求解)

2.5测试题参考答案

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

 https://download.csdn.net/download/weixin_44209907/88162171

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

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

相关文章

计算机毕设 深度学习疫情社交安全距离检测算法 - python opencv cnn

文章目录 0 前言1 课题背景2 实现效果3 相关技术3.1 YOLOV43.2 基于 DeepSort 算法的行人跟踪 4 最后 0 前言 &#x1f525; 这两年开始毕业设计和毕业答辩的要求和难度不断提升&#xff0c;传统的毕设题目缺少创新和亮点&#xff0c;往往达不到毕业答辩的要求&#xff0c;这两…

跨境多商户中日韩英多语言商城搭建(PC+小程序+H5),搭建方案

随着全球化的推进&#xff0c;跨境电商正变得越来越普遍。在本文中&#xff0c;我们将介绍跨境电商系统开发中多语言商城独立站的部署搭建方案。 准备工作 在开始部署搭建之前&#xff0c;需要准备以下环境&#xff1a; 服务器&#xff0c;确保服务器具备足够的性能和稳定性。 …

09-向量的范数_范数与正则项的关系

⛳向量的范数 范数的公式是向量每个分量 绝对值 P 次方 再用幂函数计算 P 分之一&#xff0c;这里 P 肯定是整数 1&#xff0c;2&#xff0c;3…到正无穷都是可以的 向量的范数就是把向量变成一个标量&#xff0c;范数的表示就是两个竖线来表示&#xff0c;然后右下角写上 P&a…

2023 电赛 E 题 激光笔识别有误--使用K210/Openmv/树莓派/Jetson nano实现激光笔在黑色区域的目标检测

1. 引言 1.1 激光笔在黑色区域目标检测的背景介绍 在许多应用领域&#xff0c;如机器人导航、智能家居和自动驾驶等&#xff0c;目标检测技术的需求日益增加。本博客将聚焦于使用K210芯片实现激光笔在黑色区域的目标检测。 激光笔在黑色区域目标检测是一个有趣且具有挑战性的…

redis发布订阅模型

文章目录 发布与订阅1.频道订阅和退订1.1订阅频道subscribe**伪代码** 1.2 退订频道伪代码 2.模式订阅和退订2.1订阅模式psubscribe2.2 退订模式 3.发送消息3.1 消息发送频道订阅者伪代码 3.2消息发送模式订阅者伪代码 总结的Publish4.查看订阅消息4.1 pubsub channels4.2 pubs…

从前序与中序遍历序列构造二叉树,从中序与后序遍历序列构造二叉树

目录 从前序与中序遍历序列构造二叉树从中序与后序遍历序列构造二叉树 从前序与中序遍历序列构造二叉树 题目链接 给定两个整数数组 preorder 和 inorder &#xff0c;其中 preorder 是二叉树的先序遍历&#xff0c; inorder 是同一棵树的中序遍历&#xff0c;请构造二叉树并返…

深度学习Redis(2):持久化

前言 在上一篇文章中&#xff0c;介绍Redis的内存模型&#xff0c;从这篇文章开始&#xff0c;将依次介绍Redis高可用相关的知识——持久化、复制(及读写分离)、哨兵、以及集群。 本文将先说明上述几种技术分别解决了Redis高可用的什么问题&#xff1b;然后详细介绍Redis的持…

8.3 作业 c高级

1.递归实现&#xff0c;输入一个数&#xff0c;输出这个数的每一位&#xff1a; #include<myhead.h>void print_digit(int num) {if(num<10){printf("%d",num);puts("");}else{print_digit(num/10); //递归打印除最后一位外的数printf("%…

10.物联网操作系统之低功耗管理

一。低功耗管理概念及其应用 1.STM32低功耗设计详解 STM32的电源管理系统主要分为&#xff1a; 备份域 调压器供电电路 ADC电源电路 2.低功耗模式 1.运行模式 2.睡眠模式 3.停机模式 4.待机模式 &#xff08;1&#xff09;睡眠模式 在睡眠模式中&#xff0c;仅关闭了内核时钟&…

【计算机网络】网络层协议 -- ICMP协议

文章目录 1. ICMP协议简介2. ICMP协议格式3. ping命令4. ping命令与端口号没有关系&#xff01;&#xff01;&#xff01;5. traceroute命令 1. ICMP协议简介 ICMP&#xff08;Internet Control Message Protocol&#xff0c;控制报文协议&#xff09;&#xff0c;用于在IP主机…

22.Netty源码之解码器

highlight: arduino-light 抽象解码类 https://mp.weixin.qq.com/s/526p5f9fgtZu7yYq5j7LiQ 解码器 Netty 常用解码器类型&#xff1a; ByteToMessageDecoder/ReplayingDecoder 将字节流解码为消息对象&#xff1b;MessageToMessageDecoder 将一种消息类型解码为另外一种消息类…

关于时间的基本概念

年的标准——纪元 Era Epoch 在中国古代&#xff0c; 皇帝会订立年号来纪年&#xff0c; 比如贞观就是唐太宗订立的年号&#xff0c; 于是天下使用贞观元年&#xff0c;贞观二年的方式来纪年。皇帝可以因为各种原因更换年号&#xff0c;比如武则天在位21年&#xff0c; 使用了…

【vue】 el-table解决分页不能筛选全部数据的问题

前言 最近开发前端项目表格的时候&#xff0c;使用的是el-table&#xff0c;用到了对应的筛选功能&#xff0c;如下图所示 但发现实际只能筛选当前页&#xff0c;通过百度查找相关文章&#xff0c;发现原因是把筛选条件定义在列上&#xff0c;解决方法&#xff1a;所以我们把f…

HadoopWEB页面上传文件报错Couldn‘t upload the file course_info.txt

HadoopWEB页面上传文件报错Couldn’t upload the file course_info.txt 右键F2检查发现&#xff1a;文件上传PUT操作的IP地址是节点IP别名识别不到导致 解决方法&#xff1a;在WEB页面访问浏览器所在机器上面配置hosts映射地址(注意:配置的是浏览器访问的地址不是hadoop节点所在…

【项目 进程12】2.25 sigprocmask函数使用 2.26sigaction信号捕捉函数 2.27SIGCHILD信号

文章目录 2.25 sigprocmask函数使用2.26 sigaction信号捕捉函数内核实现信号捕捉的过程信号捕捉特性 2.27SIGCHILD信号 2.25 sigprocmask函数使用 阻塞信号集有时称作信号掩码。 联想&#xff1a;fcntl函数可以修改fd属性。 ./sigprocmask & //将程序设置为后台运行&…

JWT应用功能

JWT 一、 JWT 实现无状态 Web 服务 1、什么是有状态 有状态服务&#xff0c;即服务端需要记录每次会话的客户端信息&#xff0c;从而识别客户端身份&#xff0c;根据用户身份进行请求的处理&#xff0c;典型的设计如tomcat中的session。 例如登录&#xff1a;用户登录后&am…

SpringCloud《Eureka、Ribbon、Feign、Hystrix、Zuul》作用简单介绍

概述 SpringCloud是一个全家桶&#xff0c;包含多个组件。 本文主要介绍几个重要组件&#xff0c;也就是Eureka、Ribbon、Feign、Hystrix、Zuul这几个组件。 一、业务场景介绍 业务流程&#xff0c;支付订单功能 订单服务改变为已支付订单服务调用库存服务&#xff0c;扣减…

Webpack开启本地服务器;HMR热模块替换;devServer配置;开发与生成环境的区分与配置

目录 1_开启本地服务器1.1_开启本地服务器原因1.2_webpack-dev-server 2_HMR热模块替换2.1_认识2.2_开启HMR2.3_框架的HMR 3_devServer配置3.1_host配置3.2_port、open、compress 4_开发与生成环境4.1_如何区分开发环境4.2_入口文件解析4.3_区分开发和生成环境配置 1_开启本地服…

743. 网络延迟时间

有 n 个网络节点&#xff0c;标记为 1 到 n。 给你一个列表 times&#xff0c;表示信号经过 有向 边的传递时间。 times[i] (ui, vi, wi)&#xff0c;其中 ui 是源节点&#xff0c;vi 是目标节点&#xff0c; wi 是一个信号从源节点传递到目标节点的时间。 现在&#xff0c;…

iMX6ULL驱动开发 | OLED显示屏SPI驱动实现(SH1106,ssd1306)

周日业余时间太无聊&#xff0c;又不喜欢玩游戏&#xff0c;大家的兴趣爱好都是啥&#xff1f;我觉得敲代码也是一种兴趣爱好。正巧手边有一块儿0.96寸的OLED显示屏&#xff0c;一直在吃灰&#xff0c;何不把玩一把&#xff1f;于是说干就干&#xff0c;最后在我的imax6ul的lin…