知识分享|非凸问题求解方法及代码示例【分类迭代】【大M法】

主要内容   

之前发布了非线性问题线性化的几种方法,如知识分享|分段函数线性化及matlab测试,学习园地 | yalmip实用操作-线性化,非线性优化 | 非线性问题matlab+yalmip求解案例,但是在实际建模及编程过程中,会遇到各种各样的问题,比如下面的模型就出现了非凸的报错问题,主要原因在于目标函数为两个变量乘积。

该问题直接写成matlab代码如下:

clear;clc;
% ====== 变量定义 ======%
x=sdpvar(1,2,'full');
r=sdpvar(1,2,'full');
b1=binvar(2,1,'full');
b2=binvar(2,1,'full');
% ====== 约束表达 ======%
P=[30,70];
C=[];
C=[C,x(1)+x(2)==100];
C=[C,0.5*P(1)<=x(1)<=3*P(1),0.5*P(2)<=x(2)<=3*P(2)];
C=[C,sum(b1)==1,implies(b1(1),[x(1)>=0.8*P(1),r(1)==0.0200]);implies(b1(2),[x(1)<=0.8*P(1),r(1)==0.0162])];
C=[C,sum(b2)==1,implies(b2(1),[x(2)>=0.9*P(2),r(2)==0.0195]);implies(b2(2),[x(2)<=0.9*P(2),r(2)==0.0130])];
C=[C,x(1)>=0,x(2)>=0];
% ===== 目标及求解 ======%
F=(-1)*(r(1)*x(1)+r(2)*x(2));
ops = sdpsettings('solver', 'cplex');  % gurobi mosek
sol=optimize(C,F,ops);

求解之后会出现报错,主要是由于模型非凸所致,为了更好的求解该问题,需要对模型采用其他方式进行求解。

本次讨论两种解决办法,一种是分类迭代求解,另外一种是采用BigM法进行线性化处理。

1 分类迭代求解

通过观察能够看出来,r的非线性分四种情况,因此,可以分别求解四种情况下的最优解,然后通过比较确定最终最佳方案,代码如下:

clear all;clc;
P=[30,70];
Fc=200;
for i=1:4% ====== 变量定义 ======%x=sdpvar(1,2,'full');
%     r=sdpvar(2);% ====== 约束表达 ======%C=[];if i==1r(1)=0.0200;r(2)=0.0195;C=[C,x(1)>=0.8*P(1),x(2)>=0.9*P(2)];elseif i==2r(1)=0.0200;r(2)=0.0130;C=[C,x(1)>=0.8*P(1),x(2)<=0.9*P(2)];elseif i==3r(1)=0.0162;r(2)=0.0195;C=[C,x(1)<=0.8*P(1),x(2)>=0.9*P(2)];elser(1)=0.0162;r(2)=0.0130;C=[C,x(1)<=0.8*P(1),x(2)<=0.9*P(2)];end
C=[C,x(1)+x(2)==100];
C=[C,0.5*P(1)<=x(1)<=3*P(1),0.5*P(2)<=x(2)<=3*P(2)];
C=[C,x(1)>=0,x(2)>=0];
% ===== 目标及求解 ======%
F=(-1)*(r(1)*x(1)+r(2)*x(2));
ops = sdpsettings('solver', 'cplex');  % gurobi mosek
sol=optimize(C,F,ops);
% ===== 判别最佳结果 ======%
F1=value(F);
x1=value(x);
r1=value(r);
if Fc>F1Fc=F1;xc=x1;rc=r1;
end
yalmip('clear');
end

最终得到的F最优值为-1.9685,x为37和63。

2.BigM法非线性处理

因为该问题的目标是两个变量乘积项导致的非线性问题,可以通过线性化方式进行转化:

则关于v1的约束可以转化为如下形式:

同理,关于v2的约束也可转换为上述形式。

具体代码如下:

