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

news2024/11/16 2:19:30

主要内容   

之前发布了非线性问题线性化的几种方法,如知识分享|分段函数线性化及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,和分类迭代得到的结果是一致的。

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

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

相关文章

vue+canvas实现逐字手写效果

在pc端进行逐字手写的功能。用户可以在一个 inputCanvas 上书写单个字&#xff0c;然后在特定时间后将这个字添加到 outputCanvas 上&#xff0c;形成一个逐字的手写效果。用户还可以保存整幅图像或者撤销上一个添加的字。 <template><div class"container"…

【B站 heima】小兔鲜Vue3 项目学习笔记

系列文章目录 Day 01 目录 系列文章目录前言Day011.项目使用相关技术栈2. 项目规模和亮点3. Vue2和Vue3实现一个小案例4. vue3的优势5. create-vue脚手架工具6. 熟悉我们的项目目录和文件7. 组合式API-setup选项8. 组合式API-reactive和ref函数9. 组合式API-computed计算属性…

动态IP与静态IP有什么区别?如何选择?

动态IP和静态IP都是指网络设备&#xff08;如计算机、服务器、路由器等&#xff09;在互联网上分配的IP地址的类型。 一、什么是动态IP&#xff0c;什么是静态IP&#xff1f; 1、什么是动态IP&#xff1f; 动态IP是指由Internet服务提供商&#xff08;ISP&#xff09;动态分配…

xrdp多用户多控制界面远程控制

1、无桌面安装桌面&#xff08;原本有ubuntu桌面的可以直接跳过这一步&#xff09; Gnome 与 xfce 相比&#xff0c;xfce 由于其轻巧&#xff0c;它可以安装在低端台式机上。Xfce 优雅的外观&#xff0c;增强了用户体验&#xff0c;它对用户非常友好&#xff0c;性能优于其他桌…

docker- 购建服务镜像并启动

文章目录 前言docker- 购建服务镜像并启动1. 前期准备2. 构建镜像3. 运行容器4. 验证 前言 如果您觉得有用的话&#xff0c;记得给博主点个赞&#xff0c;评论&#xff0c;收藏一键三连啊&#xff0c;写作不易啊^ _ ^。   而且听说点赞的人每天的运气都不会太差&#xff0c;实…

扩散模型自动管道AutoPipeline

推荐&#xff1a;write_own_pipeline.ipynb - Colab (google.com) 为您的任务选择一个 AutoPipeline 首先选择一个检查点。例如&#xff0c;如果您对使用 runwayml/stable-diffusion-v1-5 检查点的文本到图像感兴趣&#xff0c;请使用 AutoPipelineForText2Image&#xff1a; f…

linux ping https是否连接

在Linux系统中&#xff0c;ping通常用于测试网络上另一台主机的可达性。它使用的是ICMP协议&#xff0c;这是一种设计用来处理网络通信问题的协议。HTTPS则是一种安全的网络传输协议&#xff0c;它使用SSL/TLS加密。 如果你想要测试到某个HTTPS服务器的连接&#xff0c;你可以使…

【MySQL精通之路】InnoDB(6)-磁盘结构(2)-索引

主博客&#xff1a; 【MySQL精通之路】InnoDB(6)-磁盘上的InnoDB结构-CSDN博客 上一篇&#xff1a; 下一篇&#xff1a; 【MySQL精通之路】磁盘上的InnoDB结构-表空间-CSDN博客 目录 1.聚集索引和二级索引 1.1 Innodb 如何建立聚集索引 1.2 聚集索引如何加快查询速度 1…

CustomTkinter:便捷美化Tkinter的UI界面(附模板)

CustomTkinter是一个基于Tkinter的Python用户界面库。 pip3 install customtkinter它提供了各种UI界面常见的小部件。这些小部件可以像正常的Tkinter小部件一样创建和使用&#xff0c;也可以与正常的Tkinter元素一起使用。 它的优势如下&#xff1a; CustomTkinter的小部件和…

四天学会JS高阶(学好vue的关键)——深入面向对象(理论+实战)(第三天)

