我正在使用 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),但这似乎不是一个非常优雅或快速的解决方案。)
原文由 nicmet 发布,翻译遵循 CC BY-SA 4.0 许可协议
纸浆溶液
经过一番研究,我认为您的目标函数不是线性的。我在 Python pulp 库中重现了这个问题,但 pulp 不喜欢我们除以浮点数和“LpAffineExpression”。 这个答案 表明线性规划“不理解除法”,但该评论是在添加约束的背景下进行的,而不是目标函数。该评论将我指向“ 混合整数线性分数阶规划 (MILFP) ”和 维基百科。
如果它真的有效,你可以在 pulp 中使用以下方法(也许有人能弄清楚原因):
scipy.optimize 的暴力解决方案
您可以在函数中使用
brute
和 --- 的范围slice
x
如果你的函数中有 3x
slice
s。 The key to all of this is to add the step size of1
to theslice(start, stop,
step
)
soslice(#, #, 1)
。itertools解决方案
或者您可以使用 itertools 生成所有组合:
_注意_:出于示例目的,这是原始功能的缩小版本。