数学建模学习(8):单目标和多目标规划

news2024/7/4 5:00:36

优化问题描述

优化

优化算法是指在满足一定条件下,在众多方案中或者参数中最优方案,或者参数值,以使得某个或者多个功能指标达到最优,或使得系统的某些性能指标达到最大值或者最小值

线性规划

线性规划是指目标函数和约束都是线性的情况

[x,fval]=linprog(f,A,b,Aeq,Beq,LB,UB)
x:求得最优情况下变量的解
fval:求得最优目标值
f:目标函数的系数(符号按最小值标准,若目标是求解机大值可以通过添加负号改成求极小值)
A:不等式约束的变量系数(符合按小于标准,如果是大于约束可通过加负号变成小于)
b:不等式约束的常量
Aeq:等式约束的变量系数Beq:等式约束的常量LB:变量的下限UB:变量的上限

%% 线性规划
clc;clear;close all;
%目标函数/max 要改成min 的形式,max最大值可以系数加个负号的变成求min
f=[-1;-2;3];   

%不等约束  /化成标准形式   x1+x2<=
% -x1-x2+0*x3<=-3
%0*x1-x2-x3<=-3
A=[-1,-1,0;0,-1,-1];%左边特征矩阵
b=[-3;-3]; %右边

%等式约束
Aeq=[1,0,1];  
Beq=[4];

%变量约束,上限,下限
LB=zeros(3,1);
UB=2*ones(3,1);

%优化
[x,fval]=linprog(f,A,b,Aeq,Beq,LB,UB);
%
objstr=['目标函数最优值:',num2str(fval)];
disp(objstr)
for i=1:length(x)
    xstr=['x',num2str(i),'的值为:',num2str(x(i))];
    disp(xstr)
end

非线性规划

非线性规划是指目标函数和约束有非线性的情况

 

%% 非线性规划1
clc;clear;close all;
%初始解,随意给个初始解
x0=zeros(3,1);

%不等约束
A=[2,1,3];%左边特征矩阵
b=[6]; %右边

%描述线性 
%等式约束
Aeq=[];
Beq=[];

%变量约束,上限,下限
LB=zeros(3,1);
UB=1*ones(3,1);

%
%优化求解 max 加负号  
fun = @(x)-x(1)^2+x(2)^2-x(2)*x(3);
%
nonlcon = @unitdisk;
[x,fval]=fmincon(fun,x0,A,b,Aeq,Beq,LB,UB,nonlcon);

objstr=['目标函数最优值:',num2str(-fval)];%num2str 数字变成字符
disp(objstr)
for i=1:length(x)
    xstr=['x',num2str(i),'的值为:',num2str(x(i))];
    disp(xstr)
end

function [c,ceq] = unitdisk(x)
%c为不等式非线性约束
%ceq为等式非线性约束
c=x(1)^2+x(1)*x(2)+x(2)*x(3)-x(2)-6;
%多个非线性约束的话,可以用[约束1;约束2];
ceq = [];
end

%%
%遇到较为复杂的目标函数
%可以写为函数的形式
fun = @obj;
function y = obj(x)
    y1 = x(1)^2+x(2)^2;
    y = sqrt(y1)+x(3)^3;
end
%%

多目标优化

 

多目标求解的第一种方法:

%% 非线性规划1
clc;clear;close all;
%%
%初始解,随意给个初始解
x0=zeros(3,1);

%不等约束
A=[2,1,3];%左边特征矩阵
b=[6]; %右边

%等式约束
Aeq=[];
Beq=[];

%变量约束,上限,下限
LB=zeros(3,1);
UB=1*ones(3,1);
%优化求解
%%
w1=0.5;w2=0.5;
fun = @(x)(-x(1)^2+x(2)^2-x(2)*x(3))*w1+(2*x(1)^2-x(2)^3+2*x(2)*x(3))*w2;


nonlcon = @unitdisk;
[x1,fval1]=fmincon(fun,x0,A,b,Aeq,Beq,LB,UB,nonlcon);
objstr=['目标函数最优值:',num2str(fval1)];
disp(objstr)
for i=1:length(x1)
    xstr=['x',num2str(i),'的值为:',num2str(x1(i))];
    disp(xstr)
end

function [c,ceq] = unitdisk(x)
%c为不等式非线性约束
%ceq为等式非线性约束
c=x(1)^2+x(1)*x(2)+x(2)*x(3)-x(2)-6;
ceq = [];
end

多目标求解的第二种方法

%% 非线性规划1
clc;clear;close all;
%%
%初始解,随意给个初始解
x0=zeros(3,1);

%不等约束
A=[2,1,3];%左边特征矩阵
b=[6]; %右边

