如何建立数据模型
数学规划(1)简单基础与scipy.linprog包的使用
Eg1:运输问题
设A1,A2调运到三个粮站B1,B2,B3的大米分别为\(x_{1},x_{2},x_{3},x_{4},x_{5},x_{6}\)单位为吨。
\(minf = 12x_{1}+24x_{2}+8x_{3}+30x_{4}+12x_{5}+24x_{6}\)
于是就有
\[s.t.\left\{
\begin{aligned}
x_{1}+x_{2}+x_{3}\leqslant4\\
x_{4}+x_{5}+x_{6}\leqslant8\\
x_{1}+x_{4}\geqslant2\\
x_{2}+x_{5}\geqslant4\\
x_{3}+x_{6}\geqslant5\\
x_{1},x_{2},x_{3},x_{4},x_{5},x_{6}\geqslant0
\end{aligned}
\right.
\]
进而可以得出python代码如下
import numpy
from scipy.optimize import linprog
# 不使用科学计数法
numpy.set_printoptions(suppress=True)
targetCoefficient = numpy.array([12,24,8,30,12,24])
# cc represents ConstraintCoefficient
cc1 = numpy.array([1,1,1,0,0,0])
cc2 = numpy.array([0,0,0,1,1,1])
cc3 = numpy.array([-1,0,0,-1,0,0])
cc4 = numpy.array([0,-1,0,0,-1,0])
cc5 = numpy.array([0,0,-1,0,0,-1])
# 因为上下界默认是0-inf,所以这个无需管
# cc6_1 = numpy.array([1,0,0,0,0,0])
# cc6_2 = numpy.array([0,1,0,0,0,0])
# cc6_3 = numpy.array([0,0,1,0,0,0])
# cc6_4 = numpy.array([0,0,0,1,0,0])
# cc6_5 = numpy.array([0,0,0,0,1,0])
# cc6_6 = numpy.array([0,0,0,0,0,1])
a = [cc1,cc2,cc3,cc4,cc5]
b = [4,8,-2,-4,-5]
res = linprog(targetCoefficient,A_ub = a,b_ub=b,method='revised simplex')
print(res)
进一步运行得到结果:
数学规划要点总结
1.决策变量尽量设置为通量,下标多是可以接受的(方便寻找其含义,以上题为例记为\(x_{11}\),\(x_{21}\),就比\(x_{1}\),\(x_{4}\)更为清晰)
2、模型中尽量不要出现数字,用字母代替,方便模型的拓展以及编程,这样变量就可以简单分为决策变量和一直变量
3、决策变量是越多越好
4、规划的数学模型不允许出现分式,更不能将决策变量放在分母里。如果出现这种情况就要进行变换,将分母的决策变量外移
5、尽量将决策变量移至一边
6、建模时线性模型最好处理,出现非线性模型应该先尝试化为线性
scipy.linprog包的基本使用
使用介绍:仅能用在简单线性规划上,限制很大
scipy.optimize.linprog(c, A_ub=None, b_ub=None, A_eq=None, b_eq=None,
bounds=None, method='interior-point', callback=None, options=None, x0=None)
# 参数意义详见下图
# method 的选项有:
# ‘highs-ds’
# ‘highs-ipm’
# ‘highs’
# ‘interior-point’ (default)
# ‘revised simplex’
# ‘simplex’ (legacy)
# 通常来说选用revise simplex作为精度即可
使用样例