如何为skopt中的简单多元方程优化正确定义搜索空间?
如何为skopt中的简单多元方程优化正确定义搜索空间?
嘿,我来帮你捋清楚这个问题~ 你遇到的报错其实是skopt的参数传递逻辑和你写的函数不匹配导致的:skopt里的优化器(比如你用的dummy_minimize)会把搜索空间里的所有维度参数打包成一个单一元组传给目标函数,而不是像你预期的那样分两个独立参数传入,所以才会报缺少some_y的错误。
给你两种简单的解决办法,选哪种都可以:
方法一:修改目标函数,适配元组参数
直接把函数改成接收一个元组参数,然后解构出你需要的some_x和some_y,原来的搜索空间BOUNDS定义是完全没问题的:
import skopt def black_box_function(params): some_x, some_y = params return -some_x + 2 - (some_y - 1) ** 2 + 1 BOUNDS = [(0, 100.0), (0, 100.0)] result = skopt.dummy_minimize(func=black_box_function, dimensions=BOUNDS) # 可以打印最优参数看看 print("最优参数:", result.x)
方法二:用Lambda包装原函数,不用修改函数本身
如果你不想改动原来的black_box_function,可以用lambda函数做个“适配器”,把skopt传的元组解开成两个参数传给原函数:
import skopt def black_box_function(some_x, some_y): return -some_x + 2 - (some_y - 1) ** 2 + 1 BOUNDS = [(0, 100.0), (0, 100.0)] # 用lambda把元组参数解开 result = skopt.dummy_minimize(func=lambda params: black_box_function(*params), dimensions=BOUNDS) print("最优参数:", result.x)
两种方法都能正常运行,而且最终的最优参数应该会接近(100, 1)——毕竟你的函数里,要让返回值最小,some_x越大越好(因为前面是负号),some_y越接近1越好(因为-(some_y-1)²的最小值是0)。
备注:内容来源于stack exchange,提问作者WhiskeyHammer
相关产品推荐
相关产品推荐

