我想最大化两个linear
函数的商,我想我的决策变量是Binary
,也就是说,它们必须是integers
,并且只能取0
和1
的值。
我想知道我如何才能实现这一点?我正在寻找使用像SLSQP
这样的算法,我已经看过scipy
,但遗憾的是,它没有限制决策变量的值为二进制和整数。
有没有人知道有一个接口简单易懂的库,我可以用它来实现这一点?或者有没有任何方法可以通过scipy
本身来实现这一点。Restrict scipy.optimize.minimize to integer values
但是在这三个解决方案中,我认为没有一个是有效的。如果能提供任何帮助,那就太好了。
3条答案
按热度按时间7hiiyaii1#
由于没有约束条件,除了变量必须是二进制之外,最大化非常简单,只需根据分子和分母中对应系数的比值对决策变量进行排序,假设所有系数都是非负的,并且分子和分母中存在偏差(以避免被零除),则可以使用下面的实现。
下面是一个示例用法
dgiusagp2#
我完全是即兴表演的......但下面是我对
mystic
的表演。现在稍微修改一下方程...
如果您想要二进制变量而不是整数,则可以使用
bounds = [(0,1)]*4
或将@integers()
替换为@discrete([0.0, 1.0])
。虽然上面的结果不是很有趣,但还有一些更好的例子,可以用整数规划和Mystic的GitHub上的广义约束进行全局优化:https://github.com/uqfoundation/mystic/blob/master/examples2/integer_programming.pyhttps://github.com/uqfoundation/mystic/blob/master/examples2/olympic.py
fdbelqdn3#
Python中有几个包可以用来解决MINLP问题,包括
pyomo
和gekko
。下面是一个用Python Gekko(我维护的一个包)解决MINLP问题的方法,作为一个简单的例子。安装gekko
包,其中包括用pip
解决APOPT MINLP问题的程序:MINLP解决方案
Gekko还可以解决Mixed Integer Nonlinear Programming (MINLP)问题,例如:
这给出了解:
APOPT求解器使用branch and bound solution approach和非线性规划(NLP)子问题来查找整数解。此处列出了几个附加软件包:Python Mixed Integer Linear Programming的MILP(和一些与MINLP)求解器。Scipy包将有一个混合整数线性规划(MILP)求解器在下一个版本,但这并不有助于您的MINLP问题。Gurobi,CPLEX,和Mosel-Xpress是领导者在MILP/MIQP求解器,但都是商业求解器。我最近还添加了一个答案后,你引用:Restrict scipy.optimize.minimize to integer values在您寻找一个MINLP求解器。如果您的问题可以重新制定为MILP,那么这打开了您的解决方案,以许多其他软件包。
MILP解决方案
下面是一个脚本示例,它通过使用
integer=True
指定上界和下界来解决变量限制为二进制值(0或1)的线性编程问题:这将生成解决方案: