当前位置: 首页 > 网络应用技术

最多多少python?

时间:2023-03-06 01:59:02 网络应用技术

  简介:许多朋友询问有关Python的无限问题。本文的首席CTO笔记开始为您的参考做出详细的答案。我希望这对每个人都会有所帮助!让我们一起看看!

  一般的应用程序场景不需要考虑此尺寸,因为此上限非常高,

  当您需要使用这么多元素时,您需要考虑许多其他问题。

  1 ------------------------- 32位Python限制为536870912元素。

  

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

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

  我们的整数变量对于正确表示整数代表的整数数量非常重要,例如生产的飞机数量或服务中的客户数量。

  一个特别重要的整数变量是二进制变量。它只能采用零或一个的值,并且在制造或不进行时很有用。例如,是否应该建造工厂,还是应打开或关闭机器。您还可以使用它们来模拟逻辑约束。

  线性规划是一种基本优化技术,数十年来一直在科学和数学密集中使用。它是准确且相对较快的,适用于一系列实用应用。

  混合整数线性计划使您可以克服对线性计划的许多限制。您可以使用类似于非线性函数的分段线性函数,半连续变量,模型逻辑约束等。计算机硬件和软件的每天都更适合。

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

  以下文章说明了一些线性计划和混合整数线性计划的情况:

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

  解决线性计划问题的基本方法称为各种变体。另一个流行方法是。

  混合整数线性计划问题可以通过更复杂和更大的计算来解决,例如,它在幕后使用线性计划。该方法的某些变体是它涉及使用切割平面的使用,并且。

  有几种适合线性计划和混合整数线性计划的Python工具。其中一些是开源的,而其他工具是专有的。无论是免费还是付费工具,都取决于问题的规模和复杂性,以及问题的需求,以及速度和灵活性。

  值得一提的是,几乎所有广泛使用的线性计划和混合整数线性计划库都基于fortran或c ++本地和书面。库的库称为解决方案设备。python工具只是解决方案的包装设备。

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

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

  几个免费的Python库专门用于与线性或混合整数线性计划解决方案交互:

  在本教程中,您将使用Scipy和Pulp来定义和解决线性计划问题。

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

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

  考虑以下线性计划问题:

  您需要找到x和红以使红色,蓝色和黄色的不等式以及不等式x 0和?0,这是令人满意的。在同一时间,您的解决方案必须对应于z的最大值。

  您需要找到的自变量(在此示例中x和y)称为决策变量。最大化或最小化决策变量的功能(在本示例中)称为目标函数,成本函数或仅目标。对无限约束感到满意。您还可以在称为同等约束的约束中使用方程。

  这就是您可视化问题的方式:

  红线的功能代表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和y不会在正面上限制。无限,从而产生无限的z值。

  在上一部分中,您研究了一个抽象的线性计划问题,该问题与任何实际应用无关。在本节中,您会发现与制造资源分布相关的更具体且实用的优化问题。

  假设工厂生产四种不同的产品,第一产品的每日产出为x?,第二个产品的输出为x2。目标是确定每种产品的最大每日输出,同时牢记以下内容状况:

  可以这样定义数学模型:

  目标函数(利润)在条件下定义1.管理限制遵循条件。

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

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

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

  Scipy设置非常简单。安装后,您将拥有所需的所有开始。

  纸浆允许您选择一个解决方案设备并以更自然的方式表达问题。纸浆使用的默认解决方案是硬币或分支和切割求解器(CBC)。它连接到线性或线性计划器(CLP)和用于切割生成的硬币或切割生成画廊(CGL)。

  另一个出色的开源解决方案设备是GNU线性计划工具包(GLPK)。一种众所周知,强大的业务和专有解决方案是Gurobi,cplex和Xpress。

  除了提供在定义问题时提供灵活性和运行各种解决方案的能力外,纸浆还不如Pyomo或Cvxopt等替代解决方案那么复杂,后者需要更多的时间和精力来掌握。

  要学习本教程,您需要安装Scipy和Pulp。以下示例使用Scipy 1.4.1和Pulp 2.1。

  您可以使用PIP同时安装:

  您可能需要运行Pulptest或Sudo Pulptest才能启用纸浆的默认解决方案设备,尤其是当您使用Linux或Mac时:

  或者,您可以下载,安装和使用glpk.it是免费的,开源的,适用于Windows,MacOS和Linux。在本教程的后期,您将看到如何将GLPK(除CBC)与PULP一起使用。

  在Windows上,您可以下载文件并运行安装文件。

  在MacOS上,您可以使用Homebrew:

  在Debian和Ubuntu上,使用APT安装GLPK和GLPK-UTILS:

  在Fedora中,使用DNF具有GLPK-UTILS:

  您可能还会发现Conda对于安装GLPK很有用:

  安装完成后,您可以查看GLPK版本:

  有关详细信息,请参阅教程上的GLPK,以安装Windows可执行文件和Linux软件包的使用。

  在本节中,您将学习如何使用Scipy优化和根数据库进行线性计划。

  要使用scipy定义并解决优化问题,您需要导入scipy.optimize.linprog():

  现在,Linprog()介绍了您,您可以开始优化。

  让我们首先解决上述线性计划问题:

  linprog()仅解决最小化(而不是最大化)的问题,并且不允许无限制约束大于或等于符号()。要解决这些问题,您需要在开始优化之前修改问题:

  引入这些更改后,您将获得一个新系统:

  该系统等同于原始系统,并且将具有相同的解决方案。应用这些更改的唯一原因是克服与Scipy表达相关的局限性。

  下一步是定义输入值:

  您将值放在上面的系统中,列入适当的列表,元组或numpy数组:

  注意:请注意行和列的顺序!

  左和右的约束序列必须相同。每个线代表约束。

  必须匹配目标函数和左侧系数的顺序。EAWE列对应于决策变量。

  下一步是按与系数相同的顺序定义每个变量的边界。在这种情况下,它们在零和正无穷大之间:

  该语句是多余的,因为linprog()默认使用这些边界(零至正无限)。

  注意:相反,float(“ inf”),您可以使用Math.inf,numpy.inf或scipy.inf。

  最后,是时候优化和解决您的兴趣了。您可以执行此linprog():

  参数C是指来自目标函数的系数。A_UB和B_UB与左侧和右侧的约束有关。类似地,A_EQ和B_EQ参考等价。您可以使用界限来提供决策变量的下限和上限。

  您可以使用此参数MEDHOD来定义要使用的线性计划方法。有三个选项:

  linprog()返回具有以下属性的数据结构:

  您可以单独访问这些值:

  这是您获得优化结果的方式。您还可以在图形中显示它们:

  如前所述,线性计划问题的最佳解决方案位于可行区域的顶点。在这种情况下,可行区域只是蓝线和红线之间的绿线。最佳解决方案是一个代表的绿色正方形。绿线和红线的交点。

  如果要排除相等(绿色)约束,则只需要从linprog()呼叫中删除参数A_EQ和B_EQ:

  解决方案与以前的情况不同。您可以在图表上看到:

  在此示例中,最佳解决方案是可行(灰色)区域的紫色顶点,其中红色和蓝色收敛。其他顶点(例如黄色顶点)具有较高的目标函数值。

  您可以使用Scipy解决上一部分中描述的资源分配问题:

  像上一个示例一样,您需要从上述问题中提取必要的向量和矩阵,将它们作为参数传递给.linprog(),然后获取结果:

  结果告诉您,最大利润为1900,对应于X = 5,X = 45。在给定条件下的第二和第四产品的生产没有利润。您可以在这里得到一些有趣的结论:

  opt.status0和opt.succcessis true,这表明优化问题已成功解决,并且是最佳解决方案。

  Scipy的线性计划功能主要用于较小的问题。对于更大,更复杂的问题,您可能会发现其他库更合适。原因如下:

  幸运的是,Python生态系统为线性编程提供了几种替代解决方案,这些解决方案对于更大的问题非常有用。其中一个是纸浆,您将在下一节中看到其实际应用。

  纸浆比SCIPY具有更方便的线性编程API。您不必修改问题或使用向量和矩阵数学。所有内容都更干净,而且犯错误也不容易。

  像往常一样,您首先导入所需的内容:

  现在您已经进口纸浆了,可以解决问题。

  现在,您将使用纸浆来解决此系统:

  第一步是初始化一个实例lpproblem以表示您的模型:

  您可以使用Sense参数选择是最小化执行(LPMinimize还是1,这是默认值)还是最大值(LPMAXIMIZE或-1)。此选择会影响您的问题。

  一旦有模型,您就可以将决策变量定义为LPVARIABL类的实例:

  您需要提供下限。lowbound = 0是无限的,因为默认值为负值。此参数upbound定义了上限,但是您可以在此处省略它,因为它默认为正无穷大。

  可选参数CAT定义了决策变量的类别。如果使用连续变量,则可以使用默认值“连续”。

  您可以使用变量X和Y创建代表线性表达式和约束的其他纸浆对象:

  当您乘以决策变量和标量或构建多个决策变量的线性组合时,您将获得纸浆的线性表达式实例。

  注意:您可以增加或减少变量或表达式。您可以采用它们的常数,因为纸浆实现了一些特殊的Python方法,也就是说,模拟数字类型是相同的__ADD __(),__ sub __()和__mul __()。自定义操作员+, - 和*。

  同样,您可以制作线性表达式,变量和量表以及计算符号==,=,以获取具有代表模型.lpconstraint实例的线性约束的纸浆。

  注意:也可以使用丰富的比较方法构建约束。

  考虑到这一点,下一步是创建约束和目标函数并将其分配给您。您不需要创建列表或矩阵。仅写python表达式并使用+=操作员将它们添加到模型:

  在上面的代码中,您定义包含约束及其名称的元组。LPPOBROMER允许您通过将约束指定为模型。第一个元素是lpconstraint实例。第二个元素是约束的可读名称。

  设置目标函数非常相似:

  或者,您可以使用较短的符号:

  现在,您添加了目标功能并定义了模型。

  注意:您可以使用计算符号将约束或目标附加到模型上,因为其lpproblem实现了一种特殊的方法.___ IADD __(),此方法用于指定行为+=。

  对于更大的问题,LPSUM()和列表或其他序列通常比重复+计算符号更方便。例如,您可以使用以下语句将目标函数添加到模型:

  它产生与上一句话相同的结果。

  您现在可以看到此模型的完整定义:

  该模型的字符串表示所有相关数据:变量,约束,目标及其名称。

  注意:字符串指示.__ repl __()是通过定义特殊方法来构建的。有关相关的.__ epr__()的更多详细信息,请检查Pythonic OOP字符串转换:__ epr__vs_____str__。

  最后,您准备解决问题。

  .solve()调用底层以找到解决方案,修改模型对象,然后返回解决方案的整数状态。1如果找到最佳解决方案。有关状态代码的其余部分,请参见lpstatus []。

  您可以将属性模型作为优化结果。此功能值()和相应的方法。值()返回属性的实际值:

  model.Objective保留目标函数模型的值。符合条件包含放松变量的值,并且对象x和y的最佳值具有决策变量。model.model.variables()返回包含决策变量的列表:

  如您所见,此列表包含由所使用的构造函数创建的确切对象lpvariable。

  结果与您获得的结果大致相同。

  注意:请注意,此方法.solve() - 这将更改对象的状态x和y!

  您可以检查哪个解决方案设备.solver:求解器:

  您寻求解决方案的输出通知是CBC.您未指定解决方案设备,因此纸浆调用默认解决方案。

  如果要运行不同的解决方案,则可以指定参数.solve()。,您仍然需要导入它:

  现在您已经导入GLPK,可以在IT .solve()中使用它:

  MSG参数用于显示从解决方案设备的信息。msg= false禁用此信息。如果要包含信息,则只需要省略msg或设置msg = true即可。

  您的模型已定义和解决,因此您可以以与以前的情况相同的方式检查结果:

  使用GLPK获得的结果几乎与使用Scipy和CBC获得的结果相同。

  让我们看一下这次使用哪种解决方案设备:

  就像您使用上面的突出陈述定义一样,model.solve(solver = glpk(msg = false))也是GLPK。

  您还可以使用纸浆来解决混合整数线性计划的问题。要定义整数或二进制变量,您只需要将cat =“ integer”或cat =“二进制”传递给lpvariable。

  在此示例中,您有一个整数变量,并从上一张中获得不同的结果:

  Nowx是一个整数,例如模型中指定的。(从技术上讲,它在小数点后节省了浮点值为零。)这一事实改变了整个解决方案。LET在图表上显示了这一点:

  如您所见,最好的解决方案是灰色背景最右边的绿点。这是两者中最大值的可行解决方案x和y,使其具有最大目标函数值。

  GLPK也可以解决此类问题。

  现在,您可以使用纸浆来解决上述资源分配问题:

  定义和解决问题的方法与上一个示例相同:

  在这种情况下,您使用字典X存储所有决策变量。此方法非常方便,因为字典可以将决策变量的名称或索引存储为键,并将相应的lpvariable对象存储为值。元组的实例可能很有用。

  以上代码产生以下结果:

  如您所见,该解决方案与使用Scipy获得的解决方案一致。最有利的解决方案是每天生产第一批产品,第三种产品为45.0。

  让我们使这个问题更加复杂和有趣。要求工厂由于机器问题而不能同时生产第一和第三个产品。在这种情况下,最有利的解决方案是什么?

  现在您有另一个逻辑约束:如果x?是一个正数,则x?必须为零,反之亦然。这是双重决策变量非常有用的地方。他们将指出是生成第一产品还是第三个产品:

  除了突出显示行之外,代码还与上一个示例非常相似。以下区别是:

  这是解决方案:

  事实证明,最好的方法是消除第一个产品,而仅生产第三个产品。

  就像有很多资源可以帮助您学习线性计划和混合整数线性计划一样,还有许多与Python Packagers的解决方案一样。这是列表的一部分:

  这些库中的一些,例如Gurobi,包括他们自己的Python Packagers。他人使用外部包装器。例如,您可以看到可以使用纸浆来访问CBC和GLPK。

  现在,您知道什么是线性计划以及如何使用Python解决线性计划的问题。您还了解Python线性编程库只是该机器的包装设备。当解决方案完成工作时,该解决方案需要返回解决方案状态,决策变量,放松变量,目标功能等。

  32位Python的限制为536870912元素,限制为64位Python为1152921504606846975。

  最大容量取决于机器的性能指标。Pylist_new中的列表不是无限的。在Python源代码中,指定了列表的最大容量py_ssize_t_max。

  Python最原始的实现是Cpython,它是与C的python一起实施的。对于Python中的列表元素,必须从基础规范中追溯到。

  结论:以上是首席CTO的总内容有关Python's的总内容。不要忘记在此网站上找到它。