赞
踩
最近接触到了一个线性规划的题目,尝试用MATLAB解决,动手前想了很多思路,上网搜索了一下发现MATLAB中有专门的linprog函数专门解决线性规划问题,了解学习后果然十分方便。事实上,绝大部分的线性规划问题都是类似的,其方法也比较单一,最基本的就是我们熟悉的图形解法,以图像的方式直观的找到所求解所处的交点位置。但若使用MATLAB中的linprog函数,只要将问题用线性规划问题的方式描述清楚,在MATLAB中几行代码就可以解决。现把这次经验做个记录同时也分享给大家。
问题:
一家制造公司生产四种汽车零部件。每一个都是先制作,然后加工。每个零件所需的工时和利润为:
A部分 | B部分 | C部分 | D部分 | |
制作时间(h/100件) | 2.5 | 1.5 | 2.75 | 2 |
加工时间(h/100件) | 3.5 | 3 | 3 | 2 |
利润(美元/100件) | 375 | 275 | 475 | 325 |
下个月,制造车间和加工车间的生产能力分别为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函数是十分方便和简洁的。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。