我正在使用Scipy optimize.minimize with constraints and bounds(使用SLSQP方法)处理第三方软件优化问题。确切地说,我正在给一个非常复杂的函数(这里不能写)提供输入,该函数将启动我的软件,并返回一个我需要最小化的输出。
def func_to_minimize(param):
launch_software(param)
return software_output() # I retrieve the output after the software finish his computation
在处理它的过程中,我注意到在优化过程中,算法并不总是遵守约束条件。
然而,我试图优化的软件不能在特定的输入值下运行(物理定律不能被违反),我在代码中写了这些方程作为约束条件。例如,输出流量不能大于输入流量。
我想知道是否有可能在优化过程中遵守这些约束条件。
1条答案
按热度按时间kx7yvsdv1#
您可以尝试的一种方法是截取
param
,并在将其发送到launch_software
之前检查其是否可行。如果不可行,则返回np.inf
。我不确定这是否适用于SLSQP,但请给予一下。一种可行的方法是使用
optimize.differential_evolution
,该函数在计算目标函数之前检查约束条件是否可行;如果不是,那么你的目标函数就不会被调用。然而,differential_evolution
确实要求更多数量级的函数求值,所以如果你的目标函数很昂贵,那么这可能是一个问题。一个改进是矢量化或并行计算。