一、学习目标

(1)了解最优化模型。

(2)掌握线性规划的优化求解。

(3)掌握整数规划的优化求解。

(4)了解Matlab的图形化应用。

二、实例演练

1、谈谈你对最优化模型的了解。

最优化模型是数学建模大赛中最常见的问题类型之一。一般说来,凡是寻求最大、最小、最远、最近、最经济、最丰富、最高效、最耗时的目标,都可以划入优化问题的范畴。MATLAB 优化工具箱和全局优化工具箱对多个优化问题提供了完整的解决方案,前者涵盖了线性规划、混合整型线性规划、二次规划、非线性优化、非线性最小二乘的求解器,后者囊括了全局搜索、多初始点、模式搜索、遗传算法等求解算法。

最优化即在一定的条件下,寻求使目标最小(大)的设计参数或决策。在优化问题中有两个关键对象:目标函数约束条件。哈哈哈,这让笔者想起来高中学到的线性规划,其实,本节谈到的最优化模型跟高中的线性规划还真有点像。不过,高中的线性规划问题约束条件很少,一般是通过作图法来求解。本节的最优化模型约束条件一般比高中的线性规划多很多,并且我们要通过写代码去求解,而不是作图。常规优化问题,其数学表达可以描述为:

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

以上数学表达式看不明白也没关系,因为下面我们会通过两个具体的例子去讲解分析。

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

常见的目标函数有:

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

混合整数线性规划:扩展了线性规划问题,增加了最优解中部分或全部变量必须是整数的约束。例如,如果一个变量代表要认购的股票数量,则只应取整数值。同样,如果一个变量代表发电机的开/关状态,则只应取二进制值(0 或 1)。

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

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

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

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

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

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

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

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

上表中*表示算法由全局工具箱提供。

我的天呀,你是不是已经被上面的内容吓傻了。看不太懂?没关系。我们现在只需知道有那么一回事即可,不必苦恼。等遇到相应的问题时我们再去结合具体的例子去深入学习和理解。

2、已知目标函数和约束条件如下,试求解目标函数的最小值。

初一看,HPS、PP、EP、P1、I1,……等等,这些是什么东东?别紧张,它们只是变量,把它们当成x,y,z这种常见的变量去看待即可。我数了一下,约束函数中共有19条数学表达式,涉及16个变量。是挺难搞的,用高中的作图法怕是解决不了。别怕,我们有Matlab,通过代码去搞定它。

好,现在我们开始一步步去求解它。

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

这个标准形式很重要,上面的A,b,Aeq,beq,lb,ub我们后面要用到。

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

   1 ) 选择优化求解器

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

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

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

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

    6 ) 创建目标函数

    7 ) 优化问题求解

8 ) 结果检验

上面的求解步骤非常重要,我们的代码整体框架跟求解步骤差不多。

现在我们按照上面的求解步骤去求解:

(1)选择优化求解器。

这道题目是这是一个线性规划问题。求解线性规划问题,我们一般选用linprog。linprog在写代码将要写完才需用到。在第一步我们只需要知道一个线性规划问题,代码按照求解线性规划问题去写即可。

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

目标函数和约束条件中共有HPS、PP、EP、P1、I1等16个变量,我们需要将其合并为一个向量。除了合并为一个向量外,我们还将每个变量依次分别赋值1,2,3,4,……16。

%% 将所有变量合并为一个向量,共16个变量
variables = {'I1','I2','HE1','HE2','LE1','LE2','C','BF1','BF2','HPS','MPS','LPS','P1','P2','PP','EP'}
N = length(variables)
for v = 1:Neval([variables{v},'=',num2str(v),';'])
end

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

lb是指low boundary,即最低边界。ub是指up boundary,即最高边界。在这一步中,我们需要把约束条件里的不等式(该不等式只含单个变量,如2500<=P1<=6250,3000<=P2<=9000)找出来,并根据它们的上下边界写代码。

%% 设置上下限约束(lb<=x<=ub)
% 设置下限约束,即lb<=x
lb = zeros(size(variables)); % 1x16的矩阵,每个数都是0
lb([P1,P2,MPS,LPS]) = [2500,3000,271536,100623];
% 设置上限约束,即x<=ub
ub = Inf(size(variables)); % 1想6的矩阵,每个数都是无穷大
ub([P1,P2,I1,I2,C,LE2])= [6250,9000,192000,244000,62000,142000];

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

在这一步需要将约束条件里的不等式(该不等式含两个或两个以上变量)找出来,并根据它们的上下边界写代码。

%% 创建线性不等式约束(A*x<=b)
A = zeros(3,16); % 3x16的矩阵,每个数均为0,为什么是3x16,因为约束条件有3个不等式
% 由不等式I1-HE1<=132000得到下面一行代码
A(1,I1)=1; A(1,HE1)=-1; b(1) = 132000;
% 由不等式-EP-PP<=12000得到下面一行代码
A(2,EP)=-1; A(2,PP)=-1; b(2) = -12000;
% 由不等式-P1-P2-PP<=-24550得到下面一行代码
A(3,[P1,P2,PP])=[-1,-1,-1];b(3)=-24550;

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

