MATLAB求解线性规划(含整数规划和01规划)问题

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

MATLAB 求解线性规划(含整数规划和0-1规划)问题

线性规划是数学规划中的一类最简单规划问题,常见的线性规划是一个有约束的,变量范围为有理数的线性规划。如:

max 712z x y =+

9430045200s.t 310300,0

x y x y x y x y +≤⎧⎪+≤⎪⎨+≤⎪⎪≥⎩

对于这类线性规划问题,数学理论已经较为完善,可以有多种方法求解此类问题。但写这篇文章的目的并不是为了介绍数学理论,我们这里主要讲解如果利用工具求解这一类线性规划问题。

最著名,同时也是最强大的数学最优化软件是LINGO/LINDO 软件包,它能够求解多种的数学规划问题,同时还提供了多种的分析能力。但LINGO 软件并不容易上手,同时,应用LINGO 的场合一般是大规模的线性规划问题,小小的线性规划完全可以不使用它。一个更受科研人员欢迎的数学软件是MATLAB ,它以功能强大而称著,并有数学软件中的“航空母舰”之称。我们这里就是要学习使用MATLAB 软件求解线性规划(含整数规划和0-1规划)问题。

为了使得不熟悉MATLAB 的人员也能够使用MATLAB 进行线性规划问题求解,本文将对MATALB 中使用到的函数和过程以及结果进行详细的分析,最后会对每一个问题都给出一个可以完全“套用”的MATLAB 程序。

我们首先从上面的线性规划问题开始,为了便于表达,将上面的式子写成矩阵形式:

max 712z x y =+

9430045200s.t 310300,0x y x y ⎧⎛⎫⎛⎫⎛⎫⎪ ⎪ ⎪∙≤⎪ ⎪ ⎪ ⎪⎨⎝⎭ ⎪ ⎪⎝⎭⎝⎭⎪⎪≥⎩

于是约束就表达为了一个Ax b ≤不等式。

求解MATLAB 线性规划时,最常用的函数是linprog 函数,下面来介绍一下这个函数的使用。

打开MATLAB 帮助文档(PS:帮助文档的内容是最全的,只要你的英文过了专业8级),可以看到linprog 函数求解的是具有如下标准形式的线性规划:

min .T

x f x A X b s t Aeq X beq lb x ub ≤⎧⎪=⎨⎪≤≤⎩

公式中各符号的意义是自明的,在这里简单介绍下,首先MATLAB 中求解的是目标函数是最小值的问题,但如果我们的目标函数是求最大值,可以通过对目标函数中每一项中乘以-1,将求最大值问题转化为求最小值问题;A ,b 分别为不等式约束中的系数矩阵。Aeq 和beq 分别为等式约束中的系数矩阵,lb ,和ub 分别为每个变量的上下区间;最后f 为目标函数中各变量的系数矩阵。

现在,是时候动动手,使用MATLAB 编写代码求解这个线性规划了。MATLAB 代码如下所示:

f=[-7,-12];

A=[9 4;4 5;3 10];

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 为不等式约束的资源数(如上面的

[300;200;300]),这是一个N 行1列的矩阵,N 为变量的个数。Aeq 和beq 是相应等式约束的变量系数矩阵和资源数(很明显,上面的例子中并没有等式约束)。lb 和ub 分别为保变量的上下区间。在上面的例子中,x 和y 和最小值都为0但都无最大值约束。而linprog 的返回值x 为求得的各变量的值,这是一个向量,fval 为最优化的值,一般是一个标量,exitflag 意为函数的退出标志。

上面所示的代码[x,fval]=linprog(f,A,b,[],[],lb,[])中,[]代表不存在或空,因为在上面的例子中不存在等式约束,所以Aeq 和beq 的位置为[]。而ub 也为空,是因为变量没有最大值约束。

运行上面的程序,行到结果为:

x =

20.0000

24.0000

fval =

-428.0000

解释为:

当x=20,y=24时,可以求得最优化的值,最大值为428(因为这里的求目标最大值,但MATLAB 只能求目标函数最小值,所以对目标函数进行了乘-1处理,所以也要对最后的结果乘以-1才是目标函数所求).

上面解决了简单的线性规划问题的求解,线性规范有两种比较特殊的情况,即整数规划和0-1整数规划。在之前(不知MATLAB 几之前……),MATLAB 是不能直接求解这两种规划的,bintprog 函数可以用来求0-1整数规划,但求解过程比较麻烦,而且最新版的MATLAB 已经遗弃了这个函数,同时提供了一个比较新的、专用于求解整数规划和0-1整数规划的函数——intlinprog 。

intlinprog 的一个原型为:

[x,fval,exitflag]= intlinprog(f,intcon,A,b,Aeq,beq,lb,ub) 该函数的使用和linprog 函数的使用十分相似,其仅仅在linprog 函数的基础上多了一个参数——intcon 。我们来通过下面的例子来学习该参数的意义。 min 12z x x =--

12122124214211..21

,0,x x x x s t x x x -+≤-⎧⎪+≤⎪⎨-≤-⎪⎪≥⎩整数

在这里例子中,变量的取值范围不再是有理数集,而是整数集。求解此规划问题的MATLAB 程序如下:

f_13=[-1,-1];

ic_13=[1,2];

A_13=[-4,2;4,2;0,-2];

b_13=[-1;11;-1];

相关文档
最新文档