个人数学建模算法库之线性规划模型

模型描述

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. \ \ \ \ \ \ \ \ \ \ \begin{cases} Ax\le b &(2) \\ Aeq\cdot x=beq &(3)\\ lb\le x \le ub &(4)\\ \end{cases}\\ \ \\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ f、x、b、beq、lb、ub均为列向量\\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ f\ 称为价值向量,b\ 称为资源向量\\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ lb\ 为决策变量的下界,ub\ 为决策变量的上界\\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ A、Aeq为矩阵 min z=fTx      (1) s.t.           AxbAeqx=beqlbxub(2)(3)(4)                     fxbbeqlbub均为列向量                    f 称为价值向量,b 称为资源向量                    lb 为决策变量的下界,ub 为决策变量的上界                  AAeq为矩阵

  • (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) 称为线性规划的可行解

  • 可行解中使得目标函数达到最值的解称为最优解

Matlab代码

基于求解器

将模型化为标准形式,直接使用函数

[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. \ \ \ \ \ \ \ \ \ \ \begin{cases} x_1+x_2+x_3=7\\ 2x_1-5x_2+x_3\ge10\\ x_1+3x_2+x_3\le 12\\ x_1,x_2,x_3\ge 0 \\ \end{cases}\\ max z=2x1+3x25x3s.t.           x1+x2+x3=72x15x2+x310x1+3x2+x312x1,x2,x30

化为标准形式:

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. \ \ \ \ \ \ \ \ \ \ \begin{cases} -2x_1+5x_2-x_3\le-10\\ x_1+3x_2+x_3\le 12\\ x_1+x_2+x_3=7\\ 0\le x_1,x_2,x_3\\ \end{cases}\\ min z=2x13x2+5x3s.t.           2x1+5x2x310x1+3x2+x312x1+x2+x3=70x1,x2,x3


f = [ − 2 − 3 5 ] , x = [ x 1 x 2 x 3 ] f=\begin{bmatrix} -2\\ -3\\ 5\\ \end{bmatrix} ,x=\begin{bmatrix} x_1\\ x_2\\ x_3\\ \end{bmatrix} f= 235 ,x= x1x2x3

A = [ − 2 5 − 1 1 3 1 ] , b = [ − 10 12 ] A=\begin{bmatrix} -2&5&-1\\ 1&3&1\\ \end{bmatrix}, b=\begin{bmatrix}-10\\12\end{bmatrix}\\\\ A=[215311],b=[1012]

A e q = [ 1 1 1 ] , b e q = [ 7 ] Aeq=\begin{bmatrix}1&1&1\end{bmatrix},beq=[7] Aeq=[111],beq=[7]
l b = [ 0 0 0 ] lb=\begin{bmatrix}0\\0\\0\end{bmatrix}\\\\ 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

Python代码

Scipy库

# 导库
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为最优解

Plup库

# 导库
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]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

木子希卡利

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值