%等式约束
Aeq=[];
Beq=[];

%变量约束,上限,下限
LB=zeros(3,1);
UB=1*ones(3,1);
%优化求解
%%
fun1 = @(x)-x(1)^2+x(2)^2-x(2)*x(3);
fun2 = @(x)2*x(1)^2-x(2)^3+2*x(2)*x(3);
%%
nonlcon = @unitdisk;
[x1,fval1]=fmincon(fun1,x0,A,b,Aeq,Beq,LB,UB,nonlcon);
objstr=['目标函数最优值:',num2str(fval1)];
disp(objstr)
for i=1:length(x1)
    xstr=['x',num2str(i),'的值为:',num2str(x1(i))];
    disp(xstr)
end
[x2,fval2]=fmincon(fun2,x0,A,b,Aeq,Beq,LB,UB,nonlcon);
objstr=['目标函数最优值:',num2str(fval2)];
disp(objstr)
for i=1:length(x2)
    xstr=['x',num2str(i),'的值为:',num2str(x2(i))];
    disp(xstr)
end
%% 多目标规划
goal=[fval1,fval2];
func = @(x)[-x(1)^2+x(2)^2-x(2)*x(3);2*x(1)^2-x(2)^3+2*x(2)*x(3)];
weight=[1,1];
[x,fival]=fgoalattain(func,x0,goal,weight,A,b,Aeq,Beq,LB,UB,nonlcon);
disp('在两个目标的优化结果为')
disp(func(x))
for i=1:length(x)
    xstr=['x',num2str(i),'的值为:',num2str(x(i))];
    disp(xstr)
end
%%
function [c,ceq] = unitdisk(x)
%c为不等式非线性约束
%ceq为等式非线性约束
c=x(1)^2+x(1)*x(2)+x(2)*x(3)-x(2)-6;
ceq = [];
end

%% 非线性规划1
clc;clear;close all;
%%
%初始解,随意给个初始解
x0=zeros(10,1);

%不等约束
A=[];%左边特征矩阵
b=[]; %右边

%等式约束
Aeq=[];
Beq=[];

%变量约束,上限,下限
LB=-1*ones(10,1);LB(1)=0;
UB=1*ones(10,1);
%优化求解
%%
fun1 = @obj1;
fun2 = @obj2;
%%
nonlcon = [];
[x1,fval1]=fmincon(fun1,x0,A,b,Aeq,Beq,LB,UB,nonlcon);
objstr=['目标函数最优值:',num2str(fval1)];
disp(objstr)
for i=1:length(x1)
    xstr=['x',num2str(i),'的值为:',num2str(x1(i))];
    disp(xstr)
end
[x2,fval2]=fmincon(fun2,x0,A,b,Aeq,Beq,LB,UB,nonlcon);
objstr=['目标函数最优值:',num2str(fval2)];
disp(objstr)
for i=1:length(x2)
    xstr=['x',num2str(i),'的值为:',num2str(x2(i))];
    disp(xstr)
end
%% 多目标规划
goal=[fval1,fval2];
func = @obj3;
weight=[1,1];
[x,fival]=fgoalattain(func,x0,goal,weight,A,b,Aeq,Beq,LB,UB,nonlcon);
disp('在两个目标的优化结果为')
disp(func(x))
for i=1:length(x)
    xstr=['x',num2str(i),'的值为:',num2str(x(i))];
    disp(xstr)