***本章面试使用居多* 理论篇**一、编程思想 1.1 面向过程 JS 前端居多 按照步骤 性能高 适合跟硬件关系很紧密 没有面向对象易维护易复用易扩展 1.2 面向对象 java典型 按照功能&#xff0c;把事务分别成一个个对象&#xff0c;对象之间分工合作 比较灵活 适合多人合作的…

模拟笔试 - 卡码网周赛第十八期(23年科大讯飞提前批笔试真题)

第一题&#xff1a; 参考思路解析&#xff1a;&#xff08;遍历nums中的每个数字&#xff0c;得到不为0的数位即可。&#xff09; 1.导入Scanner类&#xff1a; import java.util.Scanner;&#xff1a;引入 Scanner 类&#xff0c;用于读取用户输入。 2.主方法&#xff1a; …

力扣1809 没有广告的剧集(postgresql)

需求 Table: Playback ----------------- | Column Name | Type | ----------------- | session_id | int | | customer_id | int | | start_time | int | | end_time | int | ----------------- 该表主键为&#xff1a;session_id &#xff08;剧集id&#xff09; customer_…

【C++算法】BFS解决FloodFill算法相关经典算法题

1.图像渲染 我们这道题可以使用深搜来解决&#xff0c;利用一个队列遍历到与该点相连的所有像素相同的点&#xff0c;然后将其修改成指定的像素即可&#xff0c;直接上思路&#xff1a; 直接上代码&#xff1a; class Solution {int dx[4] {0, 0, 1, -1};int dy[4] {1, -1, …

计组期末必考大题

一.寻址方式详解 1.直接寻址 指令地址码直接给到操作数所在的存储单元地址 2.间接寻址 A为操作数EA的地址 3.寄存寻址 4.寄存器间接寻址 5.变址寻址 6.基地址寻址 7.小结 二、指令周期详解 一、基本概念 指令周期:去除指令并执行指令所需要的时间指令周期:由若干个CPU周…

go语言的一些常见踩坑问题

开始之前&#xff0c;介绍一下​最近很火的开源技术&#xff0c;低代码。 作为一种软件开发技术逐渐进入了人们的视角里&#xff0c;它利用自身独特的优势占领市场一角——让使用者可以通过可视化的方式&#xff0c;以更少的编码&#xff0c;更快速地构建和交付应用软件&#…

docker 安装minio 服务 ssl 证书

minio 安装 ssl 证书 下载apache 证书 &#xff08;可以使用免费的证书&#xff09; 放在/opt/minio/conf/certs 下 (安装minio 时的 挂载目录 参考文章 docker 安装minio,详细图解 ) 拷贝进容器 /root/.minio docker cp /opt/minio/conf/certs/private.key minio:/root/.mi…

蜂窝物联四情监测:助力农业升级,科技赋能打造丰收新篇章!

农业四情指的是田间的虫情、作物的苗情、气候的灾情和土壤墒情。“四情”监测预警系统的组成包括管式土壤墒情监测站、虫情测报灯、气象站、农情监测摄像机&#xff0c;可实时监测基地状况,可以提高监测的效率和准确性&#xff0c;为农业生产提供及时、科学的数据支持&#xff…

知识图谱数据预处理笔记

知识图谱数据预处理笔记 0. 引言1. 笔记1-1. \的转义1-2. 特殊符号的清理1-3. 检查结尾是否正常1-4. 检查<>是否存在1-5. 两端空格的清理1-6. 检查object内容长时是否以<开始 0. 引言 最近学习知识图谱&#xff0c;发现数据有很多问题&#xff0c;这篇笔记记录遇到的…

【android 9】【input】【2.结构体含义】

系列文章目录 可跳转到下面链接查看下表所有内容https://blog.csdn.net/handsomethefirst/article/details/138226266?spm1001.2014.3001.5501文章浏览阅读2次。系列文章大全https://blog.csdn.net/handsomethefirst/article/details/138226266?spm1001.2014.3001.5501 目录…

怎么认识和应用Redis内部数据结构?no.22

Redis 内部数据结构 RdeisDb Redis 中所有数据都保存在 DB 中&#xff0c;一个 Redis 默认最多支持 16 个 DB。Redis 中的每个 DB 都对应一个 redisDb 结构&#xff0c;即每个 Redis 实例&#xff0c;默认有 16 个 redisDb。用户访问时&#xff0c;默认使用的是 0 号 DB&#…