clear;clc;
% ====== 变量定义 ======%
x=sdpvar(1,2,'full');
r=sdpvar(1,2,'full');
beta=binvar(1,2,'full');
v=sdpvar(1,2,'full');
b1=binvar(2,1,'full');
b2=binvar(2,1,'full');
% ====== 约束表达 ======%
P=[30,70];
M=100;
C=[];
C=[C,x(1)+x(2)==100];
C=[C,0.5*P(1)<=x(1)<=3*P(1),0.5*P(2)<=x(2)<=3*P(2)];
C=[C,-beta(1)*M+0.02*x(1)<=v(1)<=beta(1)*M+0.02*x(1)];
C=[C,-(1-beta(1))*M+0.0162*x(1)<=v(1)<=(1-beta(1))*M+0.0162*x(1)];
C=[C,x(1)>=0.8*P(1)*(1-beta(1))-beta(1)*M];
C=[C,x(1)<=0.8*P(1)*beta(1)+(1-beta(1))*M];
C=[C,-beta(2)*M+0.0195*x(2)<=v(2)<=beta(2)*M+0.0195*x(2)];
C=[C,-(1-beta(2))*M+0.013*x(2)<=v(2)<=(1-beta(2))*M+0.013*x(2)];
C=[C,x(2)>=0.9*P(2)*(1-beta(2))-beta(2)*M];
C=[C,x(2)<=0.9*P(2)*beta(2)+(1-beta(2))*M];
C=[C,x(1)>=0,x(2)>=0];
% ===== 目标及求解 ======%
F=-sum(v);
ops = sdpsettings('solver', 'cplex');  % gurobi mosek
sol=optimize(C,F,ops);

最终得到的F最优值为-1.9685,x为37和63,和分类迭代得到的结果是一致的。

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

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

相关文章

记录一个更新adobe软件导致加载PDF文件异常的问题

最近由于项目需要,没有办法把原有的adobe正版软件进行了卸载,换了个盗版软件,结果导致我的pdf文件加载的时候出现异常。 报错的语句是这个 string str = System.Environment.CurrentDirectory; // string fileName = MyOpenFileDialog(); axAcroPDF1.LoadFile(…

一顿五元钱的午餐

在郑州喧嚣的城市一隅&#xff0c;藏着一段鲜为人知的真实的故事。 故事的主角是一位年过半百的父亲&#xff0c;一位平凡而又伟大的劳动者。岁月在他脸上刻下了深深的痕迹&#xff0c;但他眼神中闪烁着不屈与坚韧。 他今年52岁&#xff0c;为了给远在家乡的孩子们一个更好的…

人工智能应用-实验4-蚁群算法求解 TSP

文章目录 &#x1f9e1;&#x1f9e1;实验内容&#x1f9e1;&#x1f9e1;&#x1f9e1;&#x1f9e1;代码&#x1f9e1;&#x1f9e1;&#x1f9e1;&#x1f9e1;分析结果&#x1f9e1;&#x1f9e1;&#x1f9e1;&#x1f9e1;实验总结&#x1f9e1;&#x1f9e1; &#x1f9…

【vue】封装的天气展示卡片,在线获取天气信息

源码 <template><div class"sen_weather_wrapper"><div class"sen_top_box"><div class"sen_left_box"><div class"sen_top"><div class"sen_city">山东</div><qctc-time cl…

OCM认证考试难吗?

OCM&#xff08;Oracle Certified Master&#xff09;认证考试是Oracle公司提供的最高级别的专业认证&#xff0c;它确实被认为是非常具有挑战性的考试。以下是关于OCM认证考试难度的一些关键点&#xff1a; 深入的技术要求&#xff1a;OCM认证不仅要求考生具备Oracle数据库的…

VR直播:改变我们的直播方式,让现场触手可及

VR直播是近期比较火爆的一种直播方式&#xff0c;相信在抖音上我们都刷到过转动手机、变换视角的VR直播&#xff0c;因为形式比较新颖&#xff0c;用户的参与度比较高&#xff0c;一场直播下来用户的打赏也是较为可观的。 不仅仅在直播行业&#xff0c;在众多应用领域中&#…

软件下载系统asp.net

本项目实现电子书下载网站的功能&#xff0c;实现文章、管理员分类&#xff0c;友情连接的管理以及对前台页面的静态化。网站前台实现对电子书的详细信息介绍和提供下载。 说明文档 运行前附加数据库.mdf&#xff08;或sql生成数据库&#xff09; 主要技术&#xff1a; 基于a…

K8S认证|CKA题库+答案| 7. 调度 pod 到指定节点

7、调度 pod 到指定节点 您必须在以下Clusterd/Node上完成此考题&#xff1a; Cluster Master node Worker node hk8s master …

交换机连接方式

一、级联方式 级联是将多个交换机或其他网络设备依次连接&#xff0c;形成一个层次结构&#xff0c;从而扩展网络的覆盖范围和端口数量。 在级联连接中&#xff0c;数据信号会从一个设备依次传递到下一个设备。每个设备都会接收并处理来自上级设备的数据&#xff0c;并将其转…

