Matlab优化问题04_1—linprog(基础)

说明:linprog一般用来求解线性最优化问题(目标函数和约束条件均为线性)。

1】生产决策问题。某厂生产甲、乙两种产品,已知制成一吨产品甲需用A资源3吨,B资源4m3;制成一吨产品乙需用A资源2吨,B资源6m3C资源7个单位。若一吨产品甲和乙的经济价值分别为7万元和5万元,三种资源的限制量分别为90吨、200m3210个单位。试应生产这两种产品各多少吨才能使创造的总经济价值最高?

解:资源耗费如表4-1所示

4-1 生产BOM

 

A(吨)

Bm3

C(个)

3

4

0

2

6

7

总资源量

90

200

210

设生产甲x1吨,乙x2吨,由已知条件有:

Matlab优化问题04_1—linprog(基础)_第1张图片        

化为标准型有:

Matlab优化问题04_1—linprog(基础)_第2张图片

应用Matlablinpro工具求解过程如下:

主程序:

f=[-7,-5];

A=[3,2;4,6;0,7];

b=[90;200;210];

Aeq=[];beq=[];

lb=zeros(2,1);ub=[];

[x,z,exitflag,output,lambda]=linprog(f,A,b,Aeq,beq,lb,ub)

解得:

x =

14.0000

24.0000

z =

-218.0000

即生产甲14吨,乙24吨可使得利润最大为218万元。

exitflag =

1

output = 

iterations: 5

algorithm: 'interior-point'

cgiterations: 0

message: 'Optimization terminated.'

constrviolation: 0

firstorderopt: 4.3909e-07

lambda = 

ineqlin: [3x1 double]

eqlin: [0x1 double]

upper: [2x1 double]

lower: [2x1 double]


2】投资问题。某单位有一批资金用于4个工程项目的投资,各工程项目所得的净收益(投入资金的百分比)如表4-2所示。由于某种原因,决定用于项目A的投资不大于其他各项投资之和;而用于项目B的投资要大于项目的投资。试确定使该单位收益最大的投资分配方案。

4-2  工程项目收益表

工程项目

A

B

C

D

收益(%

15

10

8

12

解:设用x1x2x3x4分别代表用于项目A,B,C,D的投资比例,则有线性规划:

Matlab优化问题04_1—linprog(基础)_第3张图片

Matlablinprog工具求解该线性规划。

主程序:

 f=-[15 10 8 12];

 A=[1 -1 -1 -1;0 -1 -1 1];

 b=zeros(2,1);

 Aeq=ones(1,4);

 beq=1;

 lb=zeros(4,1);

 ub=ones(4,1);

 [x,z,exitflag,output]=linprog(f,A,b,Aeq,beq,lb,ub)

解得

x =

0.5000

0.2500

0.0000

0.2500

z =

-13.0000

A,B,C,D分别投资50%,25%,0%,25%时收益最大为13%

exitflag =1

output = 

iterations: 8



3在某建筑工程施工中需要制作10000套钢筋,每套钢筋由2.9m2.1m1.5m三种不同长度的钢筋各一根组成,它们的直径和材质不同。目前在市场上采购到的同类钢筋的长度每根均为7.4m,问应购进多少根7.4m长的钢筋才能满足工程的需要?

首先分析共有多少种不同的套裁方法,该问题的可能材料方案如表4-3所示。

4-3 材料方案表


下料长度(m)

裁料方案编号i

1

2

3

4

5

6

7

8

2.9

2

1

1

1

0

0

0

0

2.1

0

2

1

0

3

2

1

0

1.5

1

0

1

3

0

2

3

4

料头长度(m)

0.1

0.3

0.9

0

1.1

0.2

0.8

1.4


min f*x    设以xi(i=1,2,,8)表示按第i种裁料方案下料的原材料数量,则可得该问题的数学模型为:

S.t.

Aeq*x=beq

其中,f为系数矩阵,x为变量,x=[x1,…,x8],Aeq为等式约束系数矩阵,beq为右端值。

matlablinprog求解该问题。

fun005.m

clc

f=ones(1,8);

A=[];b=[];

Aeq=[2     1     1     1     0     0     0     0

      0     2     1     0     3     2     1     0

      1     0     1     3     0     2     3     4];

beq=10000*ones(3,1);

lb=zeros(8,1);ub=[];

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

%以下部分是为了进行整数规划,因为7.4米的钢筋不可能卖半根。

for i=1:8

if abs(x(i)-fix(x(i)))<1e-4

x(i)=fix(x(i));           %截断取整,即舍去小数部分

else x(i)=ceil(x(i));    %向上取整 如ceil(3.08)=4

i=i+1;

end

end

x

total=sum(x)              %求和

解得:

x =[2253  3748  0  1748  0  1253  0  0]'

total =9002

因此至少需要90027.4m长的钢筋,方案一2253根,方案二3748根,方案四1748根,方案六1253根,其它方案不用。

说明:我们看到采用的方案1246的料头长度(浪费的)分别为0.10.300.2,而不采用的方案3578的料头长度分别为0.91.10.81.4,浪费程度远大于所采用方案的,这从现实意义上佐证了我们线性规划的科学性和必要性。


4工作人员计划安排问题

某昼夜服务的公共交通系统每天各时间段(每4小时为一个时间段)所需的值班人数如表4-4所示,这些值班人员在某一时段开始上班后要连续工作8个小时(包括轮流用膳时间),问该公交系统至少需要多少名工作人员才能满足值班的需要?

表4-4  各时段所需值班人数表

班次

时间段

所需人数

1

6:00—10:00

60

2

10:00—14:00

70

3

14:00—18:00

60

4

18:00—22:00

50

5

22:00—2:00

20

6

2:00—6:00

30

xi为第i个时段开始上班的人员数,据题意建立下面的数学模型:

需要对前面六个约束条件进行形式变换,是不等式为非正不等式。只需要在不等式两侧取负即可。

fun006.m

clear

clc

f=ones(1,6);

A=-[1 0 0 0 0 1

    1 1 0 0 0 0

    0 1 1 0 0 0

    0 0 1 1 0 0

    0 0 0 1 1 0

    0 0 0 0 1 1];

b=-[60;70;60;50;20;30];

Aeq=[];beq=[];

lb=zeros(6,1);

ub=[];

x=round(linprog(f,A,b,Aeq,beq,lb,ub))%四舍五入

total=sum(x)

解得

x =[42  28  35  15  10  20]

total =150

exitflag = 1

所以,6个时段分别安排422835151020人即可满足值班需求,供需150人。计算正常收敛。

说明:本题目的近似方法为四舍五入法(认为工作人员正常情况下都没有完全发挥能力),不同于例3的严格朝正无穷方向取整(因为对工程材料而言,失之毫厘谬以千里,因此必须给与足够的安全系数)。






你可能感兴趣的:(MATLAB—优化问题)