m i n z = f T x ( 1 ) s . t . { A x ≤ b ( 2 ) A e q ⋅ x = b e q ( 3 ) l b ≤ x ≤ u b ( 4 ) f 、 x 、 b 、 b e q 、 l b 、 u b 均为列向量 f 称为价值向量 , b 称为资源向量 l b 为决策变量的下界 , u b 为决策变量的上界 A 、 A e q 为矩阵 {min}\ z=f^Tx \ \ \ \ \ \ (1)\\ \ \\ s.t. \ \ \ \ \ \ \ \ \ \ {Ax≤b(2)Aeq⋅x=beq(3)lb≤x≤ub(4)\\ \ \\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ f、x、b、beq、lb、ub均为列向量\\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ f\ 称为价值向量,b\ 称为资源向量\\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ lb\ 为决策变量的下界,ub\ 为决策变量的上界\\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ A、Aeq为矩阵 min z=fTx (1) s.t. ⎩ ⎨ ⎧Ax≤bAeq⋅x=beqlb≤x≤ub(2)(3)(4) f、x、b、beq、lb、ub均为列向量 f 称为价值向量,b 称为资源向量 lb 为决策变量的下界,ub 为决策变量的上界 A、Aeq为矩阵
(1)为目标函数, m i n z min\ z min z 称为最优值
x x x的分量称为决策变量
(2),(3),(4)为约束条件,用 s . t . s.t. s.t.(subject to) 表示
(2)为不等式约束条件;(3)为等式约束条件;(4)为上下界约束条件
满足约束条件的解 x = ( x 1 , x 2 , ⋅ ⋅ ⋅ , x n ) x=(x_1,x_2,···,x_n) x=(x1,x2,⋅⋅⋅,xn) 称为线性规划的可行解
可行解中使得目标函数达到最值的解称为最优解
将模型化为标准形式,直接使用函数
[x,fval] = linprog(f,A,b)
[x,fval] = linprog(f,A,b,Aeq,beq)
[x,fval] = linprog(f,A,b,Aeq,beq,lb,ub)
x
为最优解fval
为目标函数的最优值如:
m a x z = 2 x 1 + 3 x 2 − 5 x 3 s . t . { x 1 + x 2 + x 3 = 7 2 x 1 − 5 x 2 + x 3 ≥ 10 x 1 + 3 x 2 + x 3 ≤ 12 x 1 , x 2 , x 3 ≥ 0 {max}\ z=2x_1+3x_2-5x_3\\ s.t. \ \ \ \ \ \ \ \ \ \ {x1+x2+x3=72x1−5x2+x3≥10x1+3x2+x3≤12x1,x2,x3≥0\\ max z=2x1+3x2−5x3s.t. ⎩ ⎨ ⎧x1+x2+x3=72x1−5x2+x3≥10x1+3x2+x3≤12x1,x2,x3≥0
化为标准形式:
m i n − z = − 2 x 1 − 3 x 2 + 5 x 3 s . t . { − 2 x 1 + 5 x 2 − x 3 ≤ − 10 x 1 + 3 x 2 + x 3 ≤ 12 x 1 + x 2 + x 3 = 7 0 ≤ x 1 , x 2 , x 3 {min}\ -z=-2x_1-3x_2+5x_3\\ s.t. \ \ \ \ \ \ \ \ \ \ {−2x1+5x2−x3≤−10x1+3x2+x3≤12x1+x2+x3=70≤x1,x2,x3\\ min −z=−2x1−3x2+5x3s.t. ⎩ ⎨ ⎧−2x1+5x2−x3≤−10x1+3x2+x3≤12x1+x2+x3=70≤x1,x2,x3
则
f
=
[
−
2
−
3
5
]
,
x
=
[
x
1
x
2
x
3
]
f=[−2−35] ,x=[x1x2x3]
f=⎣
⎡−2−35⎦
⎤,x=⎣
⎡x1x2x3⎦
⎤
A = [ − 2 5 − 1 1 3 1 ] , b = [ − 10 12 ] A=[−25−1131], b=[−1012]\\\\ A=[−2153−11],b=[−1012]
A
e
q
=
[
1
1
1
]
,
b
e
q
=
[
7
]
Aeq=[111],beq=[7]
Aeq=[111],beq=[7]
l
b
=
[
0
0
0
]
lb=[000]\\\\
lb=⎣
⎡000⎦
⎤
故编写代码如下:
clc,clear
% 目标函数
f = [-2; -3; 5] ;
% 不等式约束
A=[-2 5 -1; 1 3 1];
b=[-10; 12];
% 等式约束
Aeq=[1, 1, 1];
beq= 7;
% 上下界约束
lb=[0; 0; 0];
% 求解
[x,zmin]=linprog(f,A,b,Aeq,beq,lb);
zmax=-zmin;
% 展示结果
display(x);
display(zmax);
Optimal solution found.
x =
6.4286
0.5714
0
zmax =
14.5714
先建立线性规划的问题模型,决策变量,再添加限制条件,最后进行求解
clc,clear
% 建立问题
prob = optimproblem('ObjectiveSense','max');
% 创建决策变量
x=optimvar('x',3,'LowerBound',0);
% 目标函数
prob.Objective = 2*x(1)+3*x(2)-5*x(3);
% 约束条件
prob.Constraints.con1 = x(1)+x(2)+x(3)==7;
prob.Constraints.con2 = 2*x(1)-5*x(2)+x(3)>=10;
prob.Constraints.con3 = x(1)+3*x(2)+x(3)<=12;
% 求解
[result,zmin]=solve(prob);
zmax=-zmin;
% 展示结果
display(result.x);
display(zmax);
Solving problem using linprog.
Optimal solution found.
6.4286
0.5714
0
zmax =
14.5714
# 导库
from scipy import optimize
import numpy as np
# 目标函数
c = np.array([-2, -3, 5]) # 可用行向量表示列向量
#不等式约束
A = np.array([[-2, 5, -1], [1, 3, 1]])
b = np.array([-10, 12])
# 等式约束
Aeq = np.array([[1, 1, 1]])
beq = np.array([7])
# 上下界约束
lb = [0, 0, 0]
ub = [None, None, None]
bounds = np.array(list(zip(lb, ub))) # 各个决策变量的(左界,右界)元组组成的数组
# 求解
result = optimize.linprog(c, A, b, Aeq, beq, bounds)
x=result.x
zmax=-result.fun
print(result)
print(f"最优解:{x}\n最优值:{zmax}")
con: array([1.80712245e-09])
fun: -14.571428565645084
message: 'Optimization terminated successfully.'
nit: 5
slack: array([-2.24599006e-10, 3.85714286e+00])
status: 0
success: True
x: array([6.42857143e+00, 5.71428571e-01, 2.35900788e-10])
最优解:[6.42857143e+00 5.71428571e-01 2.35900788e-10]
最优值:14.571428565645084
fun
为目标函数的最优值x
为最优解# 导库
import pulp
import numpy as np
# 初始化线性规划问题模型
pro = pulp.LpProblem()
# 创建决策变量
lb = [0, 0, 0]
ub = [None, None, None]
bounds = np.array(list(zip(lb, ub)))
x = np.array([
pulp.LpVariable(f'x{i}',
lowBound=bounds[i - 1][0],
upBound=bounds[i - 1][1]) for i in [1, 2, 3]
])
#建立目标函数
c = np.array([-2, -3, 5])
pro += pulp.lpDot(c, x)
# 不等式约束
A = np.array([[-2, 5, -1], [1, 3, 1]])
b = np.array([-10, 12])
for i in range(len(A)):
pro += (pulp.lpDot(A[i], x) <= b[i]) # 添加限制条件
# 等式约束
Aeq = np.array([[1, 1, 1]])
beq = np.array([7])
for i in range(len(Aeq)):
pro += (pulp.lpDot(Aeq[i], x) == beq[i])
#求解
pro.solve()
#输出结果
print(pro)
print(f'最优值:{-pulp.value(pro.objective)}')
print(f'最优解:{[pulp.value(var) for var in x]}')
pro.objective
为最优解x
代表决策变量数组([x1,x2,x3]
),使用pulp.value
查看x
中各决策变量的值NoName:
MINIMIZE
-2*x1 + -3*x2 + 5*x3 + 0
SUBJECT TO
_C1: - 2 x1 + 5 x2 - x3 <= -10
_C2: x1 + 3 x2 + x3 <= 12
_C3: x1 + x2 + x3 = 7
VARIABLES
x1 Continuous
x2 Continuous
x3 Continuous
最优值:14.57142851
最优解:[6.4285714, 0.57142857, 0.0]