基于线性规划的旋转算法求解示例
字数 2446 2025-10-29 11:32:03

基于线性规划的旋转算法求解示例

题目描述

旋转算法(Pivoting Algorithm)是单纯形法的一种几何直观解释,通过迭代调整基变量来逐步逼近线性规划问题的最优解。其核心思想是:在可行域的顶点间进行“旋转”移动,每次移动都沿着目标函数梯度方向改善解的值。本示例问题如下:

最大化

\[ z = 3x_1 + 2x_2 \]

约束条件

\[ x_1 + x_2 \leq 4 \]

\[ 2x_1 + x_2 \leq 5 \]

\[ x_1, x_2 \geq 0 \]

解题步骤

步骤1:标准化问题

引入松弛变量 \(s_1, s_2 \geq 0\),将不等式转为等式:

\[\begin{aligned} x_1 + x_2 + s_1 &= 4 \\ 2x_1 + x_2 + s_2 &= 5 \\ z - 3x_1 - 2x_2 &= 0 \quad (\text{目标函数写成方程形式}) \end{aligned} \]

初始基变量为 \(s_1, s_2\),非基变量为 \(x_1, x_2\),初始解:\(x_1=0, x_2=0, s_1=4, s_2=5, z=0\)

步骤2:选择进基变量

目标函数中系数最负的非基变量对应目标函数提升最快的方向。当前 \(z = 0 + 3x_1 + 2x_2\)\(x_1\) 的系数 \(-3\) 最负(对 \(z\) 贡献最大),故选 \(x_1\) 进基。

步骤3:选择离基变量

计算当前约束下 \(x_1\) 的最大可行值:

  • \(s_1\) 约束:\(x_1 \leq 4/1 = 4\)
  • \(s_2\) 约束:\(x_1 \leq 5/2 = 2.5\)
    取最小值 \(2.5\),对应 \(s_2\) 约束最紧,因此 \(s_2\) 离基。

步骤4:旋转操作(更新方程组)

\(x_1\) 替换 \(s_2\) 作为基变量,通过高斯消元更新方程组:

  1. \(s_2\) 约束(第二行)化为 \(x_1\) 的表达式:

\[ 2x_1 + x_2 + s_2 = 5 \implies x_1 = 2.5 - 0.5x_2 - 0.5s_2 \]

  1. 代入其他方程:
    • \(s_1\) 约束:

\[ (2.5 - 0.5x_2 - 0.5s_2) + x_2 + s_1 = 4 \implies s_1 = 1.5 - 0.5x_2 + 0.5s_2 \]

  • 目标函数:

\[ z - 3(2.5 - 0.5x_2 - 0.5s_2) - 2x_2 = 0 \implies z = 7.5 + 0.5x_2 - 1.5s_2 \]

新方程组:

\[\begin{aligned} s_1 &= 1.5 - 0.5x_2 + 0.5s_2 \\ x_1 &= 2.5 - 0.5x_2 - 0.5s_2 \\ z &= 7.5 + 0.5x_2 - 1.5s_2 \end{aligned} \]

当前解:\(x_1=2.5, x_2=0, s_1=1.5, s_2=0, z=7.5\)

步骤5:迭代检查

目标函数中非基变量 \(x_2\) 的系数为 \(0.5 > 0\),但 \(s_2\) 的系数为 \(-1.5 < 0\),说明增加 \(s_2\) 可提升 \(z\)(因 \(s_2\) 当前为0,增加其值会减少 \(z\) 的负项)。但需注意:\(s_2\) 是松弛变量,增加它不会直接改善解,需检查其他非基变量。实际上,应仅考虑原始变量和松弛变量中系数为负的非基变量。这里 \(s_2\) 系数为负,但其增加受约束限制吗?
重读目标函数:\(z = 7.5 + 0.5x_2 - 1.5s_2\)。若增加 \(s_2\)\(z\) 下降,故不应选 \(s_2\) 进基。但 \(x_2\) 系数为正,可选 \(x_2\) 进基。

