尧图建网站 尧图建网站 YAOTU WEB BUILD 免费咨询
ARTICLE DETAIL

资讯详情

深耕网站建设与建站编程的一线实战洞察。

人工变量法第二次迭代详解:从单纯形表到最优解判定

人工变量法第二次迭代详解:从单纯形表到最优解判定 1. 项目概述从“硬凑”到“真解”的人工变量法实战在运筹学的线性规划求解里单纯形法是个核心工具但它的启动有个前提你得先找到一个“初始基本可行解”。这就像开车你得先打着火。可现实中的很多线性规划模型特别是“≥”型约束或者等式约束它们的标准形式里并不天然包含一个现成的单位矩阵作为初始基。这时候直接点火是点不着的。怎么办老司机们发明了一个巧妙的“助燃剂”——人工变量法。今天我就以一个具体的案例带大家走一遍人工变量法中第二次迭代的完整过程。这不仅仅是套公式更是理解算法如何一步步剔除“水分”人工变量逼近真实最优解的关键。我们这次聚焦的正是从第一次迭代进入第二次迭代的那个转折点。第一次迭代后我们可能还在和人工变量纠缠目标函数值也掺着“惩罚项”的假象。第二次迭代往往是决定人工变量能否被赶出基变量、求解能否回归正轨的关键一步。这个过程涉及到中心元变换、检验数重算、最优解再判定以及新一轮的入基/出基变量选择。很多教材讲得比较理论我结合自己当年踩过的坑和教学中的反馈把每一步的“为什么”和“怎么操作”掰开揉碎了讲尤其是检验数计算这个容易迷糊的地方我会用两种视角来解读保证你不仅能跟着做对更能理解背后的逻辑。2. 案例回顾与第二次迭代起点设定为了不让大家迷失在抽象的符号里我们沿用一个人工变量法的经典教学案例也是很多实际资源分配问题的简化模型。假设我们的线性规划问题标准化后是这样的目标函数Min:Z 4x₁ x₂ 0x₃ 0x₄ M R₁ M R₂约束条件:3x₁ x₂ x₃ 34x₁ 3x₂ - x₄ R₁ 6x₁ 2x₂ R₂ 4x₁, x₂, x₃, x₄, R₁, R₂ ≥ 0其中x₃是松弛变量x₄是剩余变量前面带了负号R₁和R₂就是我们为了构造初始基而引入的人工变量。M是一个巨大的正数惩罚系数意味着在目标函数里我们希望尽可能快地把人工变量的值降到0。经过第一次迭代初始单纯形表构建和第一次换基我们通常会得到一张更新后的单纯形表。假设第一次迭代后我们选择的入基变量是x₁出基变量是R₁具体计算过程略这是第一次迭代的内容那么迭代后的表格可能如下所示这是本次第二次迭代的起点请务必理解基变量右端项 (b)x₁x₂x₃x₄R₁R₂x₃3/20-5/413/4-3/40x₁3/213/40-1/41/40R₂5/205/401/4-1/41检验数 σⱼZ65M/201-5M/40-13M/4M0注意这个表格是假设的第一次迭代结果用于演示第二次迭代。实际数字可能因第一次迭代时中心元选择不同而有差异但结构相似。关键点在于1. 人工变量R₁已出基值为0但R₂仍在基中且值为5/2。2. 目标函数值Z包含惩罚项M。3. 检验数中仍含有M。我们的任务很明确从这个状态出发进行第二次迭代目标是让另一个人工变量R₂也出基并最终得到所有检验数非负最小化问题的最优解。3. 第二次迭代详解五步闭环操作3.1 最优解判定与入基变量选择首先我们审视当前解是否最优。对于最小化问题最优解的判定标准是所有检验数σⱼ ≥ 0。看上面表格最后一行检验数σ(x₂) 1 - 5M/4σ(x₄) -1 3M/4σ(R₁) M由于M是很大的正数1 - 5M/4和-1 3M/4的符号由M项主导。因为5M/4 1所以1 - 5M/4 0。同理3M/4 1所以-1 3M/4 0。所以检验数σ(x₂)为负数。结论当前解非最优。需要选择检验数为负的变量作为入基变量以改善目标函数。这里只有σ(x₂)为负因此入基变量确定为 x₂。实操心得在人工变量法阶段判断检验数符号时可以快速用“M主导”原则。只要M的系数是正的且足够大该项就是很大的正数M的系数是负的该项就是绝对值很大的负数。这比具体计算数值更快。3.2 出基变量选择最小比值原则入基变量x₂确定后我们要决定当前基变量x₃, x₁, R₂中哪一个要离开给x₂腾位置。依据是最小非负比值原则用右端项(b)的值除以入基变量x₂在对应约束行中的系数主元列系数取比值最小且非负的那一行对应的基变量出基。计算比值θ对于基变量x₃所在行系数a₃₂ -5/4 0。规则系数为负或零时不计算比值或认为比值无穷大因为增加x₂不会减少x₃无法驱动x₃离基。对于基变量x₁所在行系数a₁₂ 3/4 0比值 θ₁ b₁ / a₁₂ (3/2) / (3/4) 2。对于基变量R₂所在行系数aᵣ₂ 5/4 0比值 θ₂ bᵣ / aᵣ₂ (5/2) / (5/4) 2。这里出现了比值相等的情况θ₁ θ₂ 2。根据单纯形法的标准处理可以任选其一。但这里有一个重要的策略考量我们迫切希望人工变量R₂出基。因此优先选择比值相同的人工变量行作为出基行。这能加速将人工变量剔出基外。所以选择出基变量为 R₂。对应的中心元就是出基变量R₂行与入基变量x₂列交叉的那个元素aᵣ₂ 5/4。避坑指南最小比值原则计算时一定要忽略系数为非正数的行。如果所有系数都非正则问题无界目标函数值可无限减小。当比值相同时选择人工变量出基是常用且有效的策略。如果都是结构变量则可以任选或按行顺序选择有时会影响迭代次数但不影响最终结果。3.3 中心元变换高斯-约当消元这是迭代的核心计算步骤目的是让入基变量x₂在其对应的列中变成一个单位向量即中心元变为1该列其他元素变为0从而使其进入基变量组。我们的中心元是5/4。变换步骤如下Step 1: 将中心元所在行出基行除以中心元值使中心元变为1。出基行原为[R₂ | 5/2 | 0 | 5/4 | 0 | 1/4 | -1/4 | 1] 除以 (5/4) 得到新行此时基变量由R₂变为x₂[x₂ | 2 | 0 | 1 | 0 | 1/5 | -1/5 | 4/5]Step 2: 用消元法将中心元所在列x₂列的其他行元素变为0。针对x₃行原行 [x₃ | 3/2 | 0 | -5/4 | 1 | 3/4 | -3/4 | 0] 要消去x₃行的x₂列系数(-5/4)。我们将新的x₂行乘以(5/4)然后加到原x₃行上。 计算新x₂行 × (5/4) [0 | 5/2 | 0 | 1 | 1/4 | -1/4 | 1] 原x₃行 上式 [x₃ | (3/25/2)4 | 0 | (-5/45/4)0 | 1 | (3/41/4)1 | (-3/4-1/4)-1 | (01)1]新x₃行[x₃ | 4 | 0 | 0 | 1 | 1 | -1 | 1]针对x₁行原行 [x₁ | 3/2 | 1 | 3/4 | 0 | -1/4 | 1/4 | 0] 要消去x₁行的x₂列系数(3/4)。我们将新的x₂行乘以(-3/4)然后加到原x₁行上。 计算新x₂行 × (-3/4) [0 | -3/2 | 0 | -3/4 | 0 | -3/20 | 3/20 | -3/5] 原x₁行 上式 [x₁ | (3/2-3/2)0 | 1 | (3/4-3/4)0 | 0 | (-1/4-3/20)-8/20-2/5 | (1/43/20)8/202/5 | (0-3/5)-3/5]新x₁行[x₁ | 0 | 1 | 0 | 0 | -2/5 | 2/5 | -3/5]Step 3: 更新基变量列。出基变量R₂被入基变量x₂替换。变换后的新单纯形表如下基变量右端项 (b)x₁x₂x₃x₄R₁R₂x₃40011-11x₁0100-2/52/5-3/5x₂20101/5-1/54/5检验数 σⱼ待计算待计算0待计算待计算待计算待计算计算技巧中心元变换本质是初等行变换保持耐心一步一步来。建议在草稿纸上清晰地列出“原行”、“加减倍数×新中心行”、“结果新行”这三列避免心算错误。分数运算时通分要仔细。3.4 检验数计算两种方法检验数需要重新计算。有两种等效的方法我建议都掌握可以互相验证。方法一公式法 σⱼ cⱼ - C_B * Pⱼ其中cⱼ是变量xⱼ在目标函数中的原始系数C_B是当前基变量在目标函数中系数构成的行向量Pⱼ是当前表中变量xⱼ的系数列向量。 当前基变量为 [x₃, x₁, x₂]对应的目标系数 C_B [0, 4, 1]。计算σ(x₁)c₁4, P₁[0,1,0]^T。σ(x₁)4 - [0,4,1][0,1,0]^T 4 - (004110)4-40。计算σ(x₄)c₄0, P₄[1, -2/5, 1/5]^T。σ(x₄)0 - [0,4,1][1, -2/5, 1/5]^T 0 - (01 4*(-2/5) 1*(1/5)) 0 - (-8/51/5)0 - (-7/5)7/5。计算σ(R₁)c_{R₁}M, P_{R₁}[-1, 2/5, -1/5]^T。σ(R₁)M - [0,4,1][-1, 2/5, -1/5]^T M - (0(-1)4*(2/5)1*(-1/5)) M - (8/5 - 1/5) M - 7/5。计算σ(R₂)c_{R₂}M, P_{R₂}[1, -3/5, 4/5]^T。σ(R₂)M - [0,4,1][1, -3/5, 4/5]^T M - (014*(-3/5)1*(4/5)) M - (-12/54/5) M - (-8/5) M 8/5。对于基变量x₃, x₁, x₂其检验数必为0这是单纯形表的一个性质。方法二差额计算法利用变换后的表我们已知变换前的检验数行。中心元变换时检验数行也应同步进行相同的行变换以消去入基变量x₂对应的检验数使其变为0。 变换前检验数行从起点表来[Z65M/2 | 0, 1-5M/4, 0, -13M/4, M, 0] 我们需要消去检验数行中x₂列的系数(1-5M/4)。变换后新的x₂行即中心行为[x₂ | 2 | 0, 1, 0, 1/5, -1/5, 4/5]。 将检验数行减去(1-5M/4)倍的新x₂行。 这个计算量较大但原理清晰。通常在手算时对于非基变量列用方法一更直接对于整个检验数行的更新方法二在理解变换一致性上更有帮助。我们采用方法一的结果更新单纯形表基变量右端项 (b)x₁x₂x₃x₄R₁R₂x₃40011-11x₁0100-2/52/5-3/5x₂20101/5-1/54/5检验数 σⱼZ0007/5M-7/5M8/5目标函数值Z计算Z C_B * b [0, 4, 1] * [4, 0, 2]^T 04 40 1*2 2。 同时由于人工变量R₁和R₂已全部出基值均为0惩罚项M不再影响目标函数值。所以当前Z2是真实的目标函数值。最终完整的第二次迭代后单纯形表为基变量右端项 (b)x₁x₂x₃x₄R₁R₂x₃40011-11x₁0100-2/52/5-3/5x₂20101/5-1/54/5检验数 σⱼZ20007/5M-7/5M8/53.5 新一轮最优解判定我们再次检查检验数行最后一行。对于最小化问题σ(x₄) 7/5 0σ(R₁) M - 7/5。由于M是很大的正数M - 7/5 0。σ(R₂) M 8/5 0。其余非基变量检验数均为0或正数。结论所有检验数σⱼ ≥ 0。满足最小化问题的最优解判定条件。同时我们发现所有人工变量R₁和R₂都已不在基变量中且当前解x₁0, x₂2, x₃4, x₄0满足所有原始约束代入验证即可。因此我们得到了原问题的最优基本可行解。最优解为x₁* 0, x₂* 2。最优目标函数值为Z* 40 12 2。4. 关键点解析与常见问题排查4.1 为什么人工变量法需要大M引入大M是为了在目标函数中“惩罚”人工变量。对于最小化问题加上M*Rᵢ意味着只要Rᵢ0目标函数值就会变得巨大单纯形法为了最小化Z就会优先驱动这些人工变量变为0出基。如果最终最优解中人工变量仍大于0说明原问题无可行解约束条件自相矛盾。注意事项在计算机求解时大M需要取一个足够大的数值但又不是无穷大。如果M太小可能无法起到惩罚作用如果太大在数值计算中可能引发舍入误差误判检验数符号。实践中软件常使用两阶段法来避免直接设定M值。4.2 检验数计算错误的高发区检验数计算错误是人工变量法手算中最常见的问题。混淆最大化与最小化的最优判定标准最大化问题是σⱼ ≤ 0最优最小化问题是σⱼ ≥ 0最优。务必先明确问题类型。忽略M的符号主导作用在包含M的检验数表达式中如1-5M/4当M足够大时符号完全由含M的项决定。快速判断时不用精确计算具体数值直接看M的系数正负即可。基变量检验数不为0如果计算发现某个基变量的检验数不为0几乎可以肯定是之前的中心元变换或检验数更新步骤出了错需要回溯检查。4.3 迭代停滞与退化现象有时你会遇到最小比值相同的情况非人工变量或者迭代后目标函数值没有改善。这可能是退化现象一个或多个基变量取值为0。在比值相同时不同的出基选择可能导致算法在几个基可行解之间循环理论上可能实际很少见。应对策略是采用“勃兰特规则”等摄动法思想比如总是选择下标最小的变量入基或出基。在我们的案例中比值相同发生在人工变量和结构变量之间优先驱赶人工变量出基是一个明确且正确的策略避免了可能的冗长迭代。4.4 从第二次迭代看算法收敛第二次迭代在这个案例中恰好找到了最优解。这展示了人工变量法的一个理想流程通过引入人工变量启动经过有限次迭代通常1到n次将所有人工变量逐出基然后就在原始问题的可行域内进行单纯的优化直至最优。第二次迭代的成功关键在于正确选择了检验数为负且能使人工变量离基的入基变量并通过中心元变换实现了基的替换和检验数的优化。5. 手工计算与软件求解的桥梁理解虽然现在有LINDO、Lingo、Excel规划求解等工具可以秒解线性规划但手工演练人工变量法的每一步尤其是第二次迭代这样的关键步骤价值巨大。这能帮你深刻理解单纯形法的“换基”本质就像更换团队的骨干成员每次迭代都是用一个有潜力改善目标的新变量入基替换一个贡献已达瓶颈的旧变量出基。调试模型当软件报错“无可行解”或“无界解”时你能通过理解人工变量的去向是否无法驱离或检验数的特征快速定位是约束矛盾还是目标函数设置问题。理解两阶段法人工变量法大M法在理论上是两阶段法的前身。第一阶段的目标就是最小化所有人工变量之和这等价于给人工变量赋予一个极大的惩罚系数M。手工算过你就能明白两阶段法为什么要分两步走。我自己在最初学习时曾机械地套用公式直到在一次项目建模中软件结果与预期不符。回头检查发现是一个约束条件的方向设反了导致人工变量无法离基。正是对手工算法步骤的熟悉让我快速找到了这个建模错误。所以别把这些迭代计算看成枯燥的数学练习它是你构建和诊断优化模型的内功。
返回列表