当前位置:   article > 正文

只需一步,轻松用Python实现线性规划_python 线性规划

python 线性规划

线性规划说明

什么是线性规划?

想象一下,您有一个线性方程组和不等式系统。这样的系统通常有许多可能的解决方案。线性规划是一组数学和计算工具,可让您找到该系统的特定解,该解对应于某些其他线性函数的最大值或最小值。

什么是混合整数线性规划?

混合整数线性规划线性规划的扩展。它处理至少一个变量采用离散整数而不是连续值的问题。尽管乍一看混合整数问题与连续变量问题相似,但它们在灵活性和精度方面具有显着优势。

整数变量对于正确表示自然用整数表示的数量很重要,例如生产的飞机数量或服务的客户数量。

一种特别重要的整数变量是二进制变量。它只能取的值,在做出是或否的决定时很有用,例如是否应该建造工厂或者是否应该打开或关闭机器。您还可以使用它们来模拟逻辑约束。

为什么线性规划很重要?

线性规划是一种基本的优化技术,已在科学和数学密集型领域使用了数十年。它精确、相对快速,适用于一系列实际应用。

混合整数线性规划允许您克服线性规划的许多限制。您可以使用分段线性函数近似非线性函数、使用半连续变量、模型逻辑约束等。它是一种计算密集型工具,但计算机硬件和软件的进步使其每天都更加适用。

通常,当人们试图制定和解决优化问题时,第一个问题是他们是否可以应用线性规划或混合整数线性规划。

以下文章说明了线性规划和混合整数线性规划的一些用例:

  • Gurobi 优化案例研究
  • 线性规划技术的五个应用领域

随着计算机能力的增强、算法的改进以及更多用户友好的软件解决方案的出现,线性规划,尤其是混合整数线性规划的重要性随着时间的推移而增加。

使用 Python 进行线性规划

解决线性规划问题的基本方法称为单纯形法,它有多种变体。另一种流行的方法是内点法

混合整数线性规划问题可以通过更复杂且计算量更大的方法来解决,例如分支定界法,它在幕后使用线性规划。这种方法的一些变体是分支和切割方法,它涉及使用切割平面,以及分支和价格方法

有几种适用于线性规划和混合整数线性规划的合适且众所周知的 Python 工具。其中一些是开源的,而另一些是专有的。您是否需要免费或付费工具取决于问题的规模和复杂性,以及对速度和灵活性的需求。

值得一提的是,几乎所有广泛使用的线性规划和混合整数线性规划库都是以 Fortran 或 C 或 C++ 原生和编写的。这是因为线性规划需要对(通常很大)矩阵进行计算密集型工作。此类库称为求解器。Python 工具只是求解器的包装器。

Python 适合围绕本机库构建包装器,因为它可以很好地与 C/C++ 配合使用。对于本教程,您不需要任何 C/C++(或 Fortran),但如果您想了解有关此酷功能的更多信息,请查看以下资源:

  • 构建 Python C 扩展模块
  • CPython 内部
  • 用 C 或 C++ 扩展 Python

基本上,当您定义和求解模型时,您使用 Python 函数或方法调用低级库,该库执行实际优化工作并将解决方案返回给您的 Python 对象。

几个免费的 Python 库专门用于与线性或混合整数线性规划求解器交互:

  • SciPy Optimization and Root Finding
  • PuLP
  • Pyomo
  • CVXOPT

在本教程中,您将使用SciPy和PuLP来定义和解决线性规划问题。

线性规划示例

在本节中,您将看到线性规划问题的两个示例:

  1. 一个说明什么是线性规划的小问题
  2. 一个与资源分配相关的实际问题,它说明了现实世界场景中的线性规划概念

您将在下一节中使用 Python 来解决这两个问题。

小型线性规划问题

考虑以下线性规划问题:

你需要找到X和Ÿ使得红色,蓝色和黄色的不平等,以及不平等X ≥0和ÿ ≥0,是满意的。同时,您的解决方案必须对应于z的最大可能值。

您需要找到的自变量(在本例中为xy)称为决策变量。要最大化或最小化的决策变量的函数(在本例中为z)称为目标函数成本函数或仅称为目标。您需要满足的不等式称为不等式约束。您还可以在称为等式约束的约束中使用方程。

这是您如何可视化问题的方法:

红线代表的功能2 X + Ý = 20,和它上面的红色区域示出了红色不等式不满足。同样,蓝线是函数−4 x + 5 y = 10,蓝色区域被禁止,因为它违反了蓝色不等式。黄线是 − x + 2 y = −2,其下方的黄色区域是黄色不等式无效的地方。

如果您忽略红色、蓝色和黄色区域,则仅保留灰色区域。灰色区域的每个点都满足所有约束,是问题的潜在解决方案。该区域称为可行域,其点为可行解。在这种情况下,有无数可行的解决方案。