步骤6:第二次旋转

  • 进基变量\(x_2\)(系数 \(0.5 > 0\))。
  • 离基变量:从约束中找 \(x_2\) 的极限值:
    • \(s_1\) 约束:\(x_2 \leq 1.5 / 0.5 = 3\)
    • \(x_1\) 约束:\(x_2 \leq 2.5 / 0.5 = 5\)
      取最小值 \(3\),对应 \(s_1\) 离基。
  • 旋转更新
    1. \(s_1\) 约束得:\(x_2 = 3 - 2s_1 + s_2\)
    2. 代入 \(x_1\) 约束:

\[ x_1 = 2.5 - 0.5(3 - 2s_1 + s_2) - 0.5s_2 = 1 + s_1 - s_2 \]

  1. 代入目标函数:

\[ z = 7.5 + 0.5(3 - 2s_1 + s_2) - 1.5s_2 = 9 - s_1 - s_2 \]

新方程组:

\[\begin{aligned} x_2 &= 3 - 2s_1 + s_2 \\ x_1 &= 1 + s_1 - s_2 \\ z &= 9 - s_1 - s_2 \end{aligned} \]

当前解:\(x_1=1, x_2=3, s_1=0, s_2=0, z=9\)

步骤7:终止条件

目标函数中所有非基变量 \(s_1, s_2\) 的系数均非正(均为 \(-1\)),说明当前解已最优,无法进一步改善。

结论

最优解为 \(x_1=1, x_2=3\),最大值 \(z=9\)。旋转算法通过两次基变换(从 \((s_1,s_2)\)\((x_1,s_2)\) 再到 \((x_1,x_2)\))实现了最优顶点的移动。

