第4章 线性规划和整数规划模型#
4.1求解最大值的线性规划问题#
$max z = 72x_1+64x_2$
s.t.$$\begin{cases}
x_1+x_2\leq 50,\\
12x_1+8x_2\leq 480,\\
3x_1\leq 100,\\
x_1 ,x_2\geq 0
\end{cases}
$$
用Python软件求得最优解$x_1=20,x_2=30$,目标函数的最大值为3360。
直接求解#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
| import cvxpy as cp
x = cp.Variable(2,pos=True)
obj = cp.Maximize(72*x[0]+64*x[1])
con = [x[0]+x[1]<=50, 12*x[0]+8*x[1]<=480,3*x[0]<=100]
prob = cp.Problem(obj,con)
prob.solve(solver="GLPK_MI")
print('最优值为:',prob.value)
print('最优解为:\n',x.value)
|
输出结果:
1
2
3
| 最优值为: 3360.0
最优解为:
[20. 30.]
|
矩阵计算#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
| import cvxpy as cp
import numpy as np
x = cp.Variable(2,pos=True)#x有2个,且都取正数
c = np.array([72,64])
a = np.array([[1,1],[12,8],[3,0]])
b = np.array([50,480,100])
obj = cp.Maximize(c@x)#目标函数
con = [a@x<=b]#约束条件
prob = cp.Problem(obj,con)
prob.solve(solver="GLPK_MI")
print('最优值为:',prob.value)
print('最优解为:\n',x.value)
|
输出结果:
1
2
3
| 最优值为: 3360.0
最优解为:
[20. 30.]
|
4.2 求解最小值的线性规划问题#
$min Z = 20x_1+90x_2+80x_3+70x_4+30x_5$
s.t.$$\begin{cases}
x_1+x_2+x_5\geq 30,\\
x_3+x_4\geq 30,\\
3x_1+2x_3\leq 120,\\
3x_2+2x_4+x_5\leq48,\\
x_j\geq0且为整数,j=1,2,3,4,5.
\end{cases}
$$
把上述线性规划问题改写成$min z = c^Tx$,
s.t.$\begin{cases}Ax \leq b,\x_j\geq0且为整数,j=1,2,3,4,5.\end{cases}$
$c=\begin{bmatrix}20 \90 \80 \70 \30\end{bmatrix},$$A=\begin{bmatrix}-1&-1&0&0&-1 \0&0&-1&-1&0 \3&0&2&0&0 \0&3&0&2&1 \\end{bmatrix}$$b=\begin{bmatrix}-30 \-30 \120 \48 \end{bmatrix},$
Python软件求得最优解$x_1=30,x_2=x_5=0,x_3=6,x_4=24$,目标函数的最小值为2760。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
| import cvxpy as cp
x = cp.Variable(5,integer=True)
c = np.array([20,90,80,70,30])
a = np.array([[-1,-1,0,0,-1],[0,0,-1,-1,0],[3,0,2,0,0],[0,3,0,2,1]])
b = np.array([-30,-30,120,48])
obj = cp.Minimize(c@x)#目标函数
con = [a@x<=b,x>=0]#约束条件
prob = cp.Problem(obj,con)
prob.solve(solver="GLPK_MI")
print('最优值为:',prob.value)
print('最优解为:\n',x.value)
|
输出结果:
1
2
3
| 最优值为: 2760.0
最优解为:
[30. 0. 6. 24. 0.]
|