2. 线性规划模型的数学形式与标准型

要真正把线性规划用起来,第一步不是急着写代码,而是把现实问题“翻译”成一套统一的数学语言。线性规划模型之所以能被通用算法(如单纯形法、内点法)稳定求解,前提是模型必须落在它规定的形式框架内。本节围绕一般形式、矩阵形式与标准型转化展开,重点讲清楚松弛变量、剩余变量和自由变量这三类“补丁”该怎么加、为什么加,以及模型成立的基本假设与适用边界。

一、一般形式:把目标、约束和符号写清楚

线性规划的一般形式由三部分组成:一个线性目标函数、一组线性约束条件、以及变量的取值限制。设决策变量为 x₁, x₂, …, xₙ,一般形式可写为:

max(或 min) z = c₁x₁ + c₂x₂ + … + cₙxₙ
s.t.  a₁₁x₁ + a₁₂x₂ + … + a₁ₙxₙ ≤(或 =、≥)b₁
      a₂₁x₁ + a₂₂x₂ + … + a₂ₙxₙ ≤(或 =、≥)b₂
      ……
      xⱼ ≥ 0(部分变量可无此限制)

这里要特别注意三点:目标可以是最大化也可以是最小化;约束关系可以是“≤”“=”“≥”中的任意一种,且同一模型中允许混用;变量可以要求非负,也可以允许取负值。正是这种“自由度”,使得一般形式贴近现实,却不利于算法统一处理。因此我们需要一个“标准型”。

二、矩阵形式:把模型压缩成向量与矩阵

当变量和约束数量变多时,逐行书写既冗长又容易出错。用矩阵表达,模型可以压缩为:

max z = cᵀx
s.t.  Ax = b
      x ≥ 0

其中 c 是目标系数列向量,x 是决策变量列向量,A 是 m×n 的约束系数矩阵,b 是右端常数向量。矩阵形式的价值不只是“写得短”:它把模型的结构暴露为“系数矩阵 + 右端项 + 目标向量”三件套,这正是求解器读取模型的标准接口。实际建模时,我们往往先确定 A、b、c 的数值,再交给算法,而不是反复书写代数式。

三、标准型:四个必须满足的条件

线性规划的标准型通常约定为:目标函数求最大值、所有约束均为等式、右端常数 b ≥ 0、所有变量非负。这四个条件不是数学上的唯一选择,而是为了配合单纯形法的表格结构而约定的“通用格式”。任何一般形式都可以通过下面三类变换转化为标准型。

变换一:目标函数统一为 max。若原问题是 min z = cᵀx,令 z′ = −z,则转化为 max z′ = −cᵀx,求出最优值后再取相反数即可。注意:最优解 x 不变,只有目标值符号改变。

变换二:约束不等式化为等式。对“≤”约束,在左端加入一个非负的松弛变量,表示该资源未被用完的余量;对“≥”约束,在左端减去一个非负的剩余变量,表示超出最低要求的部分。两者系数在目标函数中均为 0,因为它们不产生收益,只起“配平”作用。

变换三:处理右端项与变量符号。若某约束右端 bᵢ < 0,两边同乘 −1,同时不等号方向翻转;若变量 xⱼ 无符号限制(自由变量),令 xⱼ = xⱼ′ − xⱼ″,其中 xⱼ′、xⱼ″ ≥ 0,用两个非负变量之差表示原变量。

下面这张图把三类变换的“输入—操作—输出”关系集中呈现出来,便于对照记忆:

一般形式 → 标准型的四类变换 一般形式 目标:max 或 min 约束:≤ / = / ≥ 混用 右端:b 可正可负 变量:可非负或自由 例: min z = 3x₁ + 2x₂ 2x₁ + x₂ ≥ 10 x₁ + 3x₂ ≤ 18 x₁ 自由,x₂ ≥ 0 四类变换 ① 目标统一为 max min z → max z′ = −z ② ≤ 约束加松弛变量 + s,s ≥ 0,目标系数 0 ③ ≥ 约束减剩余变量 − e,e ≥ 0,目标系数 0 ④ 自由变量拆分 x = x′ − x″,x′,x″ ≥ 0 b < 0 时两边乘 −1 并翻转不等号 标准型 目标:max z′ 约束:全部为等式 右端:b ≥ 0 变量:全部 ≥ 0 转化结果: max z′ = −3x₁′ + 3x₁″ − 2x₂ 2x₁′ − 2x₁″ + x₂ − e₁ = 10 x₁′ − x₁″ + 3x₂ + s₂ = 18 x₁′, x₁″, x₂, e₁, s₂ ≥ 0 共 5 个变量、2 个等式约束

四、一个完整的转化示例

仍以上图中的模型为例,逐步走一遍转化过程,帮助理解每一步“为什么加、加在哪”:

  1. 目标转化:原为 min z = 3x₁ + 2x₂,改为 max z′ = −3x₁ − 2x₂,最优值最后取负。
  2. 处理自由变量:x₁ 无符号限制,令 x₁ = x₁′ − x₁″,x₁′, x₁″ ≥ 0。代入后目标变为 −3x₁′ + 3x₁″ − 2x₂。
  3. “≥”约束减剩余变量:2x₁ + x₂ ≥ 10 变为 2x₁′ − 2x₁″ + x₂ − e₁ = 10,e₁ ≥ 0。
  4. “≤”约束加松弛变量:x₁ + 3x₂ ≤ 18 变为 x₁′ − x₁″ + 3x₂ + s₂ = 18,s₂ ≥ 0。

转化后变量数从 2 个增加到 5 个,约束仍为 2 个等式。变量变多并不是“变复杂”,而是把原本隐含的不等式和符号限制显式化,使算法可以在统一的非负等式框架下迭代。需要提醒的是:松弛变量和剩余变量在最优解中的取值有明确含义——松弛变量大于 0 说明该资源有剩余,等于 0 说明资源恰好用尽(约束起作用);剩余变量大于 0 说明“超额完成”了最低要求。这些取值在灵敏度分析和结果解读时非常有用。

五、基本假设与适用边界

线性规划之所以“好用”,是因为它建立在一组较强的假设之上。建模前必须逐条核对,否则模型再漂亮也可能给出误导性结论:

假设含义被违反时的典型表现
比例性目标与约束对每个变量都是线性的,投入产出按固定比例变化存在规模经济、批量折扣、固定成本时,线性关系失真
可加性各变量对目标与约束的贡献可独立相加,互不影响变量间存在耦合、协同或替代效应时不再成立
可分性决策变量可取连续值(实数)变量必须是整数(人数、台数)时,需改用整数规划
确定性系数 c、A、b 均为已知常数参数存在波动或不确定性时,需引入灵敏度分析或随机规划

这四条假设划定了线性规划的适用边界。实际工作中,若发现模型出现“小数个人”“资源投入翻倍但产出不翻倍”等不合理结果,往往不是求解器出错,而是问题本身越出了线性规划的假设范围。此时正确的做法是换模型(整数规划、非线性规划、鲁棒优化等),而不是强行在线性框架里“凑答案”。

建模小建议:转化标准型时,建议先在草稿上列出“原约束—变换类型—新增变量—新约束”的对照表,再统一编号变量。这样既能避免漏加变量,也方便后续把求解结果中的松弛/剩余变量还原回业务含义。