引言
相信不少小伙伴刚开始接触数学建模时,第一个学习的算法就是运筹学的重要分支--数学规划,而数学规划当中重要的分支就是线性规划了。在这里笔者参考了司守奎和孙玺菁老师的《数学建模算法与应用》(第三版)这本书,以此来讲讲关于线性规划当中的基础知识。
作为数学建模的基础算法,线性规划学习起来的难度并不大。在1947年提出线性规划当中的单纯形法后,线性规划趋于成熟,在工业界和商业界中都发挥着较为重要的作用。
线性规划模型的形式
一般而言,线性规划模型的形式有
-
线性规划模型的一般形式
简写形式为
2.也能用向量的形式表示
3.还能用矩阵的形式表示
解的概念
一般线性规划问题的数学标准型为
这里有两个重要概念为
可行解:
满足上图约束条件的解x=,称为线性规划问题的可行解,
而使上图中的目标函数达到最大值的可行解称为最优解。
可行域:
所有可行解构成的集合称为问题的可行域,记为R′。
例题
我们来看一道相当经典的问题
机床厂生产甲、乙两种机床’每台机床销售后的利润分别为4千元与3千元。生产甲机床需用A、B机器加工’加工时间分别为每台2h和每台1h;生产乙机床需用A、B、C三种机器加工’加工时间均为每台1h°若每天可用于加工的机器时数分别为A机器10h、B机器8h和C机器7h’问该厂应生产甲、乙机床各几台才能使总利润最大?
问题分析
决策变量:
我们将甲机床和乙机床的产量分别定义为和
目标函数:
我们开始分析这个问题时,就得先看看题目的目标是什么。这里是要让总利润最大化,那么我们确定影响目标的目标函数,目标函数为
(即要最大化Z)
约束条件:
我们发现生产甲机床需要用到A机器和B机器共同生产才行,它需要A机器2小时,B机器1小时,对于乙机器呢,它则需要A,B,C各个工作一小时,再根据题目中各个机器的工作时长我们可以得到以下关系式
模型建立:
而我们刚刚所构建的数学模型为
这个就是我们所构建的数学模型啦,下面我们用matlab来实现一下我们所设计的数学模型
clc,clear;
f=[-4,-3];
a=[2,1;1,1;0,1];
b=[10,8,7];
[x,y]=linprog(f,a,b);
x,y=-y;
disp(y)
运行结果:
Optimal solution found.x =26>> disp(y)26
注意!!!:matlab当中的标准形式为求解最小值,在求解最大值时,我们得加个负号。
建立线性模型的三个步骤
通过这样一道经典的例题,我们总结一下求解思路
-
分析问题,找出决策变量。
-
根据问题所给定的条件,找出决策变量必须要满足的一组线性等式或者不等式约束,即为约束条件。
-
根据问题的目标,构造关于决策变量的一个线性函数,即为目标函数。
走完这三步后,我们就能构建起我们的一个数学模型了
在做完我们的建模后,我们要对我们所构建的模型还要对我们的模型做一个灵敏度分析。
灵敏度分析
概念
所谓的灵敏度分析就是指对系统因周围条件变化而显示出来的敏感程度分析。其实就是对我们的数学模型和算法进行优化 。
实现方式
我们通常会提出这两个疑问,并去解答我们的疑问
- 如果参数中的一个或者几个发生了变化’现行最优方案会有什么变化?
- 将这些参数的变化限制在什么范围内’原最优解仍是最优的?
一些见解
在实际应用当中,给定参变量一个步长使其重复求解线性规划问题,以观察最优解的
变化情况,不失为一种可用的数值方法,特别是使用计算机求解时。(对于这一点,笔者在国赛时感触较大,虽然不是应用在线性规划上)
对于数学模型的灵敏度分析,我们在后面的博文当中会有所涉及的,感兴趣的同学可以等一下后面的文章,可以与笔者交流一下心得。
Matlab求解
求解线性规划模型已经有比较成熟的算法。对-般的线性规划模型’常用的求解方
法有图解法、单纯形法等;虽然针对线性规划的理论算法已经比较完善,但是当需要求解
的模型的决策变量和约束条件数量比较多时’手工求解模型是十分繁杂甚至不可能的’通
常需要借助计算机软件来实现。
目前’求解数学规划模型的常用软件有Matlab,Python,Lingo等多种,笔者后续文章中出现的
数学规划模型主要使用Matlab软件求解。Matlab求解数学规划问题(包括线性规划、整
数规划和非线性规划)采用两种模式:基于求解器的求解方法和基于问题的求解方法。
1.基于求解器的求解方法
线性规划的目标函数可以是求最大值,也可以是求最小值,约束条件的不等号可以是
小于等于号也可以是大于等于号。为了避免这种形式多样性带来的不便,Matlab基于求
解器的求解方法中规定线性规划的标准形式为
代码
[x,fval] =linprog(f,A,b)
[x,fval] =linprog(f,A,b,Aeq,beq)
[x,fcal] =linPr○g(f,A,b,Aeq,beα,lb,ub)
%%x返回决策向量的取值
%%5fval返回目标函数的最优值
%%f为价值向量
%%A,b对应线性不等式约束
%%Aeq’beq对应线性等式约束
%%lb和ub分别对应决策向量的下界向量和上界向量
2.基于问题的求解
Matlab基于问题的求解数学规划方法,首先需要用变量和表达式构造优化问题,然后
用solve函数求解。具体求解步骤可以通过下面例子看出来,或者在命令窗口运行doc
optimproblem,看Matlab的详细帮助。
代码
clc,clear
prob= optimroblem(‘ObjectiveSense','max')%目标函数最大化的优化间题
c =[4;3];b= [10:8;7];
a=[2,1;1,1;0,1]?
x= optimvar('x',2,'LowerBound',0); %决策变量
prob.Objective = c'*x; %目标函数
prob.Constraints.con 玉 a*x<=b; %约束条件
[sal,fval,flag,out]=solve(prob)% fval返回最优值
Bol.x %显示决策变量的值
这几行代码是基于刚刚那个例子给出的基于问题求解的方式,而我们刚刚在例题当中所给出的解答方案呢,则是使用了基于求解器的求解方式。
应用
线性规划在军事作战,经济分析, 经营管理,工程技术等领域都发挥着十分重要的作用,在讲完整数规划后,笔者会专门写一篇文章,讲解相关应用和例题求解。
总结
这是笔者关于数学建模相关的文章,略有不足,请各位读者多多指教,笔者也会在后期推出更为复杂和有意思的数学模型以及算法内容。
最后不要忘记关注一下笔者,谢谢各位小伙伴。