当前位置:   article > 正文

线性规划模型(数学建模python版)_python线性规划模型求解

python线性规划模型求解

前言:本篇文章只涉及问题的应用层面(如何调用包调用函数,如何把问题归结为一般形式方便使用第三方库中的函数求解),不涉及问题的具体求解原理。

一、回顾以前我们学习到的线性规划

1.以前遇到的线性规划模型

首先回顾一下高中学过的线性规划:求一个线性目标函数在先行可行域内的最值问题。

高中遇到的问题:配送运输问题,生产规划问题、几何切割问题、买卖利润问题。

我们当时的做法无非分为算交点直接带入的激进派办法和老老实实地画图的保守派办法()。

2.现在遇到的线性规划问题

(1)多变量问题;

(2)目标盘函数不只是一次(非线性)

以上两种已经不能使用之前的办法做了

以下两种情况只是对执行域进行划分即可

(3)可行域中出现方程(易解决)

(4)变量也有自己的范围(易解决)

二、python对矩阵的操作以及线性规划的求解

学习这部分是为了对原始数据进行处理,以处理到可以使用python库中的函数可以解决的样子。

3.运用python进行矩阵运算:

下面是为了解决线性规划问题而需要掌握的一些矩阵运算的基本操作,主要是用到numpy库,不会的话可以运行一下下面的代码:

  1. import numpy as np
  2. a=np.array([[1,2,3],[4,5,6]])
  3. b=np.array([[1,2],[3,4],[5,6]])
  4. c=np.array([[1,2,3]])
  5. d=np.array([[9,8,7],[3,2,1]])
  6. #矩阵加法
  7. print("矩阵加法:")
  8. sum=a+d
  9. print(sum)
  10. #数乘
  11. print("矩阵数乘:")
  12. e=3*a
  13. print(e)
  14. #矩阵乘法
  15. print("矩阵乘法:")
  16. e=np.dot(a,b)
  17. print(e)
  18. #元素乘法
  19. print("元素对应相乘:")
  20. e=a*d
  21. print(e)
  22. #转置
  23. print("转置:")
  24. e=c.T
  25. print(e)
  26. #逆矩阵
  27. f=np.array([[1,2],[3,4]])
  28. res=np.linalg.inv(f)
  29. print("矩阵求逆:")
  30. print(res)
  31. #行列式
  32. print("行列式的值:")
  33. res=np.linalg.det(f)
  34. print(res)
  35. #矩阵的秩
  36. e=np.linalg.matrix_rank(d)
  37. print("矩阵d的秩:")
  38. print(e)
'
运行

贴个结果:

4.使用python对线性方程组进行求解

eg:

\left\{\begin{matrix} 10x - y- 2z = 72 \\ -x+10y -2z =83\\ -x-y+5z=42 \end{matrix}\right.

用lnumpy包有两个解法:

一个是运用线性代数中的逆矩阵:

A\vec{x}=\vec{b}\quad if\, A^{-1}\,exists,\,then\;\vec{x}=A^{-1}\vec{b}

一个是已经封装好的函数np.linalg.solve(A,b)

代码如下:

  1. import numpy as np
  2. A=np.array([[10,-1,-2],[-1,10,-2],[-1,-1,5]])
  3. b=np.array([-72,83,42])
  4. inv_A=np.linalg.inv(A)
  5. x=inv_A.dot(b)
  6. print(x)
  7. x=np.linalg.solve(A,b)
  8. print(x)
'
运行

这里推荐用第二个,方便。

当然,会出现有的变量前的系数为0的情况,这需要我们自己补充0:

\left\{\begin{matrix} 3x+2y=5\\ 5x+4y+6z=12\\ 7x+z=-7 \end{matrix}\right.

则对应的系数矩阵为:

A=\begin{bmatrix} 3 &2 &0 \\ 5 &4 &6 \\ 7 &0 & 1` \end{bmatrix}

5.python封装好的求解线性规划的函数:

线性规划的标准形式:

min\text{ }c^{T}x

\begin{cases} & Ax\leq b \\ & Aeq*x=beq \\ & lb\leq x\leq ub\end{cases}

注意:一定要把任何形式的线性规化成上面的形式,这样才可以套用python的函数进行求解。

min\,c^{T}x:我们把它叫做问题(要求解的目标)

我们把它叫做约束条件:

\begin{cases} & Ax\leq b \\ & Aeq*x=beq \\ & lb\leq x\leq ub\end{cases}

相信大家对这个应该比较熟悉,当然如果是第一次见,看看下面的这个例子也会明白是啥意思。

举个例子:若要求解下面的线性规划

max\;z=2x_1+3x_2-5x_3\\ \left\{\begin{matrix} x_1+x_2+x_3=7\\ 2x_1-5x_2+x_3\geq 10\\ x_1+3x_2+x_3\leq 12\\ x_1,x_2,x_3\geq0 \end{matrix}\right.

可以看到,这个和我们要的标准形式还是有差别的,比如问题要求解的是最大值,并且不等号也不全是小于等于,这就需要我们加负号变化一下:

先看问题:我们要求的是z的最大值,换言之,我们可以先求-z的最小值,然后取相反数。

约束条件也是一样的,加负号来改变不等号方向。

最后的求解代码如下:

  1. from scipy import optimize as op
  2. import numpy as np
  3. c=np.array([-2,-3,5])
  4. A=np.array([[-2,5,-1],[1,3,1]])
  5. b=np.array([-10,12])
  6. Aeq=np.array([[1,1,1]])
  7. beq=np.array([7])
  8. x1=(0,None)
  9. x2=(0,None)
  10. x3=(0,None)
  11. ans=op.linprog(c,A,b,Aeq,beq,bounds=(x1,x2,x3))
  12. print(ans)

运行结果如下:有很多信息,比如算了多少轮(nit),精度等等,不同的版本跑出来可能不太一样。我们要注意的只是答案就好(画红线部分):

三、何为“线性”?

对于以上的求解都建立在“线性”之上,那么什么叫“线性”呢?

让我们回顾一下线性代数中对于“线性”的定义:

f(ax+by)=af(x)+bf(y)

这里的问题要求:问题是线性的,并且约束也是线性的。

还记得我们之前说的吗,什么是问题,什么是约束?(小标题五)

只有满足线性才能使用线性规划,否则就要采取其他办法。

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/小舞很执着/article/detail/933317
推荐阅读
相关标签
  

闽ICP备14008679号