数学建模第三章 函数极值和规划

本节课内容将结合线性规划和numpy库的深度使用,探讨数学建模竞赛中约束条件下如何求最值

线性规划与线性代数

之所以还在中学学过的线性规划,是因为当时还没有新高考,是必考内容,不然现在对这个肯定很陌生。求解这个线性规划最麻烦也最常用的方法是画面区域,然后带入求解。当到了数学建模这里,这样的方法肯定是行不通的,因为约束条件已经不是几个方程那么简单,所以要用到数学工具线性代数。


关于numpy的用法的用法在第一节已经回顾过,就跳过这部分内容


线性规划原理

单纯形法

首先一上来就看的不太懂标准形式,仔细琢磨了一下,大概是先列出极值的方程,然后s.t是约束条件,然后下面是变量的范围 $$ \begin{align} \text{minimize}~&f = c^{\top}x\[0.5em] \text{subject to}~& Ax \leqslant b\ & A_{\text{eq}},x = b_{\text{eq}}\ &l_{b} \leqslant x \leqslant u_{b} \end{align} $$ 其中有个关键要点是如何将不等式转换为方程来求解,引入了一个松弛变量 1.建立初始单纯形表: 将线性规划问题转换为标准形式。 如果存在不等式约束,引入松弛变量将其转换为等式。 构建初始单纯形表,其中包括目标函数的系数、约束条件的系数以及右侧常数项。 2.选择入基变量: 检查目标函数中各变量的系数,选择系数为负的变量作为入基变量候选。 如果所有系数非负,则当前解为最优解。 3.选择出基变量: 对每个入基变量候选,计算其判别比(右侧常数除以对应的入基变量系数),选择最小的正判别比所对应的变量作为出基变量。 如果所有判别比非正,则问题无界,没有最优解。 5.进行行变换: 使用高斯-约当消元法或其他行变换方法,将出基变量的列变换为单位列(即除以出基变量系数,使出基变量系数为1,其他系数为0)。 同时调整其他行的系数,使得出基变量以外的其他变量的系数为0。 6.更新单纯形表: 根据行变换结果更新单纯形表。 迭代: 重复步骤2到步骤5,直到没有负系数的变量可以选为入基变量,这时当前解即为最优解。 解释结果: 如果问题有最优解,单纯形表将显示最优解的值以及每个变量的最优值。 如果问题无界,单纯形法将指出无界性。

内点法

内点法的主要特点是它不像单纯形法那样沿着约束的边界进行迭代,而是在可行域的内部进行搜索。内点法的核心思想是利用障碍函数(Barrier Function)来引导搜索过程。障碍函数是一个随着解接近约束边界而迅速增加的函数,它使得算法在迭代过程中始终保持在可行域的内部,并且随着迭代的进行逐渐逼近最优解。

案例

两道题都用到了线性规划的方法,一个设计求解最大化利润,另一个是求解最小化成本

线性规划建模案例

这几道题思路类似,其中在3.4.3中运用了scipy以外一个新的工具包pulp求解步骤是

LpProblem(name='NoName', sense=LpMinimize)用于定义问题与约束条件 solve(solver=None, **kwargs)用于定义求解方法 LpVariable(name, lowBound=None, upBound=None, cat='Continuous', e=None)用于定义决策变量