线性规划问题和MATLAB函数linprog的使用

题目:线性规划问题和MATLAB函数linprog的使用

        线性规划(Linear Programming, LP)问题的一般形式为:


其中。矩阵向量形式为


其中

       

       线线规划的几个基本性质:【文献[1]第46页】

       (1)线性规划问题的可行域如果非空,则是一个凸集-凸多面体;

       (2)如果线性规划问题有最优解,那么最优解可在可行域的顶点中确定;

       (3)如果可行域有界,且可行域只有有限个顶点,则问题的最优解必存在,并在这有限个顶点中确定;

       (4)最优解可由最优顶点处的有效约束形成的方程组的解确定。

       常用的线性规划求解方法有单纯形法和内点法。

1、单纯形法(simplex method)

       单纯形法是由G.B. Dantzig在1947年提出来的,这是20世纪数学界最重大的成果之一。单纯形法是一种迭代法,它根据线性规划问题的特点在问题可行域的顶点中逐步确定问题的最优解。在每一个是基本可行解的迭代点(即顶点),如果它不是最优的,单纯形法从与该顶点相连结的边中确定一个使目标函数值下降的边,沿该边移动可以确定一个与该顶点相邻且目标函数又优于该顶点的新顶点(新的基本可行解)。由于可行域的顶点数是有限的,如果每一次的移动都能使目标函数值下降,则经过有限次的移动方法必终止于问题的一个最优顶点。【文献[1]第57页】

       单纯形法要求线性规划具有标准形式,即

即约束函数都是等式约束,且决策变量均是非负的。

       任何线性规划问题使用单纯形法时都需要通过变换转换为线性规划的标准形。转换方法参见文献[1]第51页例2.1.6。

2、从单纯形法到内点法

       由于单纯形法的有效性,几十年来得到了广泛的应用。近年来,对于大规模的线性规划问题,尽管单纯形法受到了内点法的挑战,但单纯形法还是受到广大用户的青睐。

       一个算法如果其求得问题的解所用的运算工作量是问题的参数m和n的多项式,则称这一算法的复杂多项式时间算法;如果所需运算工作量的阶数是以m或n为幂的指数2m或2n,则称复杂性是指数时间的算法。

       单纯形算法的平均运算工作量是多项式时间的,但对于一个具体的问题其算法的复杂性并不一定是多项式的。1972年,Klee和Minty给出了一个复杂性为指数时间的例子。那么对线性规划问题是否存在时间复杂性是多项式的算法呢?如果存在多项式时间算法,如何设计这样的算法?

       1979年,前苏联数学家Khachiyan回答了第1个问题,他提出了一个椭球算法求不等式问题的解,并证明了算法的时间复杂性是多项式的。利用对偶理论,线性规划问题可以转换成不等式问题,这就明确回答了对线性规划存在多项式时间算法。但是计算的实际表明,椭球算法的效果要比单纯形方法差得多,并不是一个有实际应用价值的算法。

       1984年,在美国贝尔实验室工作的印度数学家Karmarkar回答了第2个问题,它对线性规划的求解提出了一个具有多项式时间复杂性的内点算法。

3、内点法(interior point method)

       求线性规划问题的单纯形方法在问题的基本可行解中确定最优解,在几何上,每次迭代它是沿着可行域的边界从一个顶点向另一个更好的顶点移动来实现的。内点算法则完全不同,它是从可行域的一个严格内点开始,产生一个使目标函数值逐步改善的严格内点序列,并最终收敛于问题的最优解。通过下图可以清晰的看出单纯形法与内点法的区别。

单纯形法与内战法轨迹(文献[1]图2.4.4)

       经过近20年的研究与发展,如今已有大量求解线性规划问题的内点算法,它们可以分成三类:路径跟踪算法,仿射调比算法,和原始对偶内点算法(primal-dual interior point method)。

4、线性规划问题的MATLAB求解

       在MATLAB中求解线性规划问题的函数是linprog,该函数集中了几种求线性规划的算法,如内点法和单纯形法,根据问题的规模或用户指定的算法进行求解。具体使用方法可查询帮助文件。

例:求如下线性规划问题。

输入以下代码:(代码是直接在Command Window中一行一行录入的,所以每行前面有符号“>>”)

>> f = [-5; -4; -6];
>> A = [1 -1  1;3  2  4;3  2  0];
>> b = [20; 42; 30];
>> lb = [0; 0; 0];
>> [x,fval,exitflag,output,lambda] = linprog(f,A,b,[],[],lb)

输出以下结果:

x =
    0.0000
   15.0000
    3.0000

fval =
  -78.0000

exitflag =

     1

output = 
         iterations: 6
          algorithm: 'large-scale: interior point'
       cgiterations: 0
            message: 'Optimization terminated.'
    constrviolation: 0

lambda = 
    ineqlin: [3x1 double]
      eqlin: [0x1 double]
      upper: [3x1 double]
      lower: [3x1 double]
参考文献:

【1】孙文瑜, 徐成贤, 朱德通.最优化方法(第二版)[M]. 北京:高等教育出版社, 2010.

