司守奎《数学建模算法与应用》第二版 第一章线性规划1.5
核心思想:通过变量代换将绝对值消去,令
u
i
=
∣
x
i
∣
+
x
i
2
u_i=\frac{|x_i|+x_i}{2}
ui=2∣xi∣+xi
v
i
=
∣
x
i
∣
−
x
i
2
v_i=\frac{|x_i|-x_i}{2}
vi=2∣xi∣−xi。则
x
i
=
u
i
−
v
i
x_i=u_i-v_i
xi=ui−vi,
∣
x
i
∣
=
u
i
+
v
i
|x_i|=u_i+v_i
∣xi∣=ui+vi。这里要注意到进行变量代换后产生的隐含条件,即
u
i
,
v
i
≥
0
u_i,v_i\geq0
ui,vi≥0
from scipy.optimize import linprog
import numpy as np
np.set_printoptions(precision=5)
if __name__ == "__main__":
f = np.array([1, 2, 3, 4] * 2)
A = np.array([[1, -1, -1, 1], [1, -1, 1, -3], [1, -1, -2, 3]])
A = np.append(A, -A, axis=1)
b = np.array([[-2, -1, -1 / 2]]).T
lb = np.zeros(8) # 由于做变量变换导致u和v的值有隐含条件u,v>=0
ub = np.array([[None] * 8])
bound = np.vstack((lb, ub)).T
res = linprog(f, A, b, A_eq=None, b_eq=None, bounds=bound)
print("最优值为", res.fun)
print("最优解为", res.x[:4] - res.x[4:])
# 最优值为 2.0
# 最优解为 [-2. 0. 0. 0.]