【发布时间】:2019-10-01 05:10:05
【问题描述】:
我想最小化一个目标函数,它在每一步调用一个模拟软件并返回一个标量。有没有办法限制目标函数的结果?例如,我想获得使结果尽可能接近 1 的变量值。
我试图简单地从目标函数的结果中减去 1,但这并没有帮助。我也玩过硬币约束,但如果我理解正确的话,它们只适用于输入变量。另一种方法可能是创建一个日志,在每次迭代后存储所有变量的值(我已经这样做了)。最后,应该可以搜索结果最接近 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)
我们的目标是找到一个可以适应任何目标值的解决方案。用户应该能够输入一个值,并且最小化将返回此目标值的最佳变量配置。
【问题讨论】:
-
(result - 1.0) ** 2能解决问题吗?然后结果不能变成负数,最小化应该导致result = 1(或附近的东西)。 -
这将是一个非常简单的解决方案,而且看起来很有希望。我明天试试,谢谢!
标签: python optimization scipy minimize