您想最大化z。对应于最大z的可行解是最优解。如果您尝试最小化目标函数,那么最佳解决方案将对应于其可行的最小值。

请注意,z是线性的。你可以把它想象成一个三维空间中的平面。这就是为什么最优解必须在可行区域的顶点或角上的原因。在这种情况下,最佳解决方案是红线和蓝线相交的点,稍后您将看到。

有时,可行区域的整个边缘,甚至整个区域,都可以对应相同的z值。在这种情况下,您有许多最佳解决方案。

您现在已准备好使用绿色显示的附加等式约束来扩展问题:

方程式 − x + 5 y = 15,以绿色书写,是新的。这是一个等式约束。您可以通过向上一张图像添加相应的绿线来将其可视化:

现在的解决方案必须满足绿色等式,因此可行区域不再是整个灰色区域。它是绿线从与蓝线的交点到与红线的交点穿过灰色区域的部分。后一点是解决方案。

如果插入x的所有值都必须是整数的要求,那么就会得到一个混合整数线性规划问题,可行解的集合又会发生变化:

您不再有绿线,只有沿线的x值为整数的点。可行解是灰色背景上的绿点,此时最优解离红线最近。

这三个例子说明了可行的线性规划问题,因为它们具有有界可行区域和有限解。

不可行的线性规划问题

如果没有解,线性规划问题是不可行的。当没有解决方案可以同时满足所有约束时,通常会发生这种情况。

例如,考虑如果添加约束x + y ≤ −1会发生什么。那么至少有一个决策变量(x或y)必须是负数。这与给定的约束x ≥ 0 和y ≥ 0相冲突。这样的系统没有可行的解决方案,因此称为不可行的。

另一个示例是添加与绿线平行的第二个等式约束。这两行没有共同点,因此不会有满足这两个约束的解决方案。

无界线性规划问题

一个线性规划问题是无界的,如果它的可行区域是无界,将溶液不是有限。这意味着您的变量中至少有一个不受约束,可以达到正无穷大或负无穷大,从而使目标也无限大。

例如,假设您采用上面的初始问题并删除红色和黄色约束。从问题中删除约束称为放松问题。在这种情况下,x和y不会在正侧有界。您可以将它们增加到正无穷大,从而产生无限大的z值。

资源分配问题

在前面的部分中,您研究了一个与任何实际应用程序无关的抽象线性规划问题。在本小节中,您将找到与制造业资源分配相关的更具体和实用的优化问题。

假设一家工厂生产四种不同的产品,第一种产品的日产量为x ₁,第二种产品的产量为x 2,依此类推。目标是确定每种产品的利润最大化日产量,同时牢记以下条件:

  1. 第一种、第二种、第三种和第四种产品的每单位产品利润分别为 20 美元、12 美元、40 美元和 25 美元。
  2. 由于人力限制,每天生产的总数量不能超过五十台。
  3. 对于每单位第一个产品,消耗三个单位的原材料 A。每单位第二产品需要两单位原料 A 和一单位原料 B。每单位第三产品需要一单位 A 和两单位 B。最后,每单位第四产品需要三B 的单位
  4. 由于运输和储存的限制,工厂每天最多可以消耗一百单位的原材料 A 和九十单位的 B。

数学模型可以这样定义:

目标函数(利润)在条件 1 中定义。人力约束遵循条件 2。对原材料 A 和 B 的约束可以从条件 3 和条件 4 中通过对每种产品的原材料需求求和得出。

最后,产品数量不能为负,因此所有决策变量必须大于或等于零。

与前面的示例不同,您无法方便地将其可视化,因为它有四个决策变量。但是,无论问题的维度如何,原理都是相同的。

线性规划 Python 实现

在本教程中,您将使用两个Python 包来解决上述线性规划问题:

  1. SciPy是一个用于使用 Python 进行科学计算的通用包。
  2. PuLP是一个 Python 线性编程 API,用于定义问题和调用外部求解器。

SciPy 设置起来很简单。安装后,您将拥有开始所需的一切。它的子包scipy.optimize可用于线性和非线性优化。

PuLP 允许您选择求解器并以更自然的方式表述问题。PuLP 使用的默认求解器是COIN-OR Branch and Cut Solver (CBC)。它连接到用于线性松弛的COIN-OR 线性规划求解器 (CLP)和用于切割生成的COIN-OR 切割生成器库 (CGL)。

另一个伟大的开源求解器是GNU 线性规划工具包 (GLPK)。一些著名且非常强大的商业和专有解决方案是Gurobi、CPLEX和XPRESS。

除了在定义问题时提供灵活性和运行各种求解器的能力外,PuLP 使

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/盐析白兔/article/detail/844089
推荐阅读
相关标签
  

闽ICP备14008679号