我使用scipy.optimize.minimize
来优化一个实际问题,其答案只能是整数。我当前的代码如下所示:将scipy.optimize.minimize限制为整数值
from scipy.optimize import minimize
def f(x):
return (481.79/(5+x[0]))+(412.04/(4+x[1]))+(365.54/(3+x[2]))+(375.88/(3+x[3]))+(379.75/(3+x[4]))+(632.92/(5+x[5]))+(127.89/(1+x[6]))+(835.71/(6+x[7]))+(200.21/(1+x[8]))
def con(x):
return sum(x)-7
cons = {'type':'eq', 'fun': con}
print scipy.optimize.minimize(f, [1,1,1,1,1,1,1,0,0], constraints=cons, bounds=([0,7],[0,7],[0,7],[0,7],[0,7],[0,7],[0,7],[0,7],[0,7]))
这产生了:
x: array([ 2.91950510e-16, 2.44504019e-01, 9.97850733e-01,
1.05398840e+00, 1.07481251e+00, 2.60570253e-01,
1.36470363e+00, 4.48527831e-02, 1.95871767e+00]
但我想它一个整数优化(四舍五入所有x
到最接近的整数并不总是给出最低)。
有没有办法只用整数值来使用scipy.optimize.minimize
?
(我想我可以创建的x
所有可能的排列的数组,并评估每个组合F(X),但是这似乎并不像一个非常优雅和快速的解决方案。)
这是不可能的。在numpy/scipy中没有**(混合)整数编程**的求解器。您可能想要使用[纸浆](https://github.com/coin-or/pulp)或一些替代品(pyomo,cvxpy,...)。或者如果你疯了:写你自己的分支和绑定程序。 – sascha