python的线性函数吗 python求线性方程组( 五 )


您可以使用变量x和y创建表示线性表达式和约束的其他 PuLP 对象:
当您将决策变量与标量相乘或构建多个决策变量的线性组合时,您会得到一个pulp.LpAffineExpression代表线性表达式的实例 。
注意:您可以增加或减少变量或表达式,你可以乘他们常数,因为纸浆类实现一些Python的特殊方法 , 即模拟数字类型一样__add__() , __sub__()和__mul__() 。这些方法用于像定制运营商的行为+,-和* 。
类似地,您可以将线性表达式、变量和标量与运算符 ==、=以获取表示模型线性约束的纸浆.LpConstraint实例 。
注:也有可能与丰富的比较方法来构建的约束.__eq__(),.__le__()以及.__ge__()定义了运营商的行为==,= 。
考虑到这一点,下一步是创建约束和目标函数并将它们分配给您的模型 。您不需要创建列表或矩阵 。只需编写 Python 表达式并使用+=运算符将它们附加到模型中:
在上面的代码中,您定义了包含约束及其名称的元组 。LpProblem允许您通过将约束指定为元组来向模型添加约束 。第一个元素是一个LpConstraint实例 。第二个元素是该约束的可读名称 。
设置目标函数非常相似:
或者,您可以使用更短的符号:
现在您已经添加了目标函数并定义了模型 。
注意:您可以使用运算符将 约束或目标附加到模型中,+=因为它的类LpProblem实现了特殊方法.__iadd__(),该方法用于指定 的行为+= 。
对于较大的问题,lpSum()与列表或其他序列一起使用通常比重复+运算符更方便 。例如,您可以使用以下语句将目标函数添加到模型中:
它产生与前一条语句相同的结果 。
您现在可以看到此模型的完整定义:
模型的字符串表示包含所有相关数据:变量、约束、目标及其名称 。
注意:字符串表示是通过定义特殊方法构建的.__repr__() 。有关 的更多详细信息.__repr__(),请查看Pythonic OOP 字符串转换:__repr__vs__str__ .
最后,您已准备好解决问题 。你可以通过调用.solve()你的模型对象来做到这一点 。如果要使用默认求解器 (CBC),则不需要传递任何参数:
.solve()调用底层求解器,修改model对象,并返回解决方案的整数状态,1如果找到了最优解 。有关其余状态代码 , 请参阅LpStatus[] 。
你可以得到优化结果作为 的属性model 。该函数value()和相应的方法.value()返回属性的实际值:
model.objective持有目标函数model.constraints的值 , 包含松弛变量的值,以及对象x和y具有决策变量的最优值 。model.variables()返回一个包含决策变量的列表:
如您所见 , 此列表包含使用 的构造函数创建的确切对象LpVariable 。
结果与您使用 SciPy 获得的结果大致相同 。
注意:注意这个方法.solve()——它会改变对象的状态,x并且y!
您可以通过调用查看使用了哪个求解器.solver:
输出通知您求解器是 CBC 。您没有指定求解器,因此 PuLP 调用了默认求解器 。
如果要运行不同的求解器,则可以将其指定为 的参数.solve() 。例如,如果您想使用 GLPK 并且已经安装了它,那么您可以solver=GLPK(msg=False)在最后一行使用 。请记住 , 您还需要导入它:
现在你已经导入了 GLPK,你可以在里面使用它.solve():
该msg参数用于显示来自求解器的信息 。msg=False禁用显示此信息 。如果要包含信息,则只需省略msg或设置msg=True 。
您的模型已定义并求解,因此您可以按照与前一种情况相同的方式检查结果:
使用 GLPK 得到的结果与使用 SciPy 和 CBC 得到的结果几乎相同 。
一起来看看这次用的是哪个求解器:

推荐阅读