这次数学建模结束后,我最大的感受不是简单的“累”,而是我真正完整经历了一遍从读题、建模、写代码、做图表、写论文到最终提交的过程。

这次比赛让我意识到,数学建模不是简单找一个模型套进去,也不是写几段代码跑出结果就结束。真正的建模,是把一个现实问题拆成变量、目标函数、约束条件、求解过程、结果解释和政策建议,并最终变成一篇可以被评委读懂、复现、认可的论文。

这次我们的题目是工业投资分配问题:在总投资额不超过 1 万亿元、投资行业数不超过 5 个的条件下,根据 10 个行业的 GDP 增长弹性系数和就业增长弹性系数,确定哪些行业应该投资、每个行业投多少钱,并分析权重变化对投资结构的影响。

我们最终采用的是 “考虑投资容量约束与边际收益递减的 GDP—就业双目标 0-1 混合整数规划模型”。这篇文章主要复盘我们是怎么一步步做出来的。


一、先把题目真正读清楚

刚开始看题的时候,很容易把它理解成一个简单排序问题:哪些行业弹性高,就投哪些。但真正分析后发现,这道题至少有五个核心约束与要求:

  1. 总投资额不能超过 1 万亿元。
  2. 最多只能选择 5 个行业。
  3. 必须权衡 GDP 增长弹性和就业增长弹性两个指标。
  4. 目标是综合考虑二者,而非单一最大化。
  5. 需要分析权重变化对投资结构的影响。

也就是说,这不是一个普通排序问题,而是一个带有行业选择、投资金额分配、双目标权衡和政策情景分析的优化问题

我们把问题抽象成两个核心决策变量:

  • $y_i \in \{0,1\}$:表示第 $i$ 个行业是否被选择投资。
  • $x_i$:表示第 $i$ 个行业的投资金额。

二、不能只做普通加权模型

最基础的做法是加权求和:

$$\max Z = \alpha G(x) + (1-\alpha)E(x)$$

其中 $G(x)$ 表示 GDP 贡献,$E(x)$ 表示就业贡献,$\alpha$ 表示 GDP 权重。

但这个做法有两个致命问题:一是 GDP 和就业的尺度不同,不能直接相加;二是单纯加权和缺少对现实投资规律的刻画。

所以我们做了两个关键处理:

  1. 单目标极值归一化:先分别求出 GDP 和就业的单目标最优值 $G^*$ 和 $E^*$,然后对目标函数进行归一化: $$\hat G(x) = \frac{G(x)}{G^*}, \quad \hat E(x) = \frac{E(x)}{E^*}$$
  2. 引入非线性现实约束:不直接把投资金额看成线性贡献,而是加入投资容量和边际收益递减。

三、引入投资容量约束

现实中,一个行业不是投一点钱就有效,也不是投得越多越好。所以我们设置了两个约束:

  • 最低投资门槛:$x_i \geq L_i y_i$
  • 最大吸收上限:$x_i \leq U_i y_i$

我们在基准模型中设置 $L_i=300$ 和 $U_i=2500$(亿元)。总预算 10000 亿,最多 5 个行业,平均每个行业 2000 亿。上限 2500 亿允许资金向重点行业倾斜但不过度集中,下限 300 亿避免“行业被选中但投资太少”。这让模型更贴近真实政策逻辑。


四、加入边际收益递减(模型核心增强)

现实投资往往存在边际收益递减:前期投入效果明显,追加投资后,单位收益下降。

我们把每个行业的投资 $x_i$ 分成三段:$s_{i1}, s_{i2}, s_{i3}$。 并设置三段容量上限:$\Delta_{i1}=1000, \Delta_{i2}=800, \Delta_{i3}=700$ (三段之和正好为 2500)。 随后设置边际收益折减系数:$r_1=1.00, r_2=0.80, r_3=0.60$。

有效投资定义为:

$$F_i(x_i) = r_1 s_{i1} + r_2 s_{i2} + r_3 s_{i3}$$

这个处理让模型极具现实意义:资金投得越多,边际贡献逐渐下降。


五、建立双目标函数与完整模型

