资源描述:
《MATLAB求解线性规划(含整数规划和01规划)问题.pdf》由会员上传分享,免费在线阅读,更多相关内容在教育资源-天天文库。
1、MATLAB求解线性规划(含整数规划和0-1规划)问题线性规划是数学规划中的一类最简单规划问题,常见的线性规划是一个有约束的,变量范围为有理数的线性规划。如:maxzxy7129xy43004xy5200s.t3xy10300xy,0对于这类线性规划问题,数学理论已经较为完善,可以有多种方法求解此类问题。但写这篇文章的目的并不是为了介绍数学理论,我们这里主要讲解如果利用工具求解这一类线性规划问题。最著名,同时也是最强大的数学最优化软件是LINGO/LINDO软件包,它能够求解
2、多种的数学规划问题,同时还提供了多种的分析能力。但LINGO软件并不容易上手,同时,应用LINGO的场合一般是大规模的线性规划问题,小小的线性规划完全可以不使用它。一个更受科研人员欢迎的数学软件是MATLAB,它以功能强大而称著,并有数学软件中的“航空母舰”之称。我们这里就是要学习使用MATLAB软件求解线性规划(含整数规划和0-1规划)问题。为了使得不熟悉MATLAB的人员也能够使用MATLAB进行线性规划问题求解,本文将对MATALB中使用到的函数和过程以及结果进行详细的分析,最后会对每一个问题都给出一
3、个可以完全“套用”的MATLAB程序。我们首先从上面的线性规划问题开始,为了便于表达,将上面的式子写成矩阵形式:maxz7x12y94300x45200s.ty310300xy,0于是约束就表达为了一个Axb不等式。求解MATLAB线性规划时,最常用的函数是linprog函数,下面来介绍一下这个函数的使用。打开MATLAB帮助文档(PS:帮助文档的内容是最全的,只要你的英文过了专业8级),可以看到linprog函数求解的是具有如下
4、标准形式的线性规划:TminfxxAXbstAeqX.beqlbxub公式中各符号的意义是自明的,在这里简单介绍下,首先MATLAB中求解的是目标函数是最小值的问题,但如果我们的目标函数是求最大值,可以通过对目标函数中每一项中乘以-1,将求最大值问题转化为求最小值问题;A,b分别为不等式约束中的系数矩阵。Aeq和beq分别为等式约束中的系数矩阵,lb,和ub分别为每个变量的上下区间;最后f为目标函数中各变量的系数矩阵。现在,是时候动动手,使用MATLAB编写代码求解这个线性规划了。MATL
5、AB代码如下所示:f=[-7,-12];A=[94;45;310];b=[300;200;300];lb=zeros(2,1);%生成一个2行1列的全1矩阵[x,fval]=linprog(f,A,b,[],[],lb,[])我们来解释下linprog函数中每参数的意义,linprog中的一个原型如下:[x,fval,exitflag]=linprog(f,A,b,Aeq,beq,lb,ub)这7个参数的意义和上面f、A、b的意义是一样的。f为目标函数的系数矩阵,A为线性规划不等式约束的变量系数矩阵,b为不
6、等式约束的资源数(如上面的[300;200;300]),这是一个N行1列的矩阵,N为变量的个数。Aeq和beq是相应等式约束的变量系数矩阵和资源数(很明显,上面的例子中并没有等式约束)。lb和ub分别为保变量的上下区间。在上面的例子中,x和y和最小值都为0但都无最大值约束。而linprog的返回值x为求得的各变量的值,这是一个向量,fval为最优化的值,一般是一个标量,exitflag意为函数的退出标志。上面所示的代码[x,fval]=linprog(f,A,b,[],[],lb,[])中,[]代表不存在或
7、空,因为在上面的例子中不存在等式约束,所以Aeq和beq的位置为[]。而ub也为空,是因为变量没有最大值约束。运行上面的程序,行到结果为:x=20.000024.0000fval=-428.0000解释为:当x=20,y=24时,可以求得最优化的值,最大值为428(因为这里的求目标最大值,但MATLAB只能求目标函数最小值,所以对目标函数进行了乘-1处理,所以也要对最后的结果乘以-1才是目标函数所求).上面解决了简单的线性规划问题的求解,线性规范有两种比较特殊的情况,即整数规划和0-1整数规划。在之前(不知
8、MATLAB几之前……),MATLAB是不能直接求解这两种规划的,bintprog函数可以用来求0-1整数规划,但求解过程比较麻烦,而且最新版的MATLAB已经遗弃了这个函数,同时提供了一个比较新的、专用于求解整数规划和0-1整数规划的函数——intlinprog。intlinprog的一个原型为:[x,fval,exitflag]=intlinprog(f,intcon,A,b,Aeq,beq,lb,ub)该函