Python中的单纯形算法2025年1月5日 | 18 分钟阅读 单纯形算法是解决线性规划问题的著名方法。在线性规划中,你通常有一个目标,比如最大化或最小化某个东西,以及一组约束条件。这些约束通常以方程的形式表示。 例如,假设你想在遵守某些规则的情况下最大化 x1 + x2,比如 x1 + x2 + x4 等于 8,以及 2x1 + x2 + x3 等于 10。 现在,当你使用单纯形算法来解决这个问题时,你需要采取一些初始步骤。这些步骤涉及将你的信息组织成矩阵。
因此,在上述问题中,我们关注的是在单纯形算法的第 0 次迭代中建立矩阵 A。 ![]() 表 B 解释: 标记为“B”的表作为基础,包含了单纯形算法开始时使用的基变量。这些基变量被选择以在开始时形成一个单位矩阵。在给定的例子中,“x4”和“x3”组合成一个 2x2 的单位矩阵。 CB: 这代表目标函数中基变量的系数。如果目标函数不包括“x4”和“x3”,它们的系数被视为 0。 XB: 这代表资源数量,或者换句话说,是约束条件的右侧(RHS)。 yi: 这指的是完整的矩阵 A。 实质上,表 B 通过选择形成单位矩阵的基变量来帮助单纯形算法启动,而 CB 表示这些变量在目标函数中的系数。同时,XB 与约束条件的右侧相关联,yi 代表整个矩阵 A。 用于优化问题的单纯形算法 想象你正在尝试解决一个问题,比如最大化利润或最小化成本。单纯形算法是一种帮助你一步步找到最佳解决方案的方法。 步骤 1:开始 我们从一些组织在我们称之为“单位矩阵”中的基本信息开始。它就像一个基础。 步骤 2:计算数字 接下来,我们进行一些计算来了解情况如何。我们是在赚更多钱还是花更少钱?我们想看看我们是否在正确的轨道上。 如果我们试图最大化某样东西(比如利润),并且我们看到我们所做的一切都在让我们亏钱,那么我们就停止。我们已经找到了我们能找到的最佳解决方案。 如果我们试图最小化某样东西(比如成本),并且我们所做的一切都在让事情变得更昂贵,那么我们就停止。我们已经得到了最佳解决方案。 步骤 3:寻找改进空间 现在,假设事情并不完美。我们想赚更多钱或花更少钱,对吧?所以,我们查看我们的数字,看看哪个行动会给我们带来最大的提升。 步骤 4:为改进腾出空间 为了实现那个大的改进,我们有时需要稍微重新安排我们的计划。我们不能直接跳进去改变一切。所以,我们做一种叫做“最小比率检验”的事情。这个检验帮助我们决定应该改变我们计划的哪个部分。 步骤 5:修正计划 我们现在准备做一些改变,但我们不想搞乱我们的组织结构。所以,我们确定一个“主元元素”和“主元行”。这帮助我们专注于需要改进的部分。 步骤 6:让一切重回正轨 最后,我们调整数字,使它们变得合理。我们希望在我们的改变之后,一些数字是“1”,另一些是“0”。这让我们的计划保持整洁和有序。 所以,这就是单纯形算法的工作原理。它帮助我们一步步地找到问题的最佳解决方案,并在此过程中调整我们的计划。 在第一轮计算(迭代 1)中,我们正在研究一些与利润相关的数学值。这可能听起来有点复杂,但别担心,我会为你分解说明。 ![]() 首先,我们必须计算出一种叫做“相对利润”的东西。这涉及到一些数字,C1、C2、C3 和 C4,还有 Z1、Z2、Z3 和 Z4。我们做了一些数学计算来找到这些相对利润。最后,我们得到的结果是:1、1、0 和 0。你可以在表格中看到它们。 现在,有趣的部分是,并非所有这些相对利润都小于或等于 0。因此,我们需要进入下一轮计算。 在下一步中,我们必须决定哪些东西进入我们的计算,哪些东西离开。我们发现最大的相对利润是 1(在索引 1 处),所以我们决定将它包括进来(我们称之为 x1)。 现在,有一种叫做“最小比率检验”的方法,我们比较两个数字:8/1 和 10/2。这两个数字中较小的是 5(在索引 2 处),所以我们决定让一个叫做 x3 的东西离开我们的计算。 随着 x1 进入和 x3 离开,我们必须做更多的数学计算来使一切正常工作。我们想要创建一个叫做“单位矩阵”的东西。这涉及到将第二行除以 2,然后从第一行中减去第二行的一倍。 所以,这就是我们在迭代 2 中所做的。这都是一个更大过程的一部分,我们通过处理这些表格来解决一个问题。 ![]()
![]() 文章还提到了两种可能的结果 情况 1:无界解 - 当问题的特定部分中的数字不适合计算时,就会发生这种情况。这就像试图解决一个没有答案的谜题。 情况 2:替代解 - 有时,问题可以有多个好的解决方案。这就像有不同的方式到达同一个目的地。这被称为“替代解”。 所以,简单来说,这篇文章正在解释一种通过计算一些数字并进行调整直到找到最佳答案来找到问题最佳解决方案的数学方法。有时,可能会有一个以上的好答案,或者问题可能没有解决方案。 示例 2:上面的例子是一个等式情况,我们能够找到初始基。现在我们将对一个没有形成单位矩阵的例子执行单纯形法。 最大化 2x₁ + 5x₂,约束条件为 x₁ + x₂ ≤ 6, x₂ ≤ 3, x₁ + 2x₂ ≤ 9 将上述问题转换为标准形式:最大化 2x₁ + 5x₂,约束条件为 x₁ + x₂ + x₃ = 6, x₂ + x₄ = 3, x₁ + 2x₂ + x₅ = 9 其中 x₃, x₄, 和 x₅ 是松弛变量。它们将形成单位矩阵,因此成为初始基。迭代 0 时的表格 ![]() 简化版本在第二个例子中,我们将使用单纯形法来解决一种不同类型的问题。 我们想在遵循以下约束条件的情况下最大化函数 2x₁ + 5x₂
为了更容易处理,我们将这个问题转换为标准形式:最大化 2x₁ + 5x₂,约束条件为 x₁ + x₂ + x₃ = 6, x₂ + x₄ = 3, x₁ + 2x₂ + x₅ = 9 在这里,x₃、x₄ 和 x₅ 是我们所说的松弛变量。它们帮助我们创建一个更有组织的初始基。我们将从迭代 0 的表格开始计算。 在解决问题时,单纯形算法是一个有价值的工具,帮助我们找到最佳解决方案。我们用它来解决线性规划问题(LPP),以最大化或最小化某个结果。该算法通过一系列步骤和迭代工作,它依赖于两个重要概念:“相对利润”和“主元元素”。 相对利润和主元元素
单纯形表:迭代过程
最终单纯形表第三次迭代是最后一步,我们得到的表格就是我们的最优解。这就像在藏宝图上找到了最佳路径。在这种情况下,最优时 Z(我们的目标)的值是 21。 使用单纯形算法如果你想为你自己的线性规划问题使用单纯形算法,你可以遵循以下步骤:
简而言之,单纯形算法是一个强大的工具,通过将复杂问题分解成更小的步骤,并帮助我们做出导致最佳可能结果的决策来解决这些问题。这就像拥有一张寻找宝藏的地图,每一步都让你更接近你的目标。 示例信息的第一部分是关于一个线性规划中的一些方程。它们按行组织。前三行将一些特殊变量移到一边,其余的移到另一边。最后一行不同,它有一个新变量叫做“z”,显示了该规划的目标。 每一组这些方程都与一个可能的解决方案相关联。在这种情况下,如果我们不进行任何复杂的数学计算,将变量 x₁ 和 x₂ 设为 0,我们就可以算出 x₃ 是 2,x₄ 是 4,x₅ 是 4。这个解是基本的,涉及到方程一侧的变量 x₃、x₄ 和 x₅,以及另一侧的 x₁ 和 x₂。对于这个特定的解,目标变量 z 的值为 0,你可以在方程的最后一行找到它。 ![]() 我们从一个基本的数字和符号表开始。然后,我们遵循一些特定的规则将这个表变成一系列类似的表。每个新表仍然告诉我们关于同一个数学问题的相同信息,只是方式不同。 在我们过程的下一步中,我们试图通过改变 x₁ 或 x₂ 这两个变量来改善我们的目标。但这里有一个问题:我们不能让任何主要变量低于零,因为那会使我们的计划行不通。 所以,我们决定将 x₂ 的值从 0 增加到 2。最重要的规则来自我们的第一个方程,我们将用它来找出 x₂ 应该是什么(x₂ = 2 + x₁ - x₃)。 ![]() 简单来说,我们正在微调我们的计划以使其更好,但我们必须小心不要违反规则,特别是第一个规则,它帮助我们根据其他变量的值来确定 x₂ 应该是什么。 在解决数学问题的世界里,当我们想把一个设置改变成另一个时,我们执行一个被称为“主元步骤”的操作。在这个主元步骤中,我们选择一个最初不是关键角色的变量(在这个例子中是 x₂),并使其变得重要,同时我们把一个曾经至关重要的变量(比如 x₃)变得不那么重要。 在新的设置中,如果我们想让最终结果尽可能好,我们应该增加 x₁ 的值。然而,如果我们增加 x₃,它会产生相反的效果,使我们的结果更糟。x₁ 能达到的最大值是 2。这个严格的限制来自最后一个方程(x₁ = 2 + x₃ - x₅)。 ![]() 所以,当我们处理这些数学表格时,我们实际上是在采取行动来改善我们的情况,我们必须考虑关注哪些变量才能获得最佳结果。 ![]() 现在,我们已经到了一个地步,即我们不能再增大那些非必要的值,而不会导致总体目标变得不那么有利。这告诉我们,我们已经发现了最佳的可能解决方案。 理解单纯形算法的工作原理既然我们对单纯形算法的功能有了一个简单的了解,让我们来创建这个算法的初始版本。我们将为该算法提供一个方程格式的线性规划,它应该看起来像这样。 以下是该算法的工作原理: 将方程转换为表格: 首先,我们将我们拥有的方程转换成一种特殊的表格形式。 寻找解决方案: 我们不断重复以下步骤,直到找到解决方案: 在表格中寻找一个特定的位置,我们称之为“主元位置”。 在该位置进行一次“主元步骤”。 获取最终答案: 在我们完成这些步骤之后,我们将表格转换回解决该线性规划的方案。 所以,简单来说,这个算法通过将方程组织在一个表格中,然后进行一些调整直到找到正确的答案,来帮助我们解决线性问题。 单纯形表是处理线性规划的一个关键工具,但它可能看起来与你最初在纸上看到的大不相同。它就像是你方程的数字化转型。 ![]() 在下一步中,我们分析非基变量的值,看看是否可以在不使我们的总体目标变差的情况下增加它们。如果可以,这是一个好兆头,我们开始寻找一个主元点,这是一种花哨的说法,表示我们正在寻找正确的位置来改善我们的方程。 一旦我们找到了那个主元点,我们就进入下一步,这涉及到调整我们的单纯形表。这可能听起来有点复杂,所以可以这样想:想象你有一张纸,在处理方程时在上面做修改。每一次修改都让我们更接近我们的目标。 在我们过程的最后一部分,我们需要从我们一直在处理的表格中获取解决方案。如果我们看图片,我们可以发现有些列中只有一个数字是“1”,其余都是“0”。这些列与右侧单纯形表示例中的基变量相对应。 现在,是时候将我们的计划付诸行动了。在我们的案例中,我们处理的是一个二维线性规划。所以,通过记录每一步的解决方案,我们可以通过绘制箭头来说明算法如何带我们到达最终答案。 Python 中单纯形算法的优点单纯形算法是一种常见的解决问题的方法,在这种问题中,你需要在遵守某些规则的同时找到最佳解决方案。想象一下,你正在尝试以最有效的方式规划生产、分配资源或组织运输。这个算法可以帮助解决这些问题。 在 Python 中使用单纯形算法有很多好处:
总而言之,在 Python 中使用单纯形算法是一个不错的选择,因为它高效、易于学习,并且能适应多种情况。无论你是初学者还是专家,它都能帮助你解决各种各样的问题。 Python 中单纯形算法的缺点单纯形算法是解决线性规划问题的流行方法,这些问题是用于优化各种事物(如资源分配)的数学模型。然而,当你在 Python 或其他编程语言中使用此算法时,它有一些你应该注意的缺点: 1. 对初始解的敏感性 当你开始用单纯形算法解决一个问题时,你选择的初始解会影响它找到最佳答案的速度。 如果你选择了一个不好的起点,可能需要很长时间才能得到正确的答案,或者在某些情况下,它可能根本找不到最佳答案。 2. 退化问题 有些问题有多个可能的解,或者它们在某种程度上很棘手,这可能导致单纯形算法卡住或需要很长时间才能解决。 你可能需要使用额外的技术,如反循环规则或扰动方法来处理这些问题。 3. 计算复杂性 在最坏的情况下,单纯形算法可能会非常慢,特别是对于有大量变量和规则的问题。 虽然它通常工作得很好,但重要的是要注意到这些它可能不那么高效的情况。 4. 不保证有限步终止 尽管单纯形算法在有解的情况下很擅长找到最佳答案,但它并不总是在一定步数后停止。 在某些情况下,它可能会永远运行下去而找不到解。 5. 适用性有限 单纯形算法是为称为线性规划的特定类型问题设计的。它不能用于更复杂的非线性问题。 6. 数值稳定性 当你在现实世界中使用单纯形算法时,由于计算机处理数字的方式,你可能会遇到问题。 这可能导致不正确的解决方案或算法无法找到有效的答案。 7. 关于对偶变量的信息有限 单纯形算法不提供你可能需要的所有信息,特别是在涉及到所谓的对偶变量或影子价格时。 要获得这些信息,你必须做一些额外的计算。 8. 整数线性规划 单纯形算法不适用于一种称为整数线性规划(ILP)的问题,其中变量必须是整数值。 对于 ILP 问题,你需要使用其他专门的算法,如分支定界法或分支切割法。 尽管有这些缺点,单纯形算法仍然是解决多种线性规划问题的重要工具,并已在各个领域得到应用。在 Python 中实现它时,你可以通过使用像 SciPy 这样成熟的库或专为效率和可靠性设计的商业优化软件来缓解其中一些问题。 Python 中单纯形算法的应用单纯形算法听起来可能很复杂,但它是一个解决特定类型数学问题的强大工具。可以把它看作是找到某个特定问题的最佳解决方案的方法,而这个解决方案必须遵循一些规则和约束。 以下是单纯形算法在 Python 中的一些实际应用: 资源分配: 想象你负责一家工厂。你想在最大限度利用资源的同时生产尽可能多的产品。单纯形算法可以帮助你计算出每种产品应该生产多少,同时考虑到可用材料和客户需求等因素。 运输与配送: 如果你是一家需要将产品从一个地方运送到另一个地方的企业,你希望以高效和最低成本的方式进行。单纯形算法可以帮助你规划出将产品运送到目的地的最经济有效的方式。 投资组合优化: 在金融世界中,你可能希望以一种平衡风险和回报的方式投资你的资金。单纯形算法可以帮助你在遵循某些规则的同时创建最佳的投资策略。 供应链管理: 当你管理一个供应链时,有许多活动部件,从生产到库存再到配送。单纯形算法可以帮助你在考虑各种限制的情况下,在每个步骤做出最佳决策。 生产计划: 如果你经营一家工厂,你需要决定生产什么以及何时生产。在给定机器容量和原材料等约束条件下,单纯形算法可以帮助找到要生产的产品的理想组合。 网络流问题: 有时,你需要找出将物品(如网络中的货物或信息)从一个地方移动到另一个地方的最有效方式。单纯形算法可以帮助简化这个过程。 农业规划: 如果你是一个农民,你想最大化你的作物产量和利润。单纯形算法可以帮助你决定种植哪些作物以及何时种植,同时考虑土壤质量和天气等因素。 要在 Python 中使用单纯形算法,有各种库和包可供选择: SciPy: SciPy 是一个用于科学和技术计算的 Python 库。它有一个工具可以使用单纯形算法解决问题。 PuLP: PuLP 是一个免费的 Python 库,它简化了处理线性规划问题的工作。它使得设置和解决这类问题变得更加容易。 Gurobi: Gurobi 是一款付费的优化求解器,提供用于解决线性规划和其他优化问题的 Python 工具。如果你需要高级功能和支持,这是一个不错的选择。 IBM CPLEX: CPLEX 是另一款商业优化求解器,具有用于处理线性规划问题的 Python 功能。它是解决复杂问题的强大选择。 这些工具使得将单纯形算法应用于各种现实世界情况变得更加容易,帮助你做出更好的决策并优化你的流程。 结论单纯形算法是高效解决复杂问题的宝贵工具。它就像一种智能方法,可以帮助我们在经济学、运筹学和工程学等领域做出更好的决策。 简单来说,该算法通过反复进行微小调整来逐步接近最佳解决方案。这就像通过沿着墙壁移动来在迷宫中找到出路。最终,它会引导我们找到最佳答案,这在解决现实世界问题中非常有帮助。 Python 中单纯形算法的优点在于它易于使用,并且能与其他 Python 工具很好地协同工作。这使得它成为各种任务的绝佳资源,无论是决定如何分配资源、规划生产,还是优化投资组合。所以,简而言之,Python 中的单纯形算法是一个多功能且强大的工具,可以在许多不同领域提高我们的决策能力和效率。 下一个主题Hessian 特征映射 |
我们请求您订阅我们的新闻通讯以获取最新更新。