数学建模-线性

数学建模-线性

求解线性规划问题

  • 使用scipy.optimize.linprog()函数(求最小值的)

linprog: (c, A_ub, b_ub, A_eq, b_eq, bounds, method='interior-point', callback, options, x0)

  • A_ub(可选参数):不等式约束矩阵, 二维
  • b_ub(可选参数):不等式约束向量, 一维
  • A_eq(可选参数):等式约束矩阵,二维
  • b_eq(可选参数):等式约束向量,一维
  • bounds(可选参数):定义决策变量x的最小值和最大值
    • 数据类型: (min, max)序列对
    • None:使用None表示没有界限,默认情况下,界限为(0,None)(所有决策变量均为非负数)
    • 如果提供一个元组(min, max),则最小值和最大值将用作所有决策变量的界限。
  • 例一
    $$
    max z = 2x_1 + 3x_2 - 5x_3\newline
    $$

$$
s.t.
\begin{cases}
x_1+ x_2 + x_3 = 7\newline
2x_1 - 5x_2 + x_3 \geq 10\newline
x_1 + 3x_2 + x_3 \leq 12\newline
x_1, x_2, x_3 \geq 0
\end{cases}
$$

  1. max 化为 min

$$
minz = -2x_1 - 3x_2 + 5x_3
$$

得到 c = [-2, -3, 5]

  1. 把大于等于化为小于等于得到: $-2x_1 + 5x_2 - x_3 \leq -10$

$$
\begin{cases}
-2x_1 + 5x_2 - x_3 \leq -10\newline
x_1 + 3x_2 + x_3 \leq 12
\end{cases}
$$

得到 A_ub = [[-2, 5, -1], [1, 3, 1]], b_ub = [-10, 12]

  1. 找到等于号的式子

$$
x_1 + x_2 + x_3 = 7
$$

a_eq = [[1, 1, ,1]](二维), b_eq = [7]

1
2
3
4
5
6
7
8
9
10
11
12
13
14
from scipy import optimize
import numpy as np

c = np.array([-2, -3, 5])
a_ub = np.array([[-2, 5, -1], [1, 3, 1]])
b_ub = np.array([-10, 12])

# 注意这里是二维的,一维是列,二维是行
a_eq = np.array([[1, 1, 1]])
b_eq = np.array([7])

res = optimize.linprog(c, a_ub, b_ub, a_eq, b_eq)
# res.fun最优值, res.x 最优解
print(res.fun, res.x)
  • 例二

$$
max z = 3x_1 + 2x_2\
$$

$$
\begin{cases}
2x_1 + 3x_2 \leq 14\newline
2x_1 + x_2 \leq 9\newline
x_1 \leq 3, x_2 \leq 2\newline
x_1, x_2 \geq 0
\end{cases}
$$

1
2
3
4
5
6
c = np.array([-3, -2])
a_ub = np.array([[2, 3], [2, 1]])
b_ub = np.array([14, 9])
x_1 = (0, 3)
x_2 = (0, 2)
print(optimize.linprog(c, a_ub, b_ub, bounds=(x_1, x_2)))

建模例子

image-20210713075229920

image-20210713074735377

image-20210713075255310

image-20210713075359830

image-20210713075654993

image-20210713075958478

image-20210713080308613

image-20210713080623509

image-20210713081355031

image-20210713081539866

image-20210713082102226

image-20210713082131842

image-20210713082239381

image-20210713082253893