有了有效投资 $F_i(x_i)$ 后,我们构建了相对评价指数:

  • GDP 增长贡献指数:$G(x) = \sum_{i=1}^{10} g_i F_i(x_i)$
  • 就业增长贡献指数:$E(x) = \sum_{i=1}^{10} e_i F_i(x_i)$ (注:$g_i$ 和 $e_i$ 分别为弹性系数,这只是相对比较指数,不代表真实宏观增量。)

最终的 0-1 混合整数规划模型可以概括为:

$$\max Z(\alpha) = \alpha\hat G(x) + (1-\alpha)\hat E(x)$$

约束条件:

  • $\sum_{i=1}^{10} x_i \leq 10000$ (总预算)
  • $\sum_{i=1}^{10} y_i \leq 5$ (最多选5个)
  • $L_i y_i \leq x_i \leq U_i y_i$ (投资上下限)
  • $x_i = s_{i1} + s_{i2} + s_{i3}$ (分段投资)
  • $0 \leq s_{ik} \leq \Delta_{ik} y_i$ (分段容量)
  • $y_i \in \{0,1\}$

六、求解三类政策情景与敏感性分析

建好模型后,我们设置了三类典型政策情景:GDP 优先型 ($\alpha=0.8$)、均衡型 ($\alpha=0.5$)、就业优先型 ($\alpha=0.2$)。

政策情景GDP 归一化贡献就业归一化贡献
GDP 优先型0.99950.8329
均衡型0.90980.9722
就业优先型0.86971.0000

为了全面观察,我们让 $\alpha$ 从 0 到 1 变化(步长 0.05),做了权重敏感性分析。这帮我们看清了在不同宏观经济压力下,投资结构应如何动态调整。数学建模的价值不只是给一个最优解,更是提供一个**“政策分析工具”**。


七、用 Pareto 前沿与理想点法确定最终方案

单纯取 $\alpha=0.5$ 作为均衡方案带有主观性。所以我们做了 Pareto 前沿分析(采用 $\varepsilon$-约束法):

$$\max \hat G(x) \quad \text{s.t.} \quad \hat E(x) \geq \varepsilon$$

随着 $\varepsilon$ 提高,GDP 最大可达水平下降,形成了 Pareto 前沿。

然后我们用理想点距离法选择最终方案。理想点为 $(1,1)$,距离公式为:

$$D = \sqrt{(1-\hat G(x))^2 + (1-\hat E(x))^2}$$

最终我们在 Pareto 有效方案中选择了距离最近的一组,这比拍脑袋选 $\alpha=0.5$ 有说服力得多。


八、稳健性检验与扩展分析

为了防止模型过拟合特定参数,我们对弹性系数进行了 $\pm 10\%$ 的均匀分布随机扰动。模拟 200 次后统计入选频率,找出了“新能源汽车”和“农产品精深加工”这两个核心稳健行业。

此外,由于题目要求是“不超过”1 万亿,我们还做了一个预算效率扩展分析(即给定目标下,最小化总投资)。这提醒我们,在目标达成型政策下,保留财政储备也是一种优解。


九、最大的痛点:不是模型,而是最终交付 (Delivery)

从建模过程看,我们一步步把模型做得很漂亮。但复盘时发现,最大问题出在最终交付环节。

最后提交的 PDF 里出现了摘要段落重复、关键词重复等问题。这说明我们没有把“终稿 PDF 检查”当成一个独立任务。这给我了巨大的教训:

Word 不是最终稿,PDF 才是最终稿。代码结果不是最终成果,论文成品才是最终成果。模型想法不是最终交付,完整可读、可复现、无明显错误的论文才是最终交付。

以后组队,我一定会单独预留时间,像走测试用例一样逐项检查 PDF 排版。


结语与自我反思

这次比赛让我对“慎选队友”有了更具体的理解。数学建模不是“凑三个人”,而是三个人一起完成一个包含模型、代码、图表、排版、审查的复杂工程。

我不想只停留在“知道几个模型名字”的层面。接下来,我要重点恶补运筹学(整数规划、多目标优化、Pareto 最优)、Python 求解器以及学术排版规范。

下一次,我希望自己不只是参与建模,而是能真正主导一个从抽象问题到完美交付的完整项目。