【2】龚纯,王正林. 精通MATLAB最优化计算[M].北京: 电子工业出版社,2009.

  • 37
    点赞
  • 138
    收藏
    觉得还不错? 一键收藏
  • 11
    评论
### 回答1: MATLAB中的linprog函数用于解决线性规划问题。该函数的语法如下: x = linprog(f,A,b,Aeq,beq,lb,ub,x0,options) 其中,f是目标函数系数向量,A和b分别表示约束条件中的矩阵和向量,Aeq和beq表示等式约束条件中的矩阵和向量,lb和ub分别表示变量的下界和上界,x0是初始解向量,options是可选的设置。 例如,如果要解决下面的线性规划问题: 最大化 z = 3x1 + 2x2 约束条件: - 2x1 + x2 <= 4 - x1 + 2x2 <= 5 - x1, x2 >= 0 可以使用如下代码: ``` f = [-3 -2]; A = [2 1; 1 2]; b = [4; 5]; Aeq = []; beq = []; lb = [0; 0]; ub = []; x0 = []; options = optimoptions('linprog','Algorithm','simplex'); x = linprog(f,A,b,Aeq,beq,lb,[],x0,options); ``` 运行该代码后,x变量中存储了最优解(即x1和x2的值)。 ### 回答2: MATLAB中的linprog函数是一个线性规划求解器,可以用来解决线性规划问题线性规划问题是最优化问题的一种,它的目标是在约束条件下,求解线性目标函数的最小值或最大值。 具体来说,使用linprog函数可以将线性规划问题表示为标准形式,即: minimize c'*x subject to A*x <= b lb <= x <= ub 其中,c是长度为n的列向量,表示目标函数的系数;x也是长度为n的列向量,表示决策变量;A是m×n矩阵,表示约束条件的系数;b是长度为m的列向量,表示约束条件的右端项;lb和ub分别是长度为n的列向量,表示决策变量的下限和上限。需要注意的是,不一定需要同时指定lb和ub。 接下来,我们可以利用该函数来求解线性规划问题。在MATLAB命令窗口中输入以下代码: c = [-3,-2]; A = [1,5;10,1;-1,0;0,-1]; b = [30;50;-10;0]; [x,fval,exitflag] = linprog(c,A,b) 这里,我们定义了目标函数c、系数矩阵A、右端项b,并将它们作为参数传递给linprog函数。该函数会返回决策变量的值x、目标函数的最小值fval、以及求解过程的退出标志exitflag。 需要注意的是,由于线性规划问题存在多个解,因此函数可能给出不同的解。此外,如果约束条件无解或无穷解,函数也会给出相应的退出标志。 除了以上基本使用方法外,linprog函数还有很多高级用法。例如,可以通过指定选项来改变求解器的设置,设置输出格式等。此外,还可以将线性规划问题表示为标准形式之外的形式,并将其转换为标准形式进行求解。 总之,linprog函数MATLAB中一个非常有用的函数,可以帮助我们高效地解决线性规划问题。研究者和工程师可以利用这个函数来分析复杂的优化问题,并进一步优化他们的解决方法。 ### 回答3: MATLAB是一款广泛使用的计算软件,在MATLAB中有很多有用的函数,例如线性规划函数linprog。这个函数可以帮助用户解决线性规划问题,即最大化或最小化一个线性目标函数问题,同时满足一组线性不等式或等式的限制条件。 下面我们来介绍MATLABlinprog函数使用方法: 首先要明确的是linprog函数的输入和输出格式。输入格式由两组参数组成,分别是目标函数系数和限制条件矩阵。输出则是优化后的解向量和目标函数的值。 在使用linprog函数时,需要提供以下参数: 1. 目标函数系数向量c,它用来描述线性规划的目标函数,例如最小化成本或最大化收益。 2. 线性不等式组A和b,其中矩阵A的每一行表示一个约束条件,向量b表示对应的约束条件的右侧数值。 3. 线性等式组Aeq和beq,其中矩阵Aeq的每一行表示一个等式约束条件,向量beq表示对应的等式约束条件的右侧数值。 4. 变量的上下限制,即lb和ub。这些向量分别指定每个变量的上下限制。如果没有限制,则可以设为[]。 5. 一个可选的选项结构体options,它可以通过设置选项参数来调整求解方法和参数。 以下是一个典型的MATLAB程序的例子: c = [2,3,-5]; A = [-2,5,-1;1,3,1]; b = [-3;7]; lb = zeros(3,1); ub = [inf;inf;inf]; [x, fval] = linprog(c,A,b,[],[],lb,ub); 在这个例子中,我们定义了一个目标函数系数向量c=[2,3,-5],两组限制条件A和b及Aeq和beq均为空,变量的上下限制lb和ub均在之前已经定义。最后我们使用linprog函数得到了计算出来的解向量x和目标函数值fval。 总结起来,MATLAB中的linprog函数是用来解决线性规划问题的,其使用方法和所需要提供的参数和一般的线性规划问题的求解方法相似。熟练掌握这个函数使用方法,可以帮助用户在数学建模和优化相关领域的研究中发挥极大的作用。
评论 11
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值