end
%%
function y1=obj1(x)
    [dim, num]  = size(x);
    tmp         = zeros(dim,num);
    tmp(2:dim,:)= (x(2:dim,:) - sin(6.0*pi*repmat(x(1,:),[dim-1,1]) + pi/dim*repmat((2:dim)',[1,num]))).^2;
    tmp1        = sum(tmp(3:2:dim,:));  % odd index
    tmp2        = sum(tmp(2:2:dim,:));  % even index
    y1      = x(1,:)             + 2.0*tmp1/size(3:2:dim,2);
%     y(2,:)      = 1.0 - sqrt(x(1,:)) + 2.0*tmp2/size(2:2:dim,2);
end
function y2=obj2(x)
    [dim, num]  = size(x);
    tmp         = zeros(dim,num);
    tmp(2:dim,:)= (x(2:dim,:) - sin(6.0*pi*repmat(x(1,:),[dim-1,1]) + pi/dim*repmat((2:dim)',[1,num]))).^2;
    tmp1        = sum(tmp(3:2:dim,:));  % odd index
    tmp2        = sum(tmp(2:2:dim,:));  % even index
%     y2      = x(1,:)             + 2.0*tmp1/size(3:2:dim,2);
    y2      = 1.0 - sqrt(x(1,:)) + 2.0*tmp2/size(2:2:dim,2);
end
function y=obj3(x)
    [dim, num]  = size(x);
    tmp         = zeros(dim,num);
    tmp(2:dim,:)= (x(2:dim,:) - sin(6.0*pi*repmat(x(1,:),[dim-1,1]) + pi/dim*repmat((2:dim)',[1,num]))).^2;
    tmp1        = sum(tmp(3:2:dim,:));  % odd index
    tmp2        = sum(tmp(2:2:dim,:));  % even index
    y(1,:)      = x(1,:)             + 2.0*tmp1/size(3:2:dim,2);
    y(2,:)      = 1.0 - sqrt(x(1,:)) + 2.0*tmp2/size(2:2:dim,2);
end
% function [c,ceq] = unitdisk(x)
% %c为不等式非线性约束
% %ceq为等式非线性约束
% c=x(1)^2+x(1)*x(2)+x(2)*x(3)-x(2)-6;
% ceq = [];
% end

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

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

相关文章

【C语言】通讯录2.0 (动态增长版)

前言 通讯录是一种记录联系人信息的工具&#xff0c;包括姓名、电话号码、电子邮件地址、住址等。 文章的一二三章均于上一篇相同&#xff0c;可以直接看第四章改造内容。 此通讯录是基于通讯录1.0&#xff08;静态版&#xff09;的基础上进行改进&#xff0c;请先看系列文字第…

IPv4网络用户访问IPv6网络服务器

NAT64静态映射为一对一的对应关系&#xff0c;通常应用在IPv4网络主动访问IPv6网络的场景中。 要求位于IPv4网络中的PC通过IPv4地址1.1.1.10能够直接访问位于IPv6网络中Server。 操作步骤 配置FW。 # 配置接口GigabitEthernet 0/0/1的IPv4地址。 <FW> system-view [F…

MyBatis-Plus 分页插件实现分页查询

目录 1. 配置分页查询的拦截器 2. 使用 Page 对象实现分页功能 1. 配置分页查询的拦截器 因为 MyBatis-Plus 里面使用了分页插件来实现分页查询, 所以我们需要将 MyBatis-Plus 的插件添加到当前的项目里, 这样我们执行的查询操作才会生效. 创建 PageConfig 类: Configurat…

华为云hcip核心知识笔记(存储服务规划)

云上存储 &#xff1a; 云硬盘:基于分布式架构&#xff0c;可弹性扩展的虚拟块存储服务 注意事项 挂载云硬盘实例和云硬盘必须在同一区域&#xff0c;否则挂载失败文件存储服务&#xff1a;完全托管的共享文件存储 可以为多个实例实现共享访问&#xff0c;不同vpc中可以进行对…

用python需要下载软件吗,python需要安装哪些软件

大家好&#xff0c;本文将围绕安装python需要什么样的电脑配置展开说明&#xff0c;python需要安装哪些软件是一个很多人都想弄明白的事情&#xff0c;想搞清楚用python需要下载软件吗需要先了解以下几个事情。 编程这东西很神奇。对于那些知道如何有用和有趣的这个工具,对于Xi…

数字IC验证高频面试问题整理附答案(二)

近日后台有同学私信还想要验证的面试题目&#xff0c;这不就来了~ Q16.权重约束中”:”和”: /”的区别 : 操作符表示值范围内的每一个值的权重是相同的,比如[1:3]:40,表示1&#xff0c;2&#xff0c;3取到的概率为40/120&#xff1b; :&#xff0f;操作符表示权重要平均分到…

手把手教你在云环境炼丹(部署Stable Diffusion WebUI)

前几天写了一篇《手把手教你在本机安装Stable Diffusion秋叶整合包》的文章&#xff0c;有些同学反映对硬件的要求太高&#xff0c;显卡太TM贵了。今天我再分享一个云服务器炼丹的方法&#xff0c;方便大家快速入门上手&#xff0c;这个云服务不需要特殊网络设置&#xff0c;能…

【rtmp】2: rtmp 推送 annexb

参考RTMP协议封装H264和H265协议详解 大神分析rtmp推送的大部分是annexb的h264 因此,我们就以此为格式 转为rtmp avcc 推送到服务器端。 一般sps、pps 前面有4个 字节的起始码,所以要跳过,不要计算在sps pps 长度里。 对于视频,先发avc头 第一个 5个字节 第一个字节 0x17 ,…

source insight常用操作

1、窗口布局 SI窗口十分丰富&#xff0c;通过菜单栏View->Toolbars/panels选择显示那些工具栏/窗口 Source Insight 窗口介绍_sourceinsight窗口_STCNXPARM的博客-CSDN博客 2、RGB护眼色 Source Insight4.0字体大小及护眼背景配置_sourceinsight4背景色配置_ProYuan28的…

Let’s Encrypt 免费证书提示:(STAGING) Pretend Pear X1证书不受信任

通过Let’s Encrypt 免费申请证书&#xff0c;发现浏览器并不信任 原因 我使用了ACME V2 测试环境&#xff1a; https://acme-staging-v02.api.letsencrypt.org/directory 需要改为生产环境 https://acme-v02.api.letsencrypt.org/directory 测试环境有两个活跃的根证书…

vue中的require

vue中的require 一、基本概念二、具体演示1.引入json2.引入图片 三、require.context引入图片&#xff1a;引入json引入模块js&#xff1a;引入vue文件&#xff1a; 一、基本概念 require 是 node 中的一个方法&#xff0c;他的作用是 用于引入模块、 JSON、或本地静态文件。r…

快速开发框架若依的基础使用详解

Hi I’m Shendi 快速开发框架若依的基础使用详解 最近在为公司制作新的项目&#xff0c;经过了一段时间的技术沉淀&#xff0c;我开始尝试接触市面上用的比较多的快速开发框架&#xff0c;听的最多的当属若依吧 于是就选用了若依 介绍 为什么选&#xff1f;目的是为了提高开发…

【前端设计】尝试一文搞懂verilog parameter的全部细节

这里是尼德兰的喵芯片设计相关文章&#xff0c;欢迎您的访问&#xff01; 如果文章对您有所帮助&#xff0c;期待您的点赞收藏&#xff01; 让我们一起为成为芯片前端全栈工程师而努力&#xff01; 一个参数的标准定义呢应该是这样的&#xff1a; parameter type range name …

SHELL——备份脚本

编写脚本&#xff0c;使用mysqldump实现分库分表备份。 1、获取分库备份的库名列表 [rootweb01 scripts]# mysql -uroot -p123456 -e "show databases;" | egrep -v "Database|information_schema|mysql|performance_schema|sys" mysql: [Warning] Using …

二十三种设计模式第十九篇--命令模式

命令模式是一种行为设计模式&#xff0c;它将请求封装成一个独立的对象&#xff0c;从而允许您以参数化的方式将客户端代码与具体实现解耦。在命令模式中&#xff0c;命令对象充当调用者和接收者之间的中介。这使您能够根据需要将请求排队、记录请求日志、撤销操作等。 命令模…

华为数通HCIP-IP组播基础

ospf、isis、BGP--ping通&#xff0c;单播路由--单播路由表&#xff1b; mpls--单播标签互通 点到多点业务流量下发 1、通过广播 一对所有发送&#xff1b; 缺陷&#xff1a;导致流量的有偿性、安全性得不到保障&#xff1b; 2、通过单播 一对一发送&#xff1b; 缺陷&…

嵌入式软件和硬件首先说一下怎么入门?

1&#xff0c;编程。这个你是否懂C语言编程&#xff0c;能够熟练或者熟悉使用C语言编写一段程序。不懂学习C语言。 2&#xff0c;单片机。你是否了解什么是单片机&#xff0c;单片机是做什么的。不懂的话&#xff0c;最好先了解一下什么是单片机&#xff0c;看下书&#xff0c…

万里腾飞终有路,国产替代正当时

2023年7月27-28日&#xff0c;I-CAR 2023 第六届细胞免疫疗法深度聚焦论坛在上海建工浦江皇冠假日酒店隆重举办&#xff0c;本次大会主要围绕实体瘤、质量控制&产业化、通用CAR-T疗法、免疫治疗新风口四大主题展开&#xff0c;就细胞免疫治疗快速发展崛起的同时&#xff0c…

openGauss学习笔记-26 openGauss 高级数据管理-约束

文章目录 openGauss学习笔记-26 openGauss 高级数据管理-约束26.1 NOT NULL约束26.2 UNIQUE约束26.3 PRIMARY KEY26.4 FOREIGN KEY26.5 CHECK约束 openGauss学习笔记-26 openGauss 高级数据管理-约束 约束子句用于声明约束&#xff0c;新行或者更新的行必须满足这些约束才能成…

ubuntu下,在vscode中使用platformio出现 Can not find working Python 3.6+ Interpreter的问题

有一段时间没有使用platformio了&#xff0c;今天突然使用的时候&#xff0c;发现用不了&#xff0c;报错&#xff1a; Ubuntu PlatformIO: Can not find working Python 3.6 Interpreter. Please install the latest Python 3 and restart VSCode。 上网一查&#xff0c;发现…