主页 模型库 竞赛 学习中心 工具箱 论文库 前沿 建模空间 AI建模
学习中心 探索专题 数学规划与优化算法 线性规划

本页实验台

  1. 二维可行域
  2. 单纯形路径
  3. 对偶与影子价格
  4. 灵敏度分析
LAB 01

二维可行域

拖动约束直线,实时看可行域形状与最优顶点的移动

问题
工厂有几台机器、几种原料,生产几种产品各赚多少——怎么排产赚最多?这类问题的约束和目标都是线性的,而线性带来一个惊人的性质:最优解一定落在可行域的某个顶点上。
模型
线性规划的标准形,以及"最优解在顶点"的几何事实。
max cTx  s.t.  Ax ≤ b,  x ≥ 0
可行域是若干半空间的交,即一个凸多面体。线性目标在凸多面体上的最大值必在某个极点(顶点)取到——这把一个连续的搜索问题变成了有限个顶点的比较,单纯形法的全部依据就在这里。
最优解 (x*, y*)—
最优值 z*—
最优点上哪几条约束取等—
可行域顶点数—
把 c₁ 从 40 慢慢拖到 70,盯着最优点。它不会连续地滑动,而是在某个时刻"啪"地跳到另一个顶点上。这是线性规划最基本的性质:目标函数是线性的,所以最优值一定在可行域的某个顶点取到(除非目标等值线正好和某条边平行,那时整条边都是最优解,你可以把 c₁ 调到 60、c₂ 调到 30 试试)。顶点只有有限个——这就是单纯形法敢于"只在顶点之间跳"的全部理由。再试试把 b₂ 拖到 200:原来紧绷的那条约束松掉之后,最优点会沿着另一条约束继续往外走,直到撞上新的限制。
LAB 02

单纯形路径

在顶点之间跳,每一步显示当前基与目标值

问题
既然最优解在顶点上,那能不能就沿着棱从一个顶点走到另一个顶点,每次都走到更好的那个?丹齐格 1947 年的单纯形法正是这么做的,而且实践中快得出奇——尽管它的最坏情形是指数的。
模型
单纯形法:每次换一个基变量,沿棱移动到相邻顶点。
检验数 zj − cj < 0 → 该变量进基;  最小比值法定出基变量;  全部检验数 ≥ 0 ⟹ 最优
基是一组线性无关的列,对应一个顶点。Klee–Minty 立方体给出了需要 2n 步的例子,但真实问题里通常只要 2m~3m 步(m 是约束数)。内点法有多项式的最坏界,两者至今并存。
当前顶点 (x₁, x₂)—
当前目标值—
当前基—
走到最优一共几步—
下面那张表就是单纯形表,最后一行是检验数。只要还有负的检验数,就说明把对应的变量抬起来还能让目标变大,于是它入基;比值检验(最小的 b/a)决定谁出基——它保证下一步还留在可行域里。全部检验数非负时就停下,此时的解就是最优解。把 c₁ 调到 20,再在两种规则之间来回切:Dantzig 看检验数,−30 比 −20 更负,于是先抬 x₂,从原点走到 (0, 40);Bland 只看下标,先抬 x₁,走到 (50, 0)。两条路都是两步到最优,但走的是可行域的两侧。Bland 规则的价值不在快,而在它能保证不循环;实践中几乎都先用 Dantzig,真遇上循环再切过去。顺便注意第 0 步在原点:所有松弛变量入基、所有决策变量为 0,这就是"b ≥ 0 时原点天然可行"这个便利条件的用处。
LAB 03

对偶与影子价格

松一点约束,目标值涨多少——影子价格的意义当场量出来

问题
"多给我一小时机器工时,能多赚多少钱?"——这个问题不用重新求解,最优解里已经带着答案了。这就是对偶变量,也叫影子价格,它是线性规划在管理上最常被用到的产出。
模型
对偶问题与强对偶定理。
原问题 max cTx, Ax ≤ b, x ≥ 0 ⟷ 对偶 min bTy, ATy ≥ c, y ≥ 0
强对偶:两者都可行时 cTx* = bTy*
yi 就是第 i 个约束的影子价格:bi 增加一单位,最优值增加 yi。互补松弛条件说明:不起作用的约束影子价格为 0——闲置的资源不值钱。
最优值 z*—
影子价格 y₁ / y₂ / y₃—
再加 1 单位:预测涨幅 / 实测涨幅—
哪几条约束取等—
影子价格就是那条折线在当前位置的斜率,不多也不少。默认参数下 y₁ ≈ 16.67、y₂ ≈ 6.67、y₃ = 0。y₃ 等于零是因为原料还有余量——买再多原料也不会多赚一分钱,这条信息比"原料很重要"这种直觉可靠得多。注意曲线是分段线性且上凸的:在 b₁ = 40 和 b₁ = 160 处有拐点,过了拐点斜率就变,说明"每多一个机器工时值 16.67 元"这句话有有效范围,超出范围就不成立了。现实里这一点常被忽略:用影子价格做决策,必须同时报出它的适用区间。
LAB 04

灵敏度分析

系数在多大范围内变动,最优基不变

问题
模型里的系数都是估出来的,估错一点,最优方案会不会整个翻掉?灵敏度分析回答的是"在多大范围内我的方案还是对的"——这比最优值本身更常被决策者关心。
模型
两类灵敏度:目标系数与右端项的允许变动范围。
目标系数 cj:最优基不变的区间;  右端项 bi:影子价格保持不变的区间
范围内变动,最优基(方案的结构)不变,只有数值变;一旦越界,就要换一个顶点了。注意这是"一次只动一个系数"的分析,多个系数同时变时要用百分之百法则或重新求解。
当前最优顶点—
c₁ 的允许变化范围—
c₂ 的允许变化范围—
相对默认值,最优顶点变了吗—
默认参数下 c₁ 可以在 15 到 60 之间随便动,最优顶点都还是 (40, 20)。这个区间是这么来的:顶点 (40,20) 是约束 ①(斜率 −2)与 ②(斜率 −1/2)的交点,只要目标等值线的斜率 −c₁/c₂ 夹在这两个斜率之间,最优点就不会挪窝——也就是 c₁/c₂ ∈ [0.5, 2],在 c₂ = 30 时就是 c₁ ∈ [15, 60]。右下角那张图把 c₁ 从 0 扫到 100,可以看到 x* 是一条阶梯:在区间内部完全不动,到了端点一步跳过去。这就是为什么灵敏度分析在建模里这么重要——你估的成本系数往往有 ±20% 的误差,但只要落在允许区间内,方案根本不用改。

这一页想说的

线性规划真正值钱的部分往往不是那个最优解,而是围绕它的三样东西:影子价格告诉你该去买哪种资源、最多愿意出多少钱;允许区间告诉你参数估得糙一点要不要紧;紧约束告诉你到底是什么在卡住你。只报一个 z* = 2200 的模型,信息量还不到它能给的三分之一。

接着看

← 返回模块 ← 返回探索专题