知识分享|非凸问题求解方法及代码示例【分类迭代】【大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==1
        r(1)=0.0200;
        r(2)=0.0195;
        C=[C,x(1)>=0.8*P(1),x(2)>=0.9*P(2)];
    elseif i==2
        r(1)=0.0200;
        r(2)=0.0130;
        C=[C,x(1)>=0.8*P(1),x(2)<=0.9*P(2)];
    elseif i==3
        r(1)=0.0162;
        r(2)=0.0195;
        C=[C,x(1)<=0.8*P(1),x(2)>=0.9*P(2)];
    else
        r(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>F1
    Fc=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,和分类迭代得到的结果是一致的。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

CAPL入门之使用CAPL记录测试Logging

0 前言 以往测试的log都是直接从trace导出&#xff0c;但是最近发现trace中能导出的数据是有限的&#xff0c;如果测试的时间过长&#xff0c;新的数据就会把之前的数据全部覆盖&#xff0c;并且对于长时间的测试&#xff0c;直接导出trace的内容也会造成查找效率低下的问题。因…

代码托管(二)git(4)冲突解决

一、pull更新代码冲突 二、cherry-pick冲突 1、冲突演示 本地check out到需要提交的分支release-wtyy&#xff0c;双击目标分支master&#xff0c;选择需要从master上cherry-pick过来的commit&#xff0c;右键点击cherry-pick。表示从master上合并该commit到release-wtyy。 …

RabbitMQ (windows) 安装

大家好我是苏麟 , 今天安装一下 RabbitMQ . 官网 : RabbitMQ: One broker to queue them all | RabbitMQ 1.点击 Getting Started 2. 点击 Docs 3.点击 Install And Upgrade 4.点击 installation via Chocolatory 5. 直接下载安装包 RabbitMQ 下好了先放在一遍 RabbitMQ 需要 E…

安防监控视频平台EasyNVR级联视频上云系统EasyNVS出现“Login error”报错的原因排查

EasyNVR安防视频云平台是旭帆科技TSINGSEE青犀旗下支持RTSP/Onvif协议接入的安防监控流媒体视频云平台。平台具备视频实时监控直播、云端录像、云存储、录像检索与回看、告警等视频能力&#xff0c;能对接入的视频流进行处理与多端分发&#xff0c;包括RTSP、RTMP、HTTP-FLV、W…

做海外问卷调查有什么方法技巧?

大家好&#xff0c;我是橙河老师&#xff0c;很久没更新文章了&#xff0c;一方面是比较忙&#xff0c;另一方面是觉得关于项目介绍的文章&#xff0c;写的也差不多了。 后面的文章&#xff0c;还是着重讲解不同渠道的特点、做题技巧、人设创建这些实战性的内容。 我不像其他公…

光伏行业该如何起步?

随着全球对可再生能源的需求日益增长&#xff0c;光伏行业作为其中的佼佼者&#xff0c;正迎来前所未有的发展机遇。然而&#xff0c;对于新进入者或希望在这一领域有所建树的企业来说&#xff0c;如何起步并稳健发展是一个值得深思的问题。以下是一些关于光伏行业起步的建议。…

2024一站式解决 python打包代码,发布到pypi

2024一站式解决 python打包代码&#xff0c;发布到pypi 文章目录 2024一站式解决 python打包代码&#xff0c;发布到pypi一、前言二、pypi账户注册与配置2.1 账户注册2.2 双因素认证2.3 API token生成 三、代码打包3.1 准备代码3.2 编写setup.py文件3.3 LICENSE3.3.1 常见的开源…

PCIe协议之-TLP Header详解(二)

✨前言&#xff1a; 在PCIe中&#xff0c;存在几种不同类型的请求&#xff0c;主要包括IO(Request)请求、存储器(Request)请求和配置(Request)请求。这些请求类型允许CPU与连接在PCIe总线上的设备进行通信和控制。 &#x1f31f;1. IO(Request)请求 定义与作用: IO请求&…

软件测试有哪些常用的测试方法?

&#x1f345; 视频学习&#xff1a;文末有免费的配套视频可观看 &#x1f345; 点击文末小卡片 &#xff0c;免费获取软件测试全套资料&#xff0c;资料在手&#xff0c;涨薪更快 软件测试是软件开发过程中重要组成部分&#xff0c;是用来确认一个程序的质量或者性能是否符合开…

AES分组密码

一、AES明文和密钥位数 RIJNDAEL 算法数据块长度和密钥长度都可独立地选定为大于等于 128 位且小于等于 256 位的 32 位的任意倍数。 而美国颁布 AES 时却规定数据块的长度为 128 位、密钥的长度可分别选择为 128 位&#xff0c; 192 位或 256 位 1.1 状态 中间结果叫做状态…

Jmeter(四十一) - 从入门到精通进阶篇 - Jmeter配置文件的刨根问底 - 下篇(详解教程)

宏哥微信粉丝群&#xff1a;https://bbs.csdn.net/topics/618423372 有兴趣的可以扫码加入 1.简介 为什么宏哥要对Jmeter的配置文件进行一下讲解了&#xff0c;因为有的童鞋或者小伙伴在测试中遇到一些需要修改配置文件的问题不是很清楚也不是很懂&#xff0c;就算修改了也是…

线性回归学习笔记

学习了王天一博士的机器学习40讲&#xff0c;做个小总结&#xff1a; 1、机器学习中&#xff0c;回归问题隐含了输入变量和输出变量均可连续取值的前提。 2、单变量线性回归&#xff0c;所有样本到直线的欧氏距离之和最小&#xff0c;即均方误差最小化。 3、最小二乘法的几何意…

【C语言深度解剖】(12):C语言库函数的学习和模拟实现,一篇文章就够了!

&#x1f921;博客主页&#xff1a;醉竺 &#x1f970;本文专栏&#xff1a;《C语言深度解剖》 &#x1f63b;欢迎关注&#xff1a;感谢大家的点赞评论关注&#xff0c;祝您学有所成&#xff01; ✨✨&#x1f49c;&#x1f49b;想要学习更多C语言深度解剖点击专栏链接查看&…

python REST 请求验证

REST 请求验证 在Python中&#xff0c;可以使用cerberus库来进行REST请求的验证。以下是一个简单的示例&#xff0c;演示如何使用cerberus进行请求数据的验证。 首先&#xff0c;安装cerberus库&#xff1a; pip install cerberus # 安装cerberus库 -- Anaconda 环境下安装 …

非成对意象翻译中的内容制约范式再思考

Rethinking the Paradigm of Content Constraints in Unpaired Image-to-Image Translation 非成对意象翻译中的内容制约范式再思考 Xiuding Cai1 2, Yaoyao Zhu1 2, Dong Miao1 2, Linjie Fu1 2, Yu Yao1 2 蔡秀定 1 2 、朱瑶瑶 1 2 、苗东 1 2 、付林杰 1 2 、余瑶 1 2 Corre…

什么是直接内存(NIO)

直接内存不受 JVM 内存回收管理&#xff0c;是虚拟机的系统内存&#xff0c;常见于 NIO 操作时&#xff0c;用于数据 缓冲区&#xff0c;分配回收成本较高&#xff0c;但读写性能高&#xff0c;不受 JVM 内存回收管理。 举例 当上传一个较大文件&#xff08;200M&#xff09;…

模版方法详解

模板方法模式 1 概述 在面向对象程序设计过程中&#xff0c;程序员常常会遇到这种情况&#xff1a;设计一个系统时知道了算法所需的关键步骤&#xff0c;而且确定了这些步骤的执行顺序&#xff0c;但某些步骤的具体实现还未知&#xff0c;或者说某些步骤的实现与具体的环境相…

RT-Thread中使用Mqtt

环境&#xff1a; 开发板&#xff1a;Panduola&#xff08;stm32L475&#xff09; KEIL5 开发环境 rtthread 4.0.3内核 使用ENV 配置Rtt MQTT 1.MQTT介绍 ​ 客户端 Client 使用MQTT的程序或设备。客户端总是通过网络连接到服务端。它可以发布应用消息给其它相关的客户端。订…

Python代码:三、读入字符串

1、题目 从变量输出开始。请使用input函数读入一个字符串&#xff0c;然后将其输出。 2、代码 import sys ainput() print(a) 3、在sublime运行的结果

客观需求验证的常见5大步骤(实施版)

我们在挖掘用户需求时&#xff0c;往往容易犯伪需求或需求错位等问题&#xff0c;因此需要进行客观需求验证。通过客观的验证&#xff0c;我们可以有效减少主观判断误差问题&#xff0c;确保需求的准确性&#xff0c;从而降低需求变更和项目风险的概率&#xff0c;减少开发成本…