Matlab应用笔记--简单规划求解
注:本篇随笔依据《Matlab在数学建模上的应用》中第2章介绍来写,主要简单介绍规划问题的Matlab解决方法
(博客以及Matlab小白,若有不当欢迎指出)
一、线性规划
(标准型)
基本的函数形式(其他形式自行help)
[x,fval] = linprog(c,A,b,Aeq,beq,LB,UB,X0,OPTIONS)
fval为极值,x为取极值时自变量的取值
c为目标函数的系数列向量
A为约束不等式左边的系数矩阵,b为约束不等式右边的值向量
Aeq为约束等式左边的系数矩阵,beq为约束等式右边的值向量
LB为自变量x的下限列向量,UB为自变量x的上限列向量
X0位自变量x的初始值列向量
OPTIONS是控制参数
注意:在用此函数时必须先把目标函数和约束不等式化为标准型再带入函数求解,缺省条件可用[]替代
二、非线性规划
一般规划的解决方式
(标准型)
基本的函数形式(其他形式自行help)
X = fmincon(Fun,X0,A,B,Aeq,Beq,LB,UB,NONLCON,OPTIONS)
Fun是用M文件定义的目标函数f(x)。
A,B,Aeq,beq是线性约束,与linprog中的定义相同
LB,UB与linprog中的定义相同(inf、-inf为正、负无穷)
NONLCON是用M文件定义的非线性向量函数C(x),Ceq(x)
OPTIONS是优化参数
二次规划的解决方式
(二次规划:目标函数未自变量x的二次函数,约束条件全为线性)
(标准型)
基本的函数形式
[x,fval] = quadprog(H,f,A,b,Aeq,beq,LB,UB,X0,OPTIONS)
x,fval与lineprog中的定义相同
H是二次项系数相关的实对称矩阵
f是一次项系数相关的列向量
A,b,Aeq,beq与lineprog中的定义相同
LB,UB与lineprog中的定义相同
X0是x的初始列向量
OPTIONS是控制参数
H的求解技巧:https://blog.csdn.net/qq_45689790/article/details/107816148
罚函数法求解非线性规划(SUMT)
不细展开,只说大致思想
将问题中的约束函数做出适当的罚函数,由此构造出到参数的增广目标函数,把问题转化为无约束非线性规划问题。
三、整数规划
0-1整数规划
(自变量x取值只有0和1)
不细展开,只说其中的隐枚举法的大致思路。
任选一个可行解,求出它的值,然后把优于该值作为一个过滤条件添加约束条件中。
在往后的枚举求解过程中,若找到比它更优的结果,则更新过滤条件,如此反复直到枚举完。
最后的过滤值必定是最优值。
随机取样计算法
整数规划中自变量x是整数,整数解有限方便枚举。
但是若自变量x的维数过大或者取值范围过广时,枚举法求最优解不现实。
所以用随机取样的方法,随着迭代次数的增加,逐渐逼近最优解而获得满意解。
先用M文件定义好目标函数f和约束向量函数g
function [f,g] = mengte(x); f = ...; g(1) = ...; %统一化为≤的形式,<=右边为0(常量移至左边),方便后续处理 g(2) = ...; ... g(n) = ...; %n为约束函数的个数
编一函数求解(假设求极大值)
rand('state',sum(clock)); %随机状态用时钟编号,避免重复(导致随机数相同) p0 = 0; %初始化最大值(也可赋值-inf) tic %计时开始 %------for循环开始------ for i=1:times %迭代times次 x = 99*rand(N,1); %N为自变量x个数(向量长度) x1=floor(x);x2=ceil(x); %floor往负无穷取整,ceil往正无穷取整 [f,g] = mengte(x1); %调用mengte函数求值 if sum(g<=0) == n %n为约束函数的个数 if p0 <= f x0 = x1;p0=f; %更新x0和p0,x0是取极大值时自变量的取值 end end [f,g] = mengte(x2); %调用mengte函数求值 if sum(g<=0) == n %n为约束函数的个数 if p0 <= f x0 = x2;p0=f; %更新x0和p0,x0是取极大值时自变量的取值 end end end %---------for循环结束 x0,p0 %显示计算结果 toc %计时结束
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 单元测试从入门到精通
· 上周热点回顾(3.3-3.9)
· winform 绘制太阳,地球,月球 运作规律