基于线性规划的旋转算法求解示例 题目描述 旋转算法(Pivoting Algorithm)是单纯形法的一种几何直观解释,通过迭代调整基变量来逐步逼近线性规划问题的最优解。其核心思想是:在可行域的顶点间进行“旋转”移动,每次移动都沿着目标函数梯度方向改善解的值。本示例问题如下: 最大化 \[ z = 3x_ 1 + 2x_ 2 \] 约束条件 \[ x_ 1 + x_ 2 \leq 4 \] \[ 2x_ 1 + x_ 2 \leq 5 \] \[ x_ 1, x_ 2 \geq 0 \] 解题步骤 步骤1:标准化问题 引入松弛变量 \(s_ 1, s_ 2 \geq 0\),将不等式转为等式: \[ \begin{aligned} x_ 1 + x_ 2 + s_ 1 &= 4 \\ 2x_ 1 + x_ 2 + s_ 2 &= 5 \\ z - 3x_ 1 - 2x_ 2 &= 0 \quad (\text{目标函数写成方程形式}) \end{aligned} \] 初始基变量为 \(s_ 1, s_ 2\),非基变量为 \(x_ 1, x_ 2\),初始解:\(x_ 1=0, x_ 2=0, s_ 1=4, s_ 2=5, z=0\)。 步骤2:选择进基变量 目标函数中系数最负的非基变量对应目标函数提升最快的方向。当前 \(z = 0 + 3x_ 1 + 2x_ 2\),\(x_ 1\) 的系数 \(-3\) 最负(对 \(z\) 贡献最大),故选 \(x_ 1\) 进基。 步骤3:选择离基变量 计算当前约束下 \(x_ 1\) 的最大可行值: 从 \(s_ 1\) 约束:\(x_ 1 \leq 4/1 = 4\) 从 \(s_ 2\) 约束:\(x_ 1 \leq 5/2 = 2.5\) 取最小值 \(2.5\),对应 \(s_ 2\) 约束最紧,因此 \(s_ 2\) 离基。 步骤4:旋转操作(更新方程组) 以 \(x_ 1\) 替换 \(s_ 2\) 作为基变量,通过高斯消元更新方程组: 将 \(s_ 2\) 约束(第二行)化为 \(x_ 1\) 的表达式: \[ 2x_ 1 + x_ 2 + s_ 2 = 5 \implies x_ 1 = 2.5 - 0.5x_ 2 - 0.5s_ 2 \] 代入其他方程: \(s_ 1\) 约束: \[ (2.5 - 0.5x_ 2 - 0.5s_ 2) + x_ 2 + s_ 1 = 4 \implies s_ 1 = 1.5 - 0.5x_ 2 + 0.5s_ 2 \] 目标函数: \[ z - 3(2.5 - 0.5x_ 2 - 0.5s_ 2) - 2x_ 2 = 0 \implies z = 7.5 + 0.5x_ 2 - 1.5s_ 2 \] 新方程组: \[ \begin{aligned} s_ 1 &= 1.5 - 0.5x_ 2 + 0.5s_ 2 \\ x_ 1 &= 2.5 - 0.5x_ 2 - 0.5s_ 2 \\ z &= 7.5 + 0.5x_ 2 - 1.5s_ 2 \end{aligned} \] 当前解:\(x_ 1=2.5, x_ 2=0, s_ 1=1.5, s_ 2=0, z=7.5\)。 步骤5:迭代检查 目标函数中非基变量 \(x_ 2\) 的系数为 \(0.5 > 0\),但 \(s_ 2\) 的系数为 \(-1.5 < 0\),说明增加 \(s_ 2\) 可提升 \(z\)(因 \(s_ 2\) 当前为0,增加其值会减少 \(z\) 的负项)。但需注意:\(s_ 2\) 是松弛变量,增加它不会直接改善解,需检查其他非基变量。实际上,应仅考虑原始变量和松弛变量中系数为负的非基变量。这里 \(s_ 2\) 系数为负,但其增加受约束限制吗? 重读目标函数:\(z = 7.5 + 0.5x_ 2 - 1.5s_ 2\)。若增加 \(s_ 2\),\(z\) 下降,故不应选 \(s_ 2\) 进基。但 \(x_ 2\) 系数为正,可选 \(x_ 2\) 进基。 步骤6:第二次旋转 进基变量 :\(x_ 2\)(系数 \(0.5 > 0\))。 离基变量 :从约束中找 \(x_ 2\) 的极限值: \(s_ 1\) 约束:\(x_ 2 \leq 1.5 / 0.5 = 3\) \(x_ 1\) 约束:\(x_ 2 \leq 2.5 / 0.5 = 5\) 取最小值 \(3\),对应 \(s_ 1\) 离基。 旋转更新 : 从 \(s_ 1\) 约束得:\(x_ 2 = 3 - 2s_ 1 + s_ 2\) 代入 \(x_ 1\) 约束: \[ x_ 1 = 2.5 - 0.5(3 - 2s_ 1 + s_ 2) - 0.5s_ 2 = 1 + s_ 1 - s_ 2 \] 代入目标函数: \[ z = 7.5 + 0.5(3 - 2s_ 1 + s_ 2) - 1.5s_ 2 = 9 - s_ 1 - s_ 2 \] 新方程组: \[ \begin{aligned} x_ 2 &= 3 - 2s_ 1 + s_ 2 \\ x_ 1 &= 1 + s_ 1 - s_ 2 \\ z &= 9 - s_ 1 - s_ 2 \end{aligned} \] 当前解:\(x_ 1=1, x_ 2=3, s_ 1=0, s_ 2=0, z=9\)。 步骤7:终止条件 目标函数中所有非基变量 \(s_ 1, s_ 2\) 的系数均非正(均为 \(-1\)),说明当前解已最优,无法进一步改善。 结论 最优解为 \(x_ 1=1, x_ 2=3\),最大值 \(z=9\)。旋转算法通过两次基变换(从 \((s_ 1,s_ 2)\) 到 \((x_ 1,s_ 2)\) 再到 \((x_ 1,x_ 2)\))实现了最优顶点的移动。