大学生建模比赛入门——线性规划

一、快速了解线性规划

        线性规划是源于工业生产组织管理的决策问题,在数学中用来确定多变量函数在变量满足线性约束条件下的最优值。线性规划模型通常由三个要素组成——决策变量、目标函数及约束条件。

决策变量:决策者为了达到预定目标而要控制的那些变量。在问题求解过程中咱们就是要寻找决策变量的取值。

目标函数:决策变量的线性函数描述决策变量与预定目标间的关系。

约束条件:描述决策变量在哪些范围内有意义。


二、线性规划的数学形式

max(min)z= \sum_{j=1}^{n}c_jx_j

s.t.\begin{cases} & \text{}\sum_{j=1}^{n}a_ijx_j\leq (\geq ,= )b_j ,i=1,2,\cdots, m,\\ & \text{ } x_j\geq0,j=1,2,\cdots,n \end{cases}

        上式(1)是目标函数,(2)是约束条件。从上述模型可以看出,线性规划的目标函数可以是最大化问题,也可以是最小化问题。约束条件可以是“\leq”,也可以是“=”或“\geq”。在现实生活中,决策变量可以是非负的,可以是非正的,甚至是无约束的(即可以取任意值)。


三、利用Python求解线性规划问题

        在Python中我们使用Scipy库中scipy.optimize模块中的linprog函数进行线性规划问题的求解。这个函数集中了求解线性规划的常用算法,单纯形法、内点法,我们可以自行选择。

        Scipy中线性规划模型的标准形式为:

min \ z=c^Tx,

s.t.\begin{cases} & \text A*x\leq b ,\\ & \text Aeq*x=beq,\\ & \text Lb\leq x \leq UB. \end{cases}

        linprog的基本调用格式:

from scipy.optimize import linprog
res=linprog(c,A,b,Aeq,beq,bounds,method) # bounds默认是(0,+∞),可以根据需求更改;A,Aeq均为二维数组
print(res.fun) # 输出目标函数最小值
print(res.x) # 输出最优解

四、例题

求解下列线性规划问题

max \ z=x_1-2x_2-3x_3

s.t. \ \begin{cases} & \text -2x_1+x_2+x_3 \leq 9, \\ & \text -3x_1+x_2+2x_3 \geq 4,\\ & \text 4x_1-2x_2-x_3=-6,\\ & \text x_1 \geq-10,\ x_2 \geq0 \end{cases}

from scipy.optimize import linprog
c=[-1,2,3];A=[[-2,1,1],[3,-1,-2]];b=[9,-4];Aeq=[[4,-2,-1]];beq=[-6];bounds=[[-10,None],[0,None],[None,None]]
res=linprog(c,A,b,Aeq,beq,bounds)
print("目标函数最大值为:-",res.fun)
print("最优解为:",res.x)

你可能感兴趣的:(数学建模基础,算法,数学建模,python)