2.1 建模四要素:变量、约束、目标、可行域


2.1 建模四要素:变量、约束、目标、可行域

本节摘要:数学建模的规范动作是四步翻译——定决策变量、写约束条件、定目标函数、画出可行域。本节以一家健身餐公司的食谱配比问题为沙盘,完整示范四步翻译法,讲解连续与离散变量、硬约束与软约束、可行域几何三组关键区分,并给出一份可直接套用的建模检查清单。

一句含糊的诉求

健身餐公司的营养师提出需求:"下个月的新品要高蛋白、低成本,还得兼顾口感。"这句话没法直接交给计算机,但它包含了一个模型的所有种子:成本是目标,蛋白含量是约束,口感可以量化为某几种原料的比例上下限。建模师的活,就是把口语逐句翻译成数学。翻译的规范动作有四步,我把它称为四要素:变量(你能改什么)、约束(世界限制什么)、目标(你想优化什么)、可行域(前三者共同圈出的合法方案集合)。

以鸡胸肉、糙米、西兰花三种原料为例。每 100 克的蛋白含量分别是 22、2.6、2.8 克,成本 6、1.2、2 元,新品要求单餐 400 克总重、蛋白不少于 60 克、糙米占比在 30% 到 50% 之间(口感约束)。四步翻译如下:

第一步,变量:设 x1、x2、x3 为三种原料的克数。注意一个关键决定——它们是连续变量(可以取 137.4 克)。原料克数天然连续,但若决策是"采购几箱",就必须声明为整数,那是另一个模型(第 3 章整数规划)。变量类型的选择是建模错误的重灾区。

第二步,约束:总重 x1+x2+x3 = 400(等式约束);蛋白 22x1/100 + 2.6x2/100 + 2.8x3/100 ≥ 60(不等式约束,注意方向);口感 0.3×400 ≤ x2 ≤ 0.5×400(界约束)。第三步,目标:min 6x1/100 + 1.2x2/100 + 2x3/100。第四步,可行域:以上约束在三维空间里围出的多面体碎片——满足全部约束的点集。

import numpy as np from scipy.optimize import linprog # 变量单位换算成百克,数值更干净 c = np.array([6.0, 1.2, 2.0]) # 目标:成本最小 A_ub = np.array([[-22.0, -2.6, -2.8]]) # 蛋白约束取负变成 <= b_ub = np.array([-60.0]) A_eq = np.array([[1.0, 1.0, 1.0]]) # 总重 = 4(百克) b_eq = np.array([4.0]) bounds = [(0, None), (1.2, 2.0), (0, None)] # 糙米 30%-50% 即 1.2-2 百克 res = linprog(c, A_ub=A_ub, b_ub=b_ub, A_eq=A_eq, b_eq=b_eq, bounds=bounds, method="highs") print(np.round(res.x * 100, 1), f"成本 {res.fun:.2f} 元") # 鸡胸约 205.9 克 糙米 120 克 西兰花 74.1 克 成本约 15.93 元

解出来的配比里,糙米压在下限 120 克——口感约束在"顶格"执行。这类信息比解本身更有价值:哪个约束顶格,哪个资源有余量,直接指向"如果要降成本,该去谈判哪个约束"。

三组关键区分

连续与离散。卡车数量、是否开通一条航线、排班的班次——这些只能取整或 0/1 的量,若强行按连续求解再四舍五入,可能得到不可行甚至差很远的解。判断标准很简单:决策的物理载体可不可以无限细分。

硬约束与软约束。总重 400 克是硬的,差一克都不行;"口感偏好"其实可以软——多放点糙米不是世界末日,只是客户满意度下降。软约束的标准处理是罚函数法:把它从约束栏挪到目标里,加一项违反量的加权惩罚:

# 把口感上限放松为软约束:超过 200 克每百克罚 3 元 def soft_cost(x): hard = 6*x[0] + 1.2*x[1] + 2*x[2] over = max(0.0, x[1] - 2.0) return hard + 3.0 * over

罚系数 3 元的含义是"每多 100 克糙米,口感损失折价 3 元"。调这个系数,就是在调业务方嘴上说不出数的那杆秤。

可行域的几何。线性约束围出的可行域是超平面切割出来的多面体。记住一个几何事实:线性目标的极值必出现在多面体的顶点上。单纯形法(第 3 章)之所以快,就是因为它只沿着顶点跳,不扫描内部。而一旦加入整数要求,可行域变成多面体里的一堆离散格点,顶点性质失效,求解难度陡增——这正是 2.2 节复杂性侦察的伏笔。

⚠️ 常见坑:单位不统一。蛋白含量按"每 100 克"、成本按"每公斤"、变量按"克"混在一个模型里,解会荒谬地便宜或昂贵。动手前先在纸上写一行"变量的单位是什么",能躲掉一大类低级错误。

建模检查清单

交付模型前过一遍:① 每个变量都能说清业务含义与单位;② 每个约束都能指到一条真实规则或物理规律;③ 目标是否真的代表决策者的价值排序(利润还是成本、短期还是长期);④ 变量类型(连续/整数/二值)逐一确认;⑤ 求解后检查哪些约束顶格、哪些松弛,与业务直觉交叉验证。

一个反面案例:被漏掉的约束

某公司做配送中心选址,模型目标最小化运输成本,解出来最优点位落在一个地价低洼区,业务方看了直摇头——原来该区域有政策限制,夜间货车禁行,而这家公司的配送恰好全部在夜间进行。建模者没有问出"夜间配送"这个业务细节,约束栏里就少了这条硬规则,模型内的最优解在现实中直接不可行。返工的代价是一周,而根因只是需求访谈时漏了一个问题。这个案例的教训可以总结成建模访谈的三个必问:决策在什么时间窗口内执行(时间约束)、有没有政策法规或安全红线(合规约束)、执行者是谁、他的操作极限是什么(能力约束)。三问答完,约束栏的遗漏率会大幅下降。另一个技巧是反向验证:拿历史决策的真实数据代入模型,看它是否落在可行域内——历史可行的方案若被模型判为不可行,多半是约束写错了。

本节要点回顾

  • 四步翻译法:变量、约束、目标、可行域,是所有后续模型的统一开题格式;
  • 变量类型是建模第一决策:可细分用连续,不可细分必须取整;
  • 软约束进目标、硬约束进约束栏,罚系数就是偏好价格的数字化;
  • 顶点定理:线性目标的最优解落在可行域顶点,这是单纯形法的几何根基;
  • 顶格约束是诊断信息:它告诉你系统的瓶颈资源在哪。

下一节学两门侦察术:判断可行域这块地形是否凸、估算攻下它需要多少算力。


作者与出处
原作者: 灏天文库
来源:灏天文库
整理: 灏天文库整理
由灏天文库平台收录,内容或由平台用户上传,仅供学习交流
发布者: 作者: 灏天文库 转发
评论区 (0)
U