Matlab 数学建模方法(五):优化

一般说来,凡是寻求最大、最小、最远、最近、最经济、最丰富、最高效、最耗时的目标,都可以划入优化问题的范畴。

MATLAB 优化工具箱和全局优化工具箱对多个优化问题提供了完整的解决方案,前者涵盖了线性规划、混合整型线性规划、二次规划、非线性优化、非线性最小二乘的求解器,后者囊括了全局搜索、多初始点、模式搜索、遗传算法等求解算法。

本讲主要介绍如何使用优化工具箱求解数学建模中标准的优化模型。

1. 聊一聊最优化问题

最优化即在一定的条件下,寻求使目标最小(大)的设计参数或决策。在优化问题中有两个关键对象:目标函数约束条件(可选)。常规优化问题,其数学表达可以描述为:

其中x 为长度n的决策变量向量,f(x) 为目标函数,G(x) 为约束函数。

求解目标函数的最小(大)值,一个高效而精确的解决方案不仅取决于约束条件和变量数量,更取决于目标函数和约束函数的特性。明确优化类型是确认优化方案的前提,让我们看一下这些特性如何划分:

常见的目标函数有:

线性规划:被广泛地应用于变量之间可线性表示的财务、能源、运营研究等现代管理领域中。

混合整数线性规划:扩展了线性规划问题,增加了最优解中部分或全部变量必须是整数的约束。

二次规划:目标函数或约束函数为多元二次函数。此优化应用与财务金融中投资组合优化、发电厂优化、工程中设计优化等领域。

最小二乘:分为线性和非线性,通过最小化误差的平方和寻找变量的最优函数匹配。非线性最小二乘优化还可用于曲线拟合。

 

2. 优化求解器太多了,怎么选?

对 MATLAB 提供的各类优化问题的算法,我们称之为求解器(Solver)。根据其求解目标,被分为四大组:

  • 极小值优化组:找到目标函数出发点 x0 附近的局部极小值

  • 多目标优化组:找到最小化一组函数的最大值或指定的值

  • 方程求解组:找到非线性方程 f(x) = 0 出发点 x0 附近的解

  • 最小二乘法(曲线拟合)组:最小化平方和

仅优化工具箱就提供了近 20 种求解器,面对如此繁多的选项,用户往往一头雾水。幸好,MATLAB 提供了简单明了的参考工具 —— 优化决策表。可谓一表在手,优化不愁:

上表中*表示算法由全局工具箱提供。此外,多目标优化与方程组求解器并未被此表列举。

3. 写出漂亮、高效的代码

确认优化策略后,就可以开工写代码了。下面让我们通过一个例子,了解编写高效优化算法代码的步骤和注意事项。

[题目]

- 目标函数

-  约束函数(所有变量为正)

[解答]

a. 首先,根据题目确认这是一个线性规划问题。而线性规划的通用数学表达式和MATLAB标准形式为:

 创建符合标准格式的A、b、Aeq、beq、lb、ub参数,才可以顺利的运行优化算法。

b. 对于线性规划的优化求解步骤(也适用于其他优化方案),建议如下:

    1 ) 选择优化求解器

    2 ) 将所有变量合并为一个向量

    3 ) 创建边界约束(lb,ub)

    4 ) 创建线性不等式约束(A,b)

    5 ) 创建线性等式约束(Aeq,beq)

    6 ) 创建目标函数

    7 ) 优化问题求解

    8 ) 结果检验

c. MATLAB 代码和注释: 

%由优化决策表,确认线性规划求解,可由linprog实现
%将所有变量合并为一个向量,共16个变量
variables={'I1','I2','HE1','HE2','LE1','LE2','C','BF1','BF2','HPS','MPS','LPS','P1','P2','PP','EP'};
N=length(variables);
for v=1:N
    eval([variables{v},'=',num2str(v),';']);%eval()把字符串表达式当做命令语句,给variables的分量编号
end
%设置上下限约束(lb<=x<=ub)
lb=zeros(size(variables));
lb([P1,P2,MPS,LPS])=[2500,3000,271536,100623];
ub=Inf(size(variables));
ub([P1,P2,I1,I2,C,LE2])=[6250,9000,192000,244000,62000,142000];
%创建线性不等式约束(A*x<=b)
A=zeros(3,16);
A(1,I1)=1;A(1,HE1)=-1;b(1)=132000;
A(2,EP)=-1;A(2,PP)=-1;b(2)=-12000;
A(3,[P1,P2,PP])=[-1,-1,-1];
b(3)=-24550;

%创建线性等式约束(AEq*x=beq)
Aeq=zeros(8,16);beq=zeros(8,1);
Aeq(1,[LE2,HE2,I2])=[1,1,-1];
Aeq(2,[LE1,LE2,BF2,LPS])=[1,1,1,-1];
Aeq(3,[I1,I2,BF1,HPS])=[1,1,1,-1];
Aeq(4,[C,MPS,LPS,HPS])=[1,1,1,-1];
Aeq(5,[LE1,HE1,C,I1])=[1,1,1,-1];
Aeq(6,[HE1,HE2,BF1,BF2,MPS])=[1,1,1,-1,-1];
Aeq(7,[HE1,LE1,C,P1,I1])=[1267.8,1251.4,192,3413,-1359.8];
Aeq(8,[HE2,LE2,P2,I2])=[1267.8,1251.4,3413,-1359.8];

 

%创建目标函数
f=zeros(size(variables));
f([HPS PP EP])=[0.002614 0.0239 0.009825];

%优化问题求解,求解线性规划问题,由linprog实现
options=optimoptions('linprog','ALgorithm','dual-simplex');
[x,fval]=linprog(f,A,b,Aeq,beq,lb,ub,options);
for d =1:N
    fprintf('%12.2f\t%s\n',x(d),variables{d});%"%12.2f"输出一个浮点数,字段宽度为12位数,包括小数点后的两位数。
end

d. 优化结果: 

 

e. 如果结果不满意,可以调整优化选项,迭代计算。

4. 整数规划求解神器

在优化问题中, 经常会遇到整数规划问题, 尤其是0-1规划问题, MATLAB 对于整数规划问题,有个专门的求解器 intlinprog。 该函数不仅可以求解一般的整数规划问题,还可以求解混合整数规划问题,也就是决策变量既可以是整数也可以是小数,只要指定是整数的决策变量的编号就是可以。 通过一个具体的例子, 来看看这个函数的使用。

求解的问题是

求解的代码是: 

运行代码, 可很快得到最优解 x = [1 0 1]。

5. 受欢迎的图形化应用

MATLAB 在数据分析领域如此受欢迎,除了其提供丰富的内置算法集,还有各类友好的应用界面。在优化工具箱中,也有这么一个强大的工具—— Optimization App,可以在 MATLAB Apps 窗口或者运行 optmitool 命令打开。它是一个交互式的图形化应用工具,无需手写代码,直接在图形界面中设置各类求解器、配置目标函数、约束条件,即可运行优化算法并使中间结果和最终结果可视化。

在 Optimization App 中,只需点击菜单栏中的 File > Generate Code,即可将 App 中的各项设置自动生成 MATLAB 代码,用户可实现算法的复用和二次开发。 

 

 

 

 

 

 

 

 

  • 5
    点赞
  • 33
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值