python约束函数 约束unique( 三 )


在本教程中,您将使用两个Python 包来解决上述线性规划问题:
SciPy 设置起来很简单 。安装后,您将拥有开始所需的一切 。它的子包scipy.optimize可用于线性和非线性优化 。
PuLP 允许您选择求解器并以更自然的方式表述问题 。PuLP 使用的默认求解器是COIN-OR Branch and Cut Solver (CBC) 。它连接到用于线性松弛的COIN-OR 线性规划求解器 (CLP)和用于切割生成的COIN-OR 切割生成器库 (CGL) 。
另一个伟大的开源求解器是GNU 线性规划工具包 (GLPK) 。一些著名且非常强大的商业和专有解决方案是Gurobi、CPLEX和XPRESS 。
除了在定义问题时提供灵活性和运行各种求解器的能力外,PuLP 使用起来不如 Pyomo 或 CVXOPT 等替代方案复杂 , 后者需要更多的时间和精力来掌握 。
要学习本教程,您需要安装 SciPy 和 PuLP 。下面的示例使用 SciPy 1.4.1 版和 PuLP 2.1 版 。
您可以使用pip以下方法安装两者:
您可能需要运行pulptest或sudo pulptest启用 PuLP 的默认求解器,尤其是在您使用 Linux 或 Mac 时:
或者 , 您可以下载、安装和使用 GLPK 。它是免费和开源的,适用于 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 数组中:
注意:请注意行和列的顺序!
约束左侧和右侧的行顺序必须相同 。每一行代表一个约束 。
来自目标函数和约束左侧的系数的顺序必须匹配 。每列对应一个决策变量 。
下一步是以与系数相同的顺序定义每个变量的界限 。在这种情况下,它们都在零和正无穷大之间:
此语句是多余的,因为linprog()默认情况下采用这些边界(零到正无穷大) 。
注:相反的float("inf"),你可以使用math.inf,numpy.inf或scipy.inf 。
最后 , 是时候优化和解决您感兴趣的问题了 。你可以这样做linprog():
参数c是指来自目标函数的系数 。A_ub和b_ub分别与不等式约束左边和右边的系数有关 。同样 , A_eq并b_eq参考等式约束 。您可以使用bounds提供决策变量的下限和上限 。
您可以使用该参数method来定义要使用的线性规划方法 。有以下三种选择:
linprog() 返回具有以下属性的数据结构:
您可以分别访问这些值:
这就是您获得优化结果的方式 。您还可以以图形方式显示它们:
如前所述 , 线性规划问题的最优解位于可行区域的顶点 。在这种情况下,可行区域只是蓝线和红线之间的绿线部分 。最优解是代表绿线和红线交点的绿色方块 。

推荐阅读