JVM学习-垃圾回收(三)

System.gc 通过System.gc()或Runtime.getRuntime().gc()的调用&#xff0c;会显示触发Full GC&#xff0c;同时对老年代和方法区进行回收&#xff0c;尝试释放被丢弃对象占用的内存然后System.gc()调用附带一个免责声明&#xff0c;无法保证对垃圾收集器的调用JVM实现者可以通…

欢聚笔试题求助帖

事情是这样的&#xff0c;这段时间一直在求职投简历&#xff0c;期望在暑假之前接到一份大数据开发的实习工作。投了很多公司&#xff0c;然后就收到了欢聚的笔试邀约&#xff0c;HR说要我一天之内做出来&#xff0c;恰巧第二天还有组会要汇报&#xff0c;我就先放下了&#xf…

2024年信息素养大赛图形化编程、Python、算法创真题汇总

2024年信息素养大赛编程赛道初赛&#xff08;Scratch图形化编程、Python、C算法创意&#xff09;已经结束&#xff0c;根据Scratch实验室的了解全国青少年信息素养大赛初赛晋级及初赛成绩内容如下&#xff1a; 1.参赛选手将在 5 个工作日(节假日不计在内)内&#xff0c;通过信…

在docker中ubuntu的apt-get慢的优化办法

apt-get慢的优化办法 1. 选择一个更快的镜像源2.使用 apt-get 的 Acquire::http 选项3. 其他通用优化4.修改 /etc/apt/sources.list.d/debian.source5.如果 /etc/apt/sources.list.d/ 中有多个文件6.在 Docker 中修改源(debian修改办法) 1. 选择一个更快的镜像源 Debian&#…

K8s-yaml文件

一.Yaml文件详解&#xff1a; Kubernetes 支持 YAML 和 JSON 格式管理资源对象 JSON 格式&#xff1a;主要用于 api 接口之间消息的传递YAML 格式&#xff1a;用于配置和管理&#xff0c;YAML 是一种简洁的非标记性语言&#xff0c;内容格式人性化&#xff0c;较易读 YAML 语…

14、设计模式之访问者模式

访问者模式 在访问者模式&#xff08;Visitor Pattern&#xff09;中&#xff0c;我们使用了一个访问者类&#xff0c;它改变了元素类的执行算法。通过这种方式&#xff0c;元素的执行算法可以随着访问者改变而改变。这种类型的设计模式属于行为型模式。根据模式&#xff0c;元…

汽车IVI中控开发入门及进阶(十八):显示技术之Frame Buffer帧缓冲器

Frame Buffer帧缓冲器(帧缓冲器,有时是帧存储器)是随机存取存储器(RAM)的一部分,包含驱动视频显示器的位图。它是一个内存缓冲区,包含表示完整视频帧中所有像素的数据。现代视频卡的核心包含帧缓冲电路。该电路将内存中的位图转换为可以在计算机监视器上显示的视频信号。…

每日5题Day9 - LeetCode 41 - 45

每一步向前都是向自己的梦想更近一步&#xff0c;坚持不懈&#xff0c;勇往直前&#xff01; 第一题&#xff1a;41. 缺失的第一个正数 - 力扣&#xff08;LeetCode&#xff09; 今天这道题没有ac&#xff0c;写不动了&#xff0c;下次再通过吧&#xff0c;先给个半成品下次回…

MySQL主从复制+读写分离(ShardingJDBC)

MySQL主从复制读写分离 MySQL主从复制介绍二进制日志&#xff1a; MySQL的主从复制原理如下搭建主从复制准备工作主库配置从库配置 测试 读写分离案例ShardingJDBC介绍数据库环境初始工程导入读写分离配置测试1). 保存数据2). 修改数据3). 查询数据4). 删除数据 MySQL主从复制 …

音频数据集大全(2)-语音合成

1、Speechocean762 简介&#xff1a;一个开源语音语料库&#xff0c;专为发音评估设计。该语料库包含来自250名非母语人士的5000个英语发音&#xff0c;其中一半的人是儿童。五位专家对每个发音进行了句子级、词级和音素级的注释。 该语料库允许用于商业和非商业目的。 下载…

adb 汇总

常用命令 adb devices 查看链接设备列表 adb kill-server 关闭并清楚所有链接 adb connect 设置链接 adb tcpip 该条命令是设置网络adb监听的端口&#xff0c;5555是默认&#xff0c;也可以设置其他的&#xff0c;在安卓设备重启后会失效&#xff0c;不需要root权限&#x…