数学建模(1)线性规划模型
本文最后更新于 2025年9月19日 星期五 10:48
此处分享数模学习笔记。Anaconda 下载地址。安装时,记得勾选环境变量。
线性规划模型[1]
矩阵的相关运算
1 | |
求一次方程组的解
主要通过 scipy sympy numpy 这三个库就能实现各种各样的一次方程组求解。sympy 主要用于符号解,numpy 和 scipy 主要用于数值解。
1 | |
- 输出:
1 | |
求线性规划的解
定义:在线性等式和不等式约束下,最小化/最大化线性目标函数。
\[ \begin{gather} \min_{\mathbf x}{\mathbf c^\intercal\mathbf x} \\ \text{s.t.} \begin{cases} \mathbf A\mathbf x \leq \mathbf b \\ \mathbf A_{eq}\mathbf x = \mathbf b_{eq}\\ \mathbf{l}_{\mathbf b} \leq\mathbf x\leq \mathbf u_{\mathbf b} \end{cases} \end{gather} \]
其中 \(\mathbf c\) 为价值向量,\(\mathbf b\) 为资源向量,\(\mathbf x\) 为决策变量的向量,\(\mathbf A\),\(\mathbf A_{eq}\) 分别为不等式约束和等式约束对应的矩阵。
- 例 1:求解
\[ \begin{gather} \max_{\mathbf x}z=4x_1+3x_2 \\ \text{s.t.} \begin{cases} 2x_1+x_2 \leq 10 \\ x_1+x_2\leq 8 \\ x_2\leq 7 \\ x_1,x_2\geq0 \end{cases} \end{gather} \]
1 | |
其他代码:
1 | |
Python 方面
我们运用到:
1 | |
其中
- c:【一维数组】线性目标函数的系数
- A(可选):【二维数组】不等式约束矩阵,\(\mathbf A_{ub}\) 的每一行指定\(x\)上的线性不等式约束的系数
- b(可选):【一维数组】不等式约束向量,每个元素代表\(\mathbf A_{ub}x\) 的上限
- A*eq(可选):【二维数组】等式约束矩阵,\(\mathbf A*{eq}\) 的每一行指定\(x\)上的线性等式约束的系数
- b*eq(可选):【一维数组】等式约束向量,\(\mathbf A*{eq}x\) 的每个元素必须等于\(\mathbf b_{eq}\) 的对应元素
- bounds(可选):【\((min, max)\)序列对】定义决策变量\(x\)的最小值和最大值
- None:使用 None 表示没有界限,默认情况下,界限为\((0,None)\)(所有决策变量均为非负数)。
- 如果提供一个元组\((min, max)\),则最小值和最大值将用作所有决策变量的界限。
- method(可选):【字符串】
{'interior-point', 'revised simplex', 'simplex'},三种算法可选- callback(可选):调用回调函数,等待被调用的参数,如果提供了回调函数,则算法的每次迭代将至少调用一次。回调函数必须接受单个 scipy.optimize.OptimizeResult 由以下字段组成:
- https://blog.csdn.net/weixin_45288557/article/details/109139303
解
\[ \begin{gather} \max \ z=2x_1+3x_2-5x_3 \\ \text{s.t.} \begin{cases} 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 & \geq 0 \end{cases} \end{gather} \]
- 注意:求解 max
则取负的
-c。约束处小于等于取正,大于等于取负。
1 | |
- 输出:
1 | |
- con:【一维数组】等式约束的残差(名义上为 0)\(\mathbf b_{eq}-\mathbf A_{eq}\mathbf x\)
- fun:【浮点数】目标函数的最佳值(\(\mathbf c^T\mathbf x\))
- message:【字符串】算法退出状态的字符串描述符
- nit:【整数】在所有阶段中执行的迭代总数
- slack:【一维数组】不等式约束的松弛值(名义上为正值)\(\mathbf b-\mathbf{Ax}\)
- status:【整数】算法退出状态,
0优化成功终止,1达到迭代限制,2问题似乎不可行,3问题似乎不收敛,4遇到数值困难- success:【布尔值】当算法成功找到最佳解决方案时为
True- x:【一维数组】在满足约束的情况下将目标函数最小化的决策变量的值。
2.35900788e-10由于精度问题,可视为0。
可以转化为线性规划的问题
解
\[ \begin{gather} \min \ z=\left|x_1\right|+\left|x_2\right|+\dots+\left|x_n\right| \\ \text{s.t.}\ \mathbf A\mathbf x\leq\mathbf b \end{gather} \]
令 \(u_i=\frac{\left|x_i\right|+x_i}{2}\geq0\),\(v_i=\frac{\left|x_i\right|-x_i}{2}\geq0\),则将问题转化为
\[ \begin{gather} \min \ \sum_{i=1}^n\left(u_i+v_i\right) \\ \text{s.t.} \begin{cases} \mathbf A\left(\mathbf u-\mathbf v\right)\leq \mathbf b \\ \mathbf u, \mathbf v\geq0 \end{cases} \end{gather} \]
例:
\[ \begin{gather} \min \ z=\left|x_1\right|+2\left|x_2\right|+3\left|x_3\right|+4\left|x_4\right| \\ \text{s.t.} \begin{cases} x_1-x_2-x_3+x_4\leq -2 \\ x_1-x_2+x_3-3x_4\leq -1 \\ x_1-x_2-2x_3+3x_4\leq -\frac{1}{2} \end{cases} \end{gather} \]
化为
\[ \begin{gather} \min \ \begin{pmatrix} 1 & 2 & 3 & 4 \end{pmatrix}\left(\mathbf u+\mathbf v\right) \\ \text{s.t.} \begin{cases} \begin{pmatrix} 1 & -1 & -1 & 1\\ 1 & -1 & 1 & -3\\ 1 & -1 & -2 & 3 \end{pmatrix}\left(\mathbf u-\mathbf v\right)\leq \begin{pmatrix} -2\\ -1\\ -\frac{1}{2} \end{pmatrix} \\ \mathbf u, \mathbf v\geq0 \end{cases} \end{gather} \]
1 | |
补充
【数学建模 之 投资的收益与风险(线性规划)】1998 年全国大学生数学建模竞赛 A 题
参考文献
- 司守奎,孙玺菁. 数学建模算法与应用(第 3 版). ↩︎