首页 > 解决方案 > python scipy.optimize.minimize 定义约束

问题描述

也许是一个非常具体的问题,我正在使用 scipy 优化函数来获取七个变量的新值。这七个值由数组 x0 设置为初始输入。 a, b, c, d实际上是int价值。

运行完整代码和最小化功能时,一切正常。

如果我打印我的七个变量在每次迭代后如何演变,我可以看到它们a, b, c, d被转换为float小步修改它。

虽然我仍然得到我的最终结果,但如果我可以在某些约束下表明这 4 个变量只是整数,那就太好了,所以优化函数将执行更少的迭代,而不是尝试将变量设置a, b,c ,d为 8.00000164 或其他浮点但直接到 6,7,8,9,10... 例如

我不确定这是否可能,但如果有人知道如何,我会很乐意学习。

下面是代码的重要部分,显示了如何设置最小化函数。

a = 8
b = 23
c = 54
d = 89

... some code before and after

# FUNCTION - SOLVER CONSTRAINTS
def solver_constraint_1(t):
  return t[1] - t[0]
def solver_constraint_2(t):
  return t[2] - t[1]
def solver_constraint_3(t):
  return t[3] - t[2]

... some code before and after

x0 = [a, b, c, d, 1.0, 1.0, 1.0]

x_bounds = [[0, 20], [10, 60], [20, 80], [60, 100], [0.25, 2.5], [0.25, 2.5], [0.25, 2.5]]

x_cons = ({'type': 'ineq', 'fun': solver_constraint_1}, 
          {'type': 'ineq', 'fun': solver_constraint_2},    
          {'type': 'ineq', 'fun': solver_constraint_3})

solution = minimize(objective, x0, method='SLSQP', bounds=x_bounds, constraints=x_cons, options={'ftol': 1e-8, 'maxiter': 1000, 'disp': True})

标签: pythonpython-2.7optimizationscipyminimize

解决方案


为了给出简短的答案,并在上述回复中@kazemakase 的帮助下,在最小化函数中将步长固定为整数是不容易的。实际上,这样做integer programming是一个比线性规划要复杂得多的问题


推荐阅读