核心概述

在线性规划标准型下以表格(字典)表示与主元旋转推进基/非基变量替换,依据入/出基与终止判定返回最优解或报告无界/不可行。

原文引述

Description: Standard simplex algorithm for linear programming in standard form (max c·x subject to Ax≤b, x≥0). Uses dictionary (tableau) format with pivot rules (Bland or lex). Handles unbounded/infeasible detection. Time: Exponential worst-case; typically fast in practice Status: tested ——摘自本节点现有英文注释

展开阐述

  • 标准型

    • 输入:最大化 c·x,满足 A·x ≤ b,x ≥ 0。
    • 转化:添加松弛变量 s≥0,使 A·x + I·s = b;基变量为 s,非基变量为 x,目标 max c·x + 0·s。
    • 表格(字典)形式:每行表示一个等式,右侧 RHS,目标行单独记录。
  • 接口(据实现)

    • vector simplex(const vector<vector>& A, const vector& b, const vector& c)
      • 返回最优解向量 x(包含原始变量与松弛变量),或空/特殊值表示无界/不可行。
    • 结构 Simplex:维护 tableau, basic, nonbasic,提供 pivot, isOptimal, isUnbounded 等方法。
  • 核心步骤(字典序单纯形)

    1. 初始化:
      • 构造增广矩阵 [A | I | b] 与目标行 [−c | 0 | 0]。
      • 记录基变量索引(松弛变量)与非基变量索引。
    2. 主元选择:
      • 入基变量:选目标行系数最小的非基变量(负系数,即能增加目标值)。
      • 出基变量:对每个约束行,若入基列系数 > 0,计算 RHS / a_{ij},取最小比值的行(Bland 或字典序规则)。
    3. 旋转变换(pivot):
      • 以 a_{ij} 为主元,将该行归一化(除以 a_{ij}),
      • 用行操作将其他行的该列清零(类似高斯消元)。
      • 更新基/非基变量集合。
    4. 终止条件:
      • 若目标行无非正系数,则当前解最优。
      • 若存在负系数列但所有对应约束行系数 ≤ 0,则问题无界。
    5. 可行性:若初始基不可行(某些 RHS < 0),先用对偶单纯形或两阶段法。
  • 数值与实现注意

    • 浮点精度:使用 EPS 判断零(如 |x|<1e-9);避免除以微小数。
    • 循环防护:Bland 规则(下标最小)或字典序保证有限步终止。
    • 大规模稀疏:可改用内点法或稀疏单纯形(超出模板范围)。
    • 对偶问题:可同时获取对偶解(影子价格),用于灵敏度分析。
  • 输出语义

    • 返回原始决策变量的最优值(x_i),若无可行解则空/NaN;若无界则特殊值(如 INF)。
  • 复杂度

    • 理论指数最坏(Klee–Minty),实际平均 O(mn^2) 次基本操作,m 为约束数,n 为变量数。
  • 使用与注意

    • 输入需化为标准型;≥ 约束需乘 −1 并添加人工变量(两阶段法)。
    • 若目标为最小化,可乘 −1 转为最大化;或用对偶单纯形。
    • 模型规模:适合几百变量/约束;超大规模建议专用求解器。
    • 整数规划:本模板不支持整数约束;需分支定界/割平面等。

关联节点