实验五:*******

一、实验目的

通过一个农业生产计划优化安排的实例求解,培养学生解决实际线性规划问题的初步能力;熟悉线性规划的建模过程;掌握Matlab优化工具箱中线性规划函数的调用

 

二、实验内容

 

某村计划在100公顷的土地上种植a、b、c三种农作物。可以提供的劳力、粪肥和化肥等资源的数量,种植每公顷农作物所需这三种资源的数量,以及能够获得的利润如表所示。

种植投入产出表

 

用  工

粪肥(吨)

化肥(千克)

利润(元)

a

450

35

350

1500

b

600

25

400

1200

c

900

30

300

1800

可提供资源

63000

3300

33000

 

其中一个劳动力干一天为1个工。现在要求为该村制定一个农作物的种植计划,确定每种农作物的种植面积,使得总利润最大。

 

 

三、算法步骤、代码、及结果

1. 算法步骤

1. 定义变量

设 x1, x2, x3 分别为 a, b, c 三种农作物的种植面积(公顷)。

 

2. 建立目标函数

目标函数是最大化总利润,可以表示为:

Z = 1500x1 + 1200x2 + 1800x3

 

3. 建立约束条件

根据题目给出的资源限制,我们可以建立以下约束条件:

 

用工限制:450x1 + 600x2 + 900x3 ≤ 63000

粪肥限制:35x1 + 25x2 + 30x3 ≤ 3300

化肥限制:350x1 + 400x2 + 300x3 ≤ 33000

种植面积限制(非负且总和为100公顷):x1, x2, x3 ≥ 0 且 x1 + x2 + x3 = 100

4. 使用MATLAB求解

在MATLAB中,我们可以使用linprog函数来求解线性规划问题。首先,我们需要将问题转化为linprog的标准形式:

 

min -Z

s.t. Ax ≤ b

Aeqx = beq

lb ≤ x ≤ ub

 

其中,A 和 b 是线性不等式约束的系数和右侧值,Aeq 和 beq 是线性等式约束的系数和右侧值,lb 和 ub 是变量的下界和上界。

2. 代码

 

% 定义目标函数的系数(注意:linprog默认求解最小化问题,所以我们取负号)

f = [-1500; -1200; -1800];

 

% 定义不等式约束的系数和右侧值

A = [450, 600, 900;

35, 25, 30;

350, 400, 300];

b = [63000; 3300; 33000];

 

% 定义等式约束的系数和右侧值(种植面积总和为100公顷)

Aeq = [1, 1, 1];

beq = 100;

 

% 定义变量的下界和上界(这里只有下界,上界可以设为inf)

lb = [0; 0; 0];

ub = [inf; inf; inf];

 

% 调用linprog函数求解

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

 

% 输出结果

if exitflag > 0

disp('Optimal solution found.')

disp(['Profit: ', num2str(-fval)]) % 注意:取负号得到实际的最大利润

disp(['Area for crop a: ', num2str(x(1))])

disp(['Area for crop b: ', num2str(x(2))])

disp(['Area for crop c: ', num2str(x(3))])

else

disp('No feasible solution found.')

end

 

3. 结果

 

四、心得体会

这次实验为了解决这个问题,使用了线性规划模型。在给出的线性约束条件下最大化或最小化一个线性目标函数。通过给出的条件,计算出最大的利润,和对应农作物的的种植面积.让我对于知识和实际情况的关系理解加深了.

 代码量 50行