我想最小化目标函数,该函数在每个步骤中都会调用模拟软件并返回标量。有什么方法可以限制目标函数的结果?例如,我想获取使结果尽可能接近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)
目标是找到可以适应任何目标值的解决方案。用户应该能够输入一个值,并且最小化将为此目标值返回最佳的变量配置。
答案 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
,其余部分保持不变,最佳x
为10
,符合预期。
请注意,我将您的目标值作为附加参数传递,以使您的函数更加灵活。