在这一步需要把约束条件中的等式找出来,并通过移项,让等式的右边为0。

%% 创建线性等式约束(Aeq*x=beq)
Aeq=zeros(8,16);beq=zeros(8,1) % 约束条件中共有8个等式
% 把等式I2=LE2+HE2转化为LE2+HE2-I2=0后,得到下面一行代码
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];

(6)创建目标函数。

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

(7) 求解问题

%% 由linprog实现线性规划问题求解
options = optimoptions('linprog','Algorithm','dual-simplex');
% 将前面已经确定的各个参数传入linprog()中
[x, fval] = linprog(f,A,b,Aeq,beq,lb,ub,options);
for d=1:Nfprintf('%12.2f\t%s\n',x(d),variables{d})
end

fprintf函数是将求解后每个变量的打印出来。

求解结果如下:

下面把完整的源代码贴上:

clc,clear,close all
%% 选择优化求解器,线性规划求解可由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:Neval([variables{v},'=',num2str(v),';'])
end%% 设置上下限约束(lb<=x<=ub)
% 设置下限约束,即lb<=x
lb = zeros(size(variables)); % 1x16的矩阵,每个数都是0
lb([P1,P2,MPS,LPS]) = [2500,3000,271536,100623];
% 设置上限约束,即x<=ub
ub = Inf(size(variables)); % 1想6的矩阵,每个数都是无穷大
ub([P1,P2,I1,I2,C,LE2])= [6250,9000,192000,244000,62000,142000];%% 创建线性不等式约束(A*x<=b)
A = zeros(3,16); % 3x16的矩阵,每个数均为0,为什么是3x16,因为约束条件有3个不等式
% 由不等式I1-HE1<=132000得到下面一行代码
A(1,I1)=1; A(1,HE1)=-1; b(1) = 132000;
% 由不等式-EP-PP<=12000得到下面一行代码
A(2,EP)=-1; A(2,PP)=-1; b(2) = -12000;
% 由不等式-P1-P2-PP<=-24550得到下面一行代码
A(3,[P1,P2,PP])=[-1,-1,-1];b(3)=-24550;%% 创建线性等式约束(Aeq*x=beq)
Aeq=zeros(8,16);beq=zeros(8,1) % 约束条件中共有8个等式
% 把等式I2=LE2+HE2转化为LE2+HE2-I2=0后,得到下面一行代码
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));
% 由目标函数0.002614HPS+0.0239PP+0.009825EP
f([HPS,PP,EP]) = [0.002614,0.0239,0.009825];%% 由linprog实现线性规划问题求解
options = optimoptions('linprog','Algorithm','dual-simplex');
% 将前面已经确定的各个参数传入linprog()中
[x, fval] = linprog(f,A,b,Aeq,beq,lb,ub,options);
for d=1:Nfprintf('%12.2f\t%s\n',x(d),variables{d})
end

3、下面是一个整数规划问题,已知目标函数和约束条件如下,求解目标函数的最大值。

求解最大值问题和求解最小值问题本质上是一致的,求解最大值也可以转换为求解最小值。

例如:本题要求解z=3*x1-2*x2+5*x3的最大值,也就是要求解y=-3*x1+2*x2-5*x3的最小值。求解线性规划最小值问题我们在上面已经学过。本题还有一个比较特殊的问题是,约束条件中的三个变量均为整数,而且是0或1,这也是所谓的0-1规划问题。

求解整值问题要用到专门的求解器 intlinprog。

clc,clear,close all
% 求z=3*x1 - 2*x2 + 5*x3的最大值转化为求y=-3*x1 + 2*x2 - 5*x3的最小值。
f = [-3;2;-5]; % 创建目标函数
intcon=[1,2,3];
A=[1 2 -1; 1 4 1; 1 1 0; 0 4 1]; % 四个不等式中的变量系数
b=[2;4;3;6]; % 约束条件中不等式右边的常数
lb=[0,0,0]; % x1,x2,x3=0
ub=[1,1,1]; % x1,x2,x3=1
Aeq=[0,0,0];
beq=0;
x=intlinprog(f,intcon,A,b,Aeq,beq,lb,ub)

我想提一下intcon=[1,2,3]这句代码是怎么回事。

下面我举一个简单的例子来说明intcon的用法。

X=[x1,x2,x3,x4,x5,x6],其中x2, x3, x6只能取整数
intcon = [2,3,6]
如果所有变量都只能取整数,则:intcon = [1,2,3,4,5,6]; 比较方便的写法是:intcon = 1:6
如果只有x4取整数,则:intcon = 4;就是约束整形变量

在本题中,除了x1,x2,x3=0或1外,没有其它的等式了。故Aeq=[0,0,0];beq=0;

4、图形化应用

在数学建模竞赛中,我们一般通过代码来进行求解问题,图形化应用可以用来检验结果是否正确。

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

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

