最小化限制(SLSQP)的结果

时间:2019-05-14 08:20:09

标签: python optimization scipy minimize

我想最小化目标函数,该函数在每个步骤中都会调用模拟软件并返回标量。有什么方法可以限制目标函数的结果?例如,我想获取使结果尽可能接近1的变量的值。

我试图简单地从目标函数的结果中减去1,但这没有帮助。我也玩过coinstraints,但如果我理解得很清楚,它们仅适用于输入变量。另一种方法可能是创建一个日志,该日志在每次迭代后存储所有变量的值(我已经在这样做了)。最后,应该可以搜索结果最接近1的迭代并返回其变量配置。问题是最小化可能会运行太长时间,并且会产生无用的结果。有什么更好的方法吗?

def objective(data):
     """
     Optimization Function
     :param data: list containing the current guess (list of float values)
     :return: each iteration returns a scalar which should be minimized
     """

     # do simulation and calculate scalar

     return result - 1.0   # doesn't work since result is becoming negative
def optimize(self):
     """
     daemon which triggers input, reads output and optimizes results
     :return: optimized results
     """

     # initialize log, initial guess etc.

     sol = minimize(self.objective, x0, method='SLSQP', options={'eps': 1e-3, 'ftol': 1e-9}, bounds=boundList)

目标是找到可以适应任何目标值的解决方案。用户应该能够输入一个值,并且最小化将为此目标值返回最佳的变量配置。

1 个答案:

答案 0 :(得分:1)

如评论中所述,实现此目标的一种方法是使用

return (result - 1.0) ** 2
objective

。这样结果就不会变成负数,优化将尝试以接近目标值的方式找到result(例如您的情况下为1.0)。

插图,首先使用您当前的设置:

from scipy.optimize import minimize


def objective(x, target_value):

    # replace this by your actual calculations
    result = x - 9.0

    return result - target_value


# add some bounds for all the parameters you have
bnds = [(-100, 100)]

# target_value is passed in args; feel free to add more
res = minimize(objective, (1), args=(1.0,), bounds=bnds)

if res.success:
    # that's the optimal x
    print(f"optimal x: {res.x[0]}")
else:
    print("Sorry, the optimization was not successful. Try with another initial"
          " guess or optimization method")

当我们选择-100作为x的下限并要求最小化目标时,最佳x-100(如果运行代码,则会打印出来从上面)。如果我们现在替换行

return result - target_value

通过

return (result - target_value) ** 2

,其余部分保持不变,最佳x10,符合预期。

请注意,我将您的目标值作为附加参数传递,以使您的函数更加灵活。