MATLAB解决线性规划问题,学会使用linprog函数,在一个实例中演示linprog函数各参数的用法

       最近接触到了一个线性规划的题目,尝试用MATLAB解决,动手前想了很多思路,上网搜索了一下发现MATLAB中有专门的linprog函数专门解决线性规划问题,了解学习后果然十分方便。事实上,绝大部分的线性规划问题都是类似的,其方法也比较单一,最基本的就是我们熟悉的图形解法,以图像的方式直观的找到所求解所处的交点位置。但若使用MATLAB中的linprog函数,只要将问题用线性规划问题的方式描述清楚,在MATLAB中几行代码就可以解决。现把这次经验做个记录同时也分享给大家。

问题:

       一家制造公司生产四种汽车零部件。每一个都是先制作,然后加工。每个零件所需的工时和利润为:

A部分B部分C部分D部分
制作时间(h/100件)2.51.52.752
加工时间(h/100件)3.5332
利润(美元/100件)375275475325

下个月,制造车间和加工车间的生产能力分别为640小时和960小时。确定每个零件应生产多少以实现利润最大化。

       类似这种问题的表述都属于线性规划问题,即所谋划的变量只做数积和加减运算,若发现计算时出现多个变量相乘或出现幂次方的情况则为非线性问题。

       对于线性规划问题,可以直接使用matlab中的linprog函数,要了解,linprog函数中共有最基本的主要有七个参数,即:

linprog(f,A,b,Aeq,beq,lb,ub)

       现将题目以线性规划问题的方式描述,即假设A、B、C、D四个部分的零件分别生产x1、x2、x3、x4(百件),则问题可描述为数学语言即:

目标函数:

约束条件:

 2.5x1+1.5x1+2.75x1+2x1≤640

3.5x1+3x2+3x3+2x4≤960

       对应到linprog函数中,f为目标函数的系数矩阵(注意linprog函数只能求目标函数的最小值,故在写程序时应将系数矩阵的系数都取负数),A为约束条件的系数矩阵,b为约束条件的每个约束条件的右端数值组成的列向量,此处即[ 640; 960 ]。

        Aeq,beq为绝对条件的系数矩阵和条件右端数值组成的列向量,若此题目另有条件

2.5x1+1.5x1+2.75x1+2x1=640;3.5x1+3x2+3x3+2x4=960

则Aeq为该方程组的系数矩阵,beq = [ 604; 960];本题中并没有绝对条件,则Aeq、beq都赋为空。

       lb、ub为所求变量的上限和下限,本题中,xi为生产的零部件的件数,故下限为0,无上限。

代码如下:

A = [2.5,1.5,2.75,2; 3.5,3,3,2];
b = [640; 960];
Aeq = [];
beq = [];
lb = [0,0,0,0];
ub = [inf,inf,inf,inf];
f = [-375,-275,-475,-325];

x = linprog(f,A,b,Aeq,beq,lb,ub);
round(x*100)

由于xi的单位为(百件),故在最后将x*100并取整,运行结果为:

ans =

           0
       19200
       12800
           0

故当生产B部件19200件和C部件12800件时利润最大。

在命令行验证一下两个约束条件:

>> 2.5*x(1)+1.5*x(2)+2.75*x(3)+2*x(4)

ans =

     6.399999999999996e+02

>> 3.5*x(1)+3*x(2)+3*x(3)+2*x(4)

ans =

     9.599999999999750e+02

       约束条件都是满足的,要注意,linprog函数只能求目标函数的最小值,而本题要求利润的最大值,故在代码中将目标函数的系数矩阵都取了负数。

       事实上,大部分的线性规划问题都是类似的,解决方法也是几乎固定的,若是使用MATLAB解决线性规划问题,使用linprog函数是十分方便和简洁的。

  • 1
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

clear_lantern

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值