python约束函数 约束unique( 五 )


它产生与前一条语句相同的结果 。
您现在可以看到此模型的完整定义:
模型的字符串表示包含所有相关数据:变量、约束、目标及其名称 。
注意:字符串表示是通过定义特殊方法构建的.__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 得到的结果几乎相同 。
一起来看看这次用的是哪个求解器:
正如您在上面用突出显示的语句定义的那样model.solve(solver=GLPK(msg=False)),求解器是 GLPK 。
您还可以使用 PuLP 来解决混合整数线性规划问题 。要定义整数或二进制变量 , 只需传递cat="Integer"或cat="Binary"到LpVariable 。其他一切都保持不变:
在本例中 , 您有一个整数变量并获得与之前不同的结果:
Nowx是一个整数 , 如模型中所指定 。(从技术上讲 , 它保存一个小数点后为零的浮点值 。)这一事实改变了整个解决方案 。让我们在图表上展示这一点:
如您所见 , 最佳解决方案是灰色背景上最右边的绿点 。这是两者的最大价值的可行的解决方案x和y,给它的最大目标函数值 。
GLPK 也能够解决此类问题 。
现在你可以使用 PuLP 来解决上面的资源分配问题:
定义和解决问题的方法与前面的示例相同:
在这种情况下 , 您使用字典 x来存储所有决策变量 。这种方法很方便,因为字典可以将决策变量的名称或索引存储为键,将相应的LpVariable对象存储为值 。列表或元组的LpVariable实例可以是有用的 。
上面的代码产生以下结果:
如您所见 , 该解决方案与使用 SciPy 获得的解决方案一致 。最有利可图的解决方案是每天生产5.0第一件产品和45.0第三件产品 。
让我们把这个问题变得更复杂和有趣 。假设由于机器问题,工厂无法同时生产第一种和第三种产品 。在这种情况下,最有利可图的解决方案是什么?
现在您有另一个逻辑约束:如果x ? 为正数,则x ? 必须为零,反之亦然 。这是二元决策变量非常有用的地方 。您将使用两个二元决策变量y ? 和y ? , 它们将表示是否生成了第一个或第三个产品:

推荐阅读