其他分享
首页 > 其他分享> > 数学建模-简单基础与scipy.linprog包的使用

数学建模-简单基础与scipy.linprog包的使用

作者:互联网

如何建立数据模型

数学规划(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包的基本使用

官方网站:https://docs.scipy.org/doc/scipy/reference/generated/scipy.optimize.linprog.html
使用介绍:仅能用在简单线性规划上,限制很大
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作为精度即可
使用样例

标签:linprog,cc6,建模,scipy,None,array,numpy
来源: https://www.cnblogs.com/OceanCT/p/15823005.html