线性规划作业参考答案

总结

  • 同学们要事先多看一下国赛和美赛的优秀论文(电工杯的质量比这两个的差多了),至少要明白该写什么,怎么写。

  • 优化题都是要写这样的约束条件的,而且很好写,掌握了技巧就很简单,但是一定要练习。作业里除了一个同学是按下面这种形式写的约束条件,其他同学的约束条件都是跟高中应用题一样的。如果你看了论文,很显然都是下面这种专业的符号写法。这次的作业因为太简单,变量很少,如果碰到正常的几十几百个变量,你们的写法显然是不行的。

  • 重要的事情再说一遍,这种写法非常重要,线性规划写在论文里的就只有这个约束条件、求解结果。求解过程就只有一句话:“用 MATLAB 求解上述线性规划模型可得结果:”,“用 lingo 求解上述线性规划模型可得结果:”之类的,不要写任何多余的话。

模型建立

假设 \(x_{ij}\) 为 \(i\) 号糖果中 \(j\) 原料的用量,假设 \(s_{j}\) 为 \(j\) 号原料每月最多用量。则有以下限制:

\[ \sum_{i=1}^3x_{ij}\leq s_j\quad j=1,2,3 \]

\[ x_{ij}\ge0\quad i=1,2,3\quad j=1,2,3 \]

假设 \(u_{ij}\) 为 \(i\) 号糖果中 \(j\) 原料的最大含量,\(l_{ij}\) 为 \(i\) 号糖果中 \(j\) 原料的最小含量。则有约束条件:

\[ l_{ij}\leq \frac{x_{ij}}{\sum_{j=1}^3x_{ij}}\leq u_{ij}\quad i=1,2,3\quad j=1,2,3 \]

假设 \(p_j\) 为 \(j\) 号原料的成本,\(m_i\) 为 \(i\) 号糖果售价,\(n_i\) 为 \(i\) 号糖果的加工费,则获利满足:

\[ w=\sum_{i=1}^3\sum_{j=1}^3x_{ij}(m_i-n_i)-\sum_{i=1}^3\sum_{j=1}^3x_{ij}p_j \]

综上,整理后建立以下线性规划模型:

\[ max\quad w=\sum_{i=1}^3\sum_{j=1}^3x_{ij}(m_i-n_i)-\sum_{i=1}^3\sum_{j=1}^3x_{ij}p_j \\ s.t. \begin{cases} \sum_{i=1}^3x_{ij}\leq s_j\quad j=1,2,3 \\ x_{ij}\ge0\quad i=1,2,3\quad j=1,2,3 \\ l_{ij}\leq \frac{x_{ij}}{\sum_{j=1}^3x_{ij}}\leq u_{ij}\quad i=1,2,3\quad j=1,2,3 \end{cases} \]

程序

clear
% 自变量顺序:A甲 A乙 A丙 ...
% 输入已知数据
p = [2 1.5 1];          % 成本
m = [3.4 2.85 2.25];    % 售价
n = [0.5 0.4 0.3];      % 加工费
s = [2000 2500 1200];   % 限制用量

% 目标函数(取负数)
f = reshape(repmat(p, 3, 1), [], 1) + (repmat(n, 1, 3))' ...
    - (repmat(m, 1, 3))';

% 不等式约束 8 个
A = zeros(8, 9);
B = zeros(8, 1);
% 每月含量约束
for index = 1:3
    A(index, index * 3 - 2: index * 3) = ones(1, 3);
    B(index) = s(index);
end
% 比例约束(比较离散,就直接赋值了)
A(4, [1 4 7]) = [-0.4 0.6 0.6];
A(5, [1 4 7]) = [-0.2 -0.2 0.8];
A(6, [2 5 8]) = [-0.85 0.15 0.15];
A(7, [2 5 8]) = [-0.6 -0.6 0.4];
A(8, [3 6 9]) = [-0.5 -0.5 0.5];

% 上下限
lb = zeros(9, 1);
ub = inf * ones(9, 1);

% 求解
[sol_x, sol_f] = linprog(f, A, B, [], [], lb, ub);
disp('方案:')
disp(sol_x)
disp('收益:')
disp(-sol_f)

结果

A

1526.7

473.3

0

B

1017.8

1482.2

0

C

0

1200

0

获利:6160


本文章使用limfx的vsocde插件快速发布