- 线性规划
- 数学原型
- 1. matlab求解
- 函数原型
- 2. python求解
- 3. 例题
- matlab求解
m i n x c ⃗ T x ⃗ s . t . { A x ⃗ ≤ b ⃗ A e q ⋅ x ⃗ = b e q ⃗ l b ⃗ ≤ x ⃗ ≤ u b ⃗ min_xquad vec c^Tvec x\ s.t.left{ begin{aligned} Avec x leq vec{b} \ Aeqcdot vec x = vec {beq} \ vec {lb} leq vec x leq vec{ub} end{aligned} right . minxc Tx s.t.⎩⎪⎪⎨⎪⎪⎧Ax ≤b Aeq⋅x =beq lb ≤x ≤ub
这里向量都是列向量, 大写都是矩阵
c称为价值向量, b称为资源向量
函数原型matlab中线性规划求解一般都是最小值
如果要求最大值就要在优化目标上加个负号
注意求解之前要化成标准型
这里的函数参数命名参考上面的数学原型(具体是列向量还是行向量也对照上面看)
[x, fval] = linprog(c, A, b, Aeq, beq, lb, ub)
- c, b, lb, ub都是列向量
可以使用的库, plup和scipy
scipy代码线性规划的代码相较于plup稍微简洁一些
这里只浅介绍一下scipy
from scipy.optimize import linprog import numpy as np res = linprog(c,A,b,Aeq,beq,LB,UB,X0,OPTIOS) # 目标最小值 print(res.fun) # 最优解 print(rea.x)
a r g m a x z = 4 x 1 + 3 x 2 s . t . { 2 x 1 + x 2 ≤ 10 x 1 + x 2 ≤ 8 x 2 ≤ 7 x 1 , x 2 ≥ 0 argmax quad z = 4x_1+3x_2\ s.t. left{ begin{aligned} 2x_1 + x_2 le 10\ x_1+x_2le8\ x_2le7\ x_1, x_2ge0\ end{aligned} right . argmaxz=4x1+3x2s.t.⎩⎪⎪⎪⎪⎨⎪⎪⎪⎪⎧2x1+x2≤10x1+x2≤8x2≤7x1,x2≥0
matlab求解%% 记得求解之前要把题目化成标准型(看最上面给出的数学原形里的那个标准型), 本题已经是标准型
% 变量名字都可以随便取, 只要自己认得出来
% 价值向量, 因为要求最大值所以加个负号
c = [-4; -3];
A = [2, 1;
1, 1;
0, 1];
% 资源向量
b = [10; 8; 7]
% 返回值x_res, best_val也是随便取的名字
% linprog()括号里的参数 有空的中括号[] 是因为题目中没有等式条件
% 但是函数里面输入参数要按照顺序来, 所以就弄个[]占个位置
[x_res, best_val] = linprog(c, A, b, [], [], zeros(2, 1));
x_res
-best_val
附上答案
x_res =
2.0000 6.0000
ans(也就是 -best_val) =
26



