注:本篇随笔依据《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 %计时结束
请发表评论