Matlab数学建模(五):优化模型之标准模型相关推荐

  1. MATLAB数学建模:数学规划模型

    数学规划模型 数学规划是运筹学的一个重要分支,也是现代数学的一门重要学科.在实际问题的需要和计算机的飞速发展背景之下,数学规划迅速发展并成为了一门活跃的新兴学科. 在本章中,我们将介绍数学规划模型的概 ...

  2. 数学建模优化模型简单例题_数学建模之优化模型:存储模型

    点击上方「蓝字」关注我们 最近,为申报市级精品课程,我为我校"数学建模与科学计算"课程录制了讲课视频,下面是3.1节优化模型的第一个例子:存储模型.敬请大家批评指正! 优化模型是数 ...

  3. 数学建模系列-优化模型(六)---模拟退火模型

    模拟退火算法是基于一定概率跳出局部最优解的算法,我曾经写过这样一篇论文,现在把中心思想汇报下: 1.启发式算法: 启发式算法(Heuristic Algorithm)有两种定义: (1)基于直观或经验 ...

  4. 数学建模系列-优化模型(二)---图论模型(一)

    图论模型可以简单理解为画图解决的模型.比较经典的有树状图.TSP算法等等.其中上一篇文章中提到的动态规划也看作图论的一种. 图论模型可以简单的分为以下几种: 最短路径问题 最小生成树问题 网络最大流问 ...

  5. 数学建模系列-优化模型(二)---图论模型(三)

    本文考虑的是自最费用最大流问题. 最大流问题的标号法: 1.对初始点找有裕量的下一跳,用深度优先一路走下去,一直到终点为止,那么取这条路最小的一段的裕量.当然裕量也包括反向可以减少的量. 2.将这个裕 ...

  6. matlab球落点的数学建模,MATLAB数学建模:智能优化算法-人工鱼群算法

    MATLAB 数学建模: 人工鱼群算法 1. 基本原理 人工鱼群算法是一种受鱼群聚集规律而启发的优化算法. 在人工鱼群算法中, 我们假定鱼群的活动行为分为: 觅食行为, 群聚行为, 追随行为和随机行为 ...

  7. 数学建模——智能优化之模拟退火模型详解Python代码

    数学建模--智能优化之模拟退火模型详解Python代码 #本功能实现最小值的求解#from matplotlib import pyplot as plt import numpy as np imp ...

  8. 数学建模——智能优化之粒子群模型详解Python代码

    数学建模--智能优化之粒子群模型详解Python代码 import numpy as np import matplotlib.pyplot as plt from mpl_toolkits.mplo ...

  9. Matlab中一球反弹的高度,matlab数学建模2乒乓球的弹跳和罗基斯帝模型.doc

    matlab数学建模2乒乓球的弹跳和罗基斯帝模型.doc 1乒乓球的弹跳罗基斯第模型问题罗基斯第模型一个乒乓球离球拍的高度为H0,落在球拍上反弹,设恢复系数为E,不计空气阻力.1如果E为常数,讨论球的 ...

  10. 排课系统matlab,matlab数学建模排课

    matlab数学建模排课Tag内容描述: 1.TOMLAB课表编排问题 我们老师让我们做一个课表编排问题 题目见 我试图用基于MATLAB的一个软件TOMLAB做 因为他有一个例子 见 由于我对MAT ...

最新文章

  1. 计算机应用基础851,清华大学851西方经济学考研参考书目及考研真题
  2. leetcode算法题--回文子串
  3. 如何使linux中java支持中文
  4. Everest 0.6 添加开机自启动程序
  5. SysLink Overview
  6. 一台机器上同时部署多个tomcat服务
  7. 八皇后问题程序及注解
  8. 在 Visual Studio 2013 中使用 JavaScript 的 IntelliSense
  9. 建立立方体求面积和体积并用两种判断方法判断两个立方体是否相等(键盘输入数据)
  10. 破解版软件-20131014更新
  11. 计算机网络笔记四 无线局域网
  12. python打印pdf文件_3条指令教会你用python创建中文pdf文件,适合批量打印,附送源码-pdf文件不能打印...
  13. 【PHP】解决数据库查询出来的中文内容显示为问号“??”
  14. js中的经典题Foo.getName
  15. 简述计算机程序执行过程,计算机程序的执行过程
  16. visio画等分树状图
  17. lede 内核 单 编_编译了一个 K3 的 LEDE 17.01.4 版本提供下载(忠于 LEDE 原版,无任何附加包)...
  18. python培训深圳周末班
  19. Win10系统修改时间设置
  20. 聊聊并发编程的12种业务场景

热门文章

  1. 【pandas教程】索引操作
  2. C++刷屏器(DevCpp-5.10编译通过)
  3. log4cpp 详解及使用操作
  4. Firefox必备的24款web开发插件
  5. 一阶倒立摆的起摆与稳摆simulink仿真
  6. vhdl入门2——ise制作一位全加器
  7. Android原生游戏开发:使用JustWeEngine开发微信打飞机
  8. java计算机毕业设计蔚蓝在线学习平台源码+系统+数据库+lw文档+mybatis+运行部署
  9. 美媒:马斯克已掌管推特 立即开除CEO、CFO,新CEO据传是曾经卖牛肉的中国人
  10. 移动端Vue3框架demo