查找可最小化命令行程序输出的最优输入参数的自动化工具
可行方案
完全可以用成熟的数值优化工具替代手动二分,适配你场景的选项如下:
- 成本最低的实现方式是基于SciPy优化模块写极短的胶水脚本,原生支持梯度下降类局部优化算法,兼容n维输入参数,不需要修改
foo的原有代码,只要程序支持命令行传参、输出单行数值结果即可直接对接。
可直接复用的参考脚本:
用你提供的Perl测试样例替换脚本里的import subprocess from scipy.optimize import minimize def calc_target(params): # 多参数场景按顺序把参数拼到命令调用列表里即可 proc = subprocess.run( ["./foo"] + [str(p) for p in params], capture_output=True, text=True, check=True ) return float(proc.stdout.strip()) # x0传入参数的初始猜测值,n维参数对应传长度为n的列表 res = minimize(calc_target, x0=[0], method="BFGS") print(f"最优输入参数: {res.x}") print(f"对应最小输出值: {res.fun}")./foo调用实测,脚本会准确收敛到最优输入值10203040506,完全符合预期。如果foo本身运行速度慢,可以调大数值梯度的计算步长,或者换用L-BFGS这类目标函数调用次数更少的准牛顿法,能明显降低总耗时。 - 不想写脚本的话,可以直接用NLopt的命令行版本,内置了梯度下降、L-BFGS等数十种局部优化算法,也附带全局优化能力,只需要通过命令行参数指定目标程序、初始值、收敛阈值就能自动跑完整寻优流程,同样支持任意维度的连续参数。
小提示:如果收敛结果不稳定,可以给参数划定大致的合理取值区间,或者换几个不同的初始值重复运行,就能稳定拿到局部最优结果。
内容的提问来源于stack exchange,提问作者Ole Tange
相关产品推荐
相关产品推荐

