如果要排除相等(绿色)约束,只需删除参数A_eq并b_eq从linprog()调用中删除:
解决方案与前一种情况不同 。你可以在图表上看到:
在这个例子中 , 最优解是红色和蓝色约束相交的可行(灰色)区域的紫色顶点 。其他顶点,如黄色顶点,具有更高的目标函数值 。
您可以使用 SciPy 来解决前面部分所述的资源分配问题:
和前面的例子一样,你需要从上面的问题中提取必要的向量和矩阵,将它们作为参数传递给.linprog() , 然后得到结果:
结果告诉您最大利润是1900并且对应于x ? = 5 和x ? = 45 。在给定条件下生产第二和第四个产品是没有利润的 。您可以在这里得出几个有趣的结论:
opt.statusis0和opt.successis True , 说明优化问题成功求解 , 最优可行解 。
SciPy 的线性规划功能主要用于较小的问题 。对于更大和更复杂的问题,您可能会发现其他库更适合 , 原因如下:
幸运的是,Python 生态系统为线性编程提供了几种替代解决方案 , 这些解决方案对于更大的问题非常有用 。其中之一是 PuLP,您将在下一节中看到它的实际应用 。
PuLP 具有比 SciPy 更方便的线性编程 API 。您不必在数学上修改您的问题或使用向量和矩阵 。一切都更干净,更不容易出错 。
像往常一样,您首先导入您需要的内容:
现在您已经导入了 PuLP,您可以解决您的问题 。
您现在将使用 PuLP 解决此系统:
第一步是初始化一个实例LpProblem来表示你的模型:
您可以使用该sense参数来选择是执行最小化(LpMinimize或1,这是默认值)还是最大化(LpMaximize或-1) 。这个选择会影响你的问题的结果 。
一旦有了模型,就可以将决策变量定义为LpVariable类的实例:
您需要提供下限,lowBound=0因为默认值为负无穷大 。该参数upBound定义了上限 , 但您可以在此处省略它,因为它默认为正无穷大 。
可选参数cat定义决策变量的类别 。如果您使用的是连续变量,则可以使用默认值"Continuous" 。
您可以使用变量x和y创建表示线性表达式和约束的其他 PuLP 对象:
当您将决策变量与标量相乘或构建多个决策变量的线性组合时,您会得到一个pulp.LpAffineExpression代表线性表达式的实例 。
注意:您可以增加或减少变量或表达式,你可以乘他们常数,因为纸浆类实现一些Python的特殊方法 , 即模拟数字类型一样__add__(),__sub__()和__mul__() 。这些方法用于像定制运营商的行为+,-和* 。
类似地,您可以将线性表达式、变量和标量与运算符 ==、=以获取表示模型线性约束的纸浆.LpConstraint实例 。
注:也有可能与丰富的比较方法来构建的约束.__eq__(),.__le__()以及.__ge__()定义了运营商的行为==,= 。
考虑到这一点,下一步是创建约束和目标函数并将它们分配给您的模型 。您不需要创建列表或矩阵 。只需编写 Python 表达式并使用+=运算符将它们附加到模型中:
在上面的代码中,您定义了包含约束及其名称的元组 。LpProblem允许您通过将约束指定为元组来向模型添加约束 。第一个元素是一个LpConstraint实例 。第二个元素是该约束的可读名称 。
设置目标函数非常相似:
或者,您可以使用更短的符号:
现在您已经添加了目标函数并定义了模型 。
注意:您可以使用运算符将 约束或目标附加到模型中,+=因为它的类LpProblem实现了特殊方法.__iadd__(),该方法用于指定 的行为+= 。
对于较大的问题,lpSum()与列表或其他序列一起使用通常比重复+运算符更方便 。例如,您可以使用以下语句将目标函数添加到模型中:
推荐阅读
- 钉钉看直播是怎么开麦,钉钉直播开麦在哪
- jquerypromise源码,jquery源码是什么水平
- 幼儿游戏角色扮演试讲视频,幼儿游戏角色扮演试讲视频教程
- linux下sync命令,linux的sync账户
- mysql怎么将一行拆分 一行怎么拆分多行
- pg数据库replace连用,pg数据库连接
- ecs虚拟主机,ecs 虚拟主机
- 探索无人村直播中,搜索无人村
- python程序主函数 python主函数调用子函数变量