数学建模算法(1)—规划模型及其python实现

什么是规划问题

在人们的生产实践中,经常会遇到如何利用现有资源来安排生产,以取得最大经济效益的问题。此类问题构成了运筹学的一个重要分支—数学规划,而线性规划(Linear Programming, 简记LP)则是数学规划的一个重要分支。

例: 某机床厂生产甲、乙两种机床,每台销售后的利润分别为4000元与3000 元。生产甲机床需用 A、 B两种机器加工,加工时间分别为每台 2 小时和 1 小时;生产乙机床需用 A、B、C三种机器加工,加工时间为每台各一小时。若每天可用于加工的机器时数分别为A 机器10 小时、B 机器8 小时和C 机器7 小时,问该厂应生产甲、乙机床各几台,才能使总利润最大?

上述问题的数学模型:设该厂生产 x 1 x_1 x1台甲机床和 x 2 x_2 x2台乙机床时总利润最大,则 x 1 , x 2 x_1,x_2 x1,x2应满足
max ⁡ z = 4 x 1 + 3 x 2 s.t. { 2 x 1 + x 2 ≤ 10 x 1 + x 2 ≤ 8 x 2 ≤ 7 x 1 , x 2 ≥ 0 \max z = 4x_1 + 3x_2 \\ \textbf{s.t.} \left\{ \begin{array}{l} {2 x_{1}+x_{2} \leq 10} \\ {x_{1}+x_{2} \leq 8} \\ {x_{2} \leq 7} \\ {x_{1}, x_{2} \geq 0} \end{array} \right. maxz=4x1+3x2s.t.2x1+x210x1+x28x27x1,x20

这里变量 x 1 , x 2 x_1,x_2 x1,x2称之为决策变量, max ⁡ z = 4 x 1 + 3 x 2 \max z = 4x_1 + 3x_2 maxz=4x1+3x2 被称为问题的目标函数,下面的几个不等式是问题的约束条件,记为s.t.(即subject to)。

简单来说,线性规划问题是在一组线性约束条件的限制下,求一线性目标函数最大或最小的问题,无论是约束条件还是目标函数出现非线性项,那么就问题就变成了非线性规划。

规划问题的分类

按照约束是否线性,以及求解变量的连续和离散形式,我们可以把规划问题分为以下四类:

类别定义
线性规划在一组线性约束条件的限制下,求一线性目标函数最大或最小的问题
非线性规划无论是约束条件还是目标函数出现非线性项1,那么规划问题就变成了非线性规划
整数规划当约束条件加强,要求所有的自变量必须是整数时,成为整数规划(特别地,自变量只能为0或1时称为0-1规划)
多目标规划在一组约束条件的限制下,求多个目标函数最大或最小的问题

本文主要研究连续形式下的线性规划和非线性规划。

线性规划及其Python解法

线性规划是所有规划问题的基础,因此我们首先讨论线性规划问题及其Python实现。对于一个规划类问题来说,我们通常用如下的步骤建立线性规划:

1. 选择适当的决策变量
在解决实际问题时,把问题归结成一个线性规划数学模型是很重要的一步,但往往也是困难的一步,模型建立得是否恰当,直接影响到求解。而选适当的决策变量,是我们建立有效模型的关键之一。

2. 将求解目标简化为求一个目标函数的最大/最小值
能把要求解的问题简化为一个最值问题是能否使用线性规划模型的关键,如果这一点不能达到,之后的工作都有没有意义的。

3. 根据实际要求写出约束条件(正负性,资源约束等)
线性规划的约束条件针对不同的问题有不同的形式,总结来说有以下三种:

  • 等式约束
  • 不等式约束
  • 正负性约束

单纯形法是求解线性规划问题的最常用、最有效的算法之一。这里我们不介绍单纯形法的数学原理,有兴趣的同学可以参看其它线性规划书籍。下面我们直接来看线性规划的Python求解方法。以下面的规划问题为例:
max ⁡ z = 2 x 1 + 3 x 2 − 5 x 3 s.t. { x 1 + x 2 + x 3 = 7 2 x 1 − 5 x 2 + x 3 ≥ 10 x 1 + 3 x 2 + x 3 ≤ 12 x 1 , x 2 , x 3 ≥ 0 \max z=2 x_{1}+3 x_{2}-5 x_{3} \\ \textbf{s.t.} \left\{ \begin{array}{l} x_{1}+x_{2}+x_{3}=7 \\ {2 x_{1}-5 x_{2}+x_{3} \geq 10} \\ {x_{1}+3 x_{2}+x_{3} \leq 12} \\ {x_{1}, x_{2}, x_{3} \geq 0} \end{array} \right. maxz=2x1+3x25x3s.t.x1+x2+x3=72x15x2+x310x1+3x2+x312x1,x2,x30

实际的线性规划问题千变万化,约束条件大于、小于、等于的情况均有发生,为了简化程序的输入,这里首先定义线性规划的标准型
min ⁡ x c T x   s.t.   { A x ≤ b  Aeq  ⋅ x = b e q l b ≤ x ≤ u b \begin{array}{l} {\displaystyle \min_x c^{T} x} \\ {\textbf { s.t. }\left\{\begin{array}{l}{A x \leq b} \\ {\text { Aeq } \cdot x=b e q} \\ {l b \leq x \leq u b}\end{array}\right.}\end{array} xmincTx s.t. Axb Aeq x=beqlbxub

其中,标准型要求目标函数都要化成求最小值的形式,对于需要求最大值的问题,直接取负即可。此外,标准型还要求不等式约束都用" ≤ \leq "给出 l b lb lb u b ub ub分别代表变量的lower bound 和upper bound,即上界和下界,如果是没有界限的情况,可以用None代替。

本例对应的标准型中各个参数为
c = [ − 2 , − 3 , 5 ] T , A = [ − 2 5 − 1 1 3 1 ] , b = [ − 10 , 12 ] T c= [-2, -3 ,5]^T, \quad A =\begin{bmatrix} -2 & 5 & -1\\1 & 3 & 1 \end{bmatrix} , \quad b= [-10,12]^T c=[2,3,5]T,A=[215311],b=[10,12]T

A e q = [ 1 , 1 , 1 ] b e q = [ 7 ] , l b = [ 0 , 0 , 0 ] T , l b = [ 7 , 7 , 7 ] T \quad Aeq = [1,1,1] \quad beq = [7], \quad lb = [0, 0 ,0]^T , \quad lb = [7, 7 ,7]^T Aeq=[1,1,1]beq=[7],lb=[0,0,0]T,lb=[7,7,7]T
这里我们使用scipy中的op库中的linprog方法进行线性规划的计算,代码如下

from scipy import optimize as op
import numpy as np
c=np.array([2,3,-5])                      #定义目标函数系数矩阵
A_ub=np.array([[-2,5,-1],[1,3,1]])        #定义不等式约束系数矩阵
B_ub=np.array([-10,12])                   #定义不等式约束右端项矩阵
A_eq=np.array([[1,1,1]])                  #定义等式约束系数矩阵
B_eq=np.array([7])                        #定义等式约束右端项矩阵
x1=(0,7)								  #定义变量x_1的范围
x2=(0,7)								  #定义变量x_2的范围
x3=(0,7)								  #定义变量x_3的范围
res=op.linprog(-c,A_ub,B_ub,A_eq,B_eq,bounds=(x1,x2,x3))   #调用函数进行求解

求解结果为

     fun: -14.571428571428571
 message: 'Optimization terminated successfully.'
     nit: 2
   slack: array([3.85714286, 0.        ])
  status: 0
 success: True
       x: array([6.42857143, 0.57142857, 0.        ])

这意味着原线性规划问题的解为
x = [ x 1 , x 2 , x 3 ] = [ 6.43 , 0.57 , 0 ] x= [x_1,x_2,x_3] = [6.43, 0.57, 0 ] x=[x1,x2,x3]=[6.43,0.57,0]

对应的目标函数最大值为
z m a x = 14.57 z_{max} = 14.57 zmax=14.57

非线性规划及其Python解法

实际的规划问题中,约束条件不总是线性的,这就要求我们也要能够求解非线性规划问题,下面就是一个典型的非线性规划问题:

min ⁡ f ( x ) = x 1 2 + x 2 2 + x 3 2 + 8   s.t.   { x 1 2 − x 2 + x 3 2 ≥ 0 x 1 + x 2 2 + x 3 3 ≤ 20 − x 1 − x 2 2 + 2 = 0 x 2 + 2 x 3 2 = 3 x 1 , x 2 , x 3 ≥ 0 {\min f(x)=x_{1}^{2}+x_{2}^{2}+x_{3}^{2}+8} \\ \textbf { s.t. } \left\{ \begin{array}{c} \displaystyle { x_{1}^{2}-x_{2}+x_{3}^{2} \geq 0} \\ {x_{1}+x_{2}^{2}+x_{3}^{3} \leq 20} \\ {-x_{1}-x_{2}^{2}+2=0} \\ {x_{2}+2 x_{3}^{2}=3} \\ {x_{1}, x_{2}, x_{3} \geq 0}\end{array} \right. minf(x)=x12+x22+x32+8 s.t. x12x2+x320x1+x22+x3320x1x22+2=0x2+2x32=3x1,x2,x30

很显然,其目标函数和约束条件都有非线性项,因此属于非线性规划。针对非线性规划,我们可以使用scipy.optimize中的minmize方法进行求解,注意非线性规划的标准型与上面的线性规划略有不同,对于非线性不等式约束C(x),采用的是等号左侧大于等于右侧

min ⁡ f ( x ) { Aeq ⋅ x = Beq ⁡ C ( x ) ≥ 0 Ceq ⁡ ( x ) = 0 \min f(x)\\ \left\{ \begin{array}{l} {\text {Aeq} \cdot x=\operatorname{Beq}} \\ {C(x) \geq 0} \\ {\operatorname{Ceq}(x)=0} \end{array} \right. minf(x)Aeqx=BeqC(x)0Ceq(x)=0

对应于以上的问题,求解代码如下:

from scipy import  optimize as opt
import numpy as np
from scipy.optimize import minimize
# 目标函数
def objective(x):
    return x[0] ** 2 + x[1]**2 + x[2]**2 +8

# 约束条件
def constraint1(x):
    return x[0] ** 2 - x[1] + x[2]**2  # 不等约束

def constraint2(x):
    return -(x[0] + x[1]**2 + x[2]**2-20)  # 不等约束,注意minimize方法的标准型为左边大于等于右边

def constraint3(x):
    return -x[0] - x[1]**2 + 2        # 等式约束

def constraint4(x):
    return x[1] + 2*x[2]**2 -3           # 等式约束

# 边界约束
b = (0.0, None)
bnds = (b, b ,b) 

con1 = {'type': 'ineq', 'fun': constraint1}
con2 = {'type': 'ineq', 'fun': constraint2}
con3 = {'type': 'eq', 'fun': constraint3}
con4 = {'type': 'eq', 'fun': constraint4}
cons = ([con1, con2, con3,con4])  # 4个约束条件

# 计算
x0=np.array([0, 0, 0])
solution = minimize(objective, x0, method='SLSQP', \
                    bounds=bnds, constraints=cons)
x = solution.x

print('目标值: ' + str(objective(x)))
print('答案为')
print('x1 = ' + str(x[0]))
print('x2 = ' + str(x[1]))
print('x3 = ' + str(x[2]))

  1. 非线性项即为不满足叠加原理的项,例如: x 2 , 1 x , log ⁡ 2 ( x ) x^2,\dfrac{1}{x},\log_2(x) x2,x1,log2(x),他们均为非线性项。 ↩︎

  • 14
    点赞
  • 95
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
共有30章。集合所有算法。蒙特卡罗算法(该算法又称随机性模拟算法,是通过计算机仿真来解决问题算法,同时可以通过模拟可以来检验自己模型的正确性,是比赛时必用的方法) 2.数据拟合、参数估计、插值等数据处理算法(比赛中通常会遇到大量的数据需要处理,而处理数据的关键就在于这些算法,通常使用Matlab作为工具) 3.线性规划、整数规划、多元规划、二次规划规划问题(建模竞赛大多数问题属于最优化问题,很多时候这些问题可以用数学规划算法来描述,通常使用Lindo、Lingo软件实现) 4.图论算法(这类算法可以分为很多种,包括最短路、网络流、二分图等算法,涉及到图论的问题可以用这些方法解决,需要认真准备) 5.动态规划、回溯搜索、分治算法、分支定界等计算机算法(这些算法算法设计中比较常用的方法,很多场合可以用到竞赛中) 6.最优化理论的三大非经典算法:模拟退火法、神经网络、遗传算法(这些问题是用来解决一些较困难的最优化问题算法,对于有些问题非常有帮助,但是算法实现比较困难,需慎重使用) 7.网格算法和穷举法(网格算法和穷举法都是暴力搜索最优点的算法,在很多竞赛题中有应用,当重点讨论模型本身而轻视算法的时候,可以使用这种暴力方案,最好使用一些高级语言作为编程工具) 8.一些连续离散化方法(很多问题都是实际来的,数据可以是连续的,而计算机只认的是离散的数据,因此将其离散化后进行差分代替微分、求和代替积分等思想是非常重要的) 9.数值分析算法(如果在比赛中采用高级语言进行编程的话,那一些数值分析中常用的算法比如方程组求解、矩阵运算、函数积分等算法就需要额外编写库函数进行调用) 10.图象处理算法(赛题中有一类问题与图形有关,即使与图形无关,论文中也应该要不乏图片的,这些图形如何展示以及如何处理就是需要解决的问题,通常使用Matlab进行处理)
### 回答1: 《司守奎数学建模算法与应用pdf》是一本介绍数学建模算法与应用的参考书籍。司守奎是一位数学建模专家,他在这本书中详细讲解了各种数学建模的方法和算法,并给出了一些实际应用的案例。 这本书分为多个章节,每个章节都涵盖了一个特定的数学建模领域。其中包括线性规划、非线性规划、整数规划、动态规划、图论、网络流、模糊数学、随机数学等。在每个章节中,司守奎都详细解释了每个方法的原理和应用范围,并给出了具体的例子和算法步骤。 这本书的优点是它既提供了坚实的理论基础,又注重实际应用。司守奎通过大量的实际案例,展示了如何使用这些数学建模方法解决实际问题。这些案例涵盖了各个领域,包括工程、经济、生物、环境等。读者可以通过学习这些案例,了解如何将数学模型应用于实际问题,并从中获得启发。 另外,这本书还包含了一些习题和实践项目,可以帮助读者巩固所学的知识,并且提供了一些扩展阅读的参考资料,帮助读者进一步深入学习。 总的来说,《司守奎数学建模算法与应用pdf》是一本综合性的数学建模参考书籍,适合对数学建模感兴趣的读者阅读。无论是想学习数学建模的基础知识,还是希望深入了解数学建模的高级方法和应用,这本书都能为读者提供很好的帮助。 ### 回答2: 《司守奎数学建模算法与应用pdf》是一本介绍司守奎数学建模算法及其应用的pdf版本的书籍。数学建模是一门通过数学方法解决实际问题的学科,而司守奎则是该领域的著名专家。 在这本书中,司守奎详细介绍了一些常用的数学建模算法,包括线性规划、非线性规划、整数规划、图论等等。他通过具体的例子和实际案例,讲解了这些算法的原理和应用。 同时,书中还介绍了一些常用的数学建模工具和软件,如Matlab、Mathematica等,以及一些编程语言如Python、C++等的使用。这些工具和软件可以辅助进行数学建模,并提高建模的效率和准确性。 此外,书中还讨论了数学建模在不同领域的应用,如经济学、管理学、环境科学等。通过这些实际案例,读者可以了解到数学建模的实际应用,以及如何将数学建模与实际问题相结合,解决复杂的实际问题。 总的来说,《司守奎数学建模算法与应用pdf》是一本介绍数学建模算法及其应用的权威性著作,对于对数学建模感兴趣的读者来说,是一本非常有价值的参考书。 ### 回答3: 《司守奎数学建模算法与应用pdf》是一本关于数学建模算法与应用的电子书。司守奎教授是中国数学建模领域的权威专家,他在这本书中介绍了数学建模的基本知识、常用算法和实际应用。 这本书的内容主要分为两部分。第一部分是关于数学建模的基本知识和方法。作者首先介绍了数学建模的基本概念和步骤,包括问题理解、问题抽象、模型建立和模型求解等。然后,他详细介绍了常用的数学建模方法和技巧,如线性规划、整数规划、图论、动态规划等。通过这些方法和技巧,读者可以学习如何将实际问题转化为数学模型,并利用计算机进行求解。 第二部分是关于数学建模的实际应用。作者通过具体的案例,展示了数学建模在各个领域的广泛应用,如交通规划、资源分配、风险评估等。每个案例都包括问题描述、模型建立和求解过程等,读者可以通过学习这些案例,更好地理解数学建模的实际应用。 这本电子书有以下几个特点。首先,作者的讲解通俗易懂,适合初学者阅读。其次,书中包含大量的例题和习题,读者可以通过实践提高自己的建模能力。最后,书中提供了一些常用的建模软件和工具,如MATLAB、Excel等,读者可以通过这些软件进行实际的建模和求解操作。 综上所述,《司守奎数学建模算法与应用pdf》是一本介绍数学建模基本知识、算法和实际应用的电子书。通过学习这本书,读者可以提高自己的数学建模能力,并应用到实际问题中。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值