使用Scipy模拟双退火优化带约束序列遇类型错误求解决
解决Scipy模拟双退火(dual_annealing)的边界格式错误
错误原因
scipy.optimize.dual_annealing的bounds参数要求是一维列表/数组,每个元素为(下限, 上限)的数值元组,对应单个优化变量的约束。你当前使用嵌套Bounds对象的结构,无法被内部处理逻辑转换为数值数组,因此触发ufunc 'isinf'类型错误。
解决方案
1. 构造正确的边界列表
将所有优化变量的上下界按顺序展开为一维列表:每个序列元素包含2个变量,重复10次即可得到20个变量的边界集合。
import numpy as np from scipy.optimize import dual_annealing self.sequence_length = 10 # 每个序列元素的两个变量上下界,重复10次生成完整边界列表 self.action_space = [(np.pi/12, 5*np.pi/9), (75.0, 200.0)] * self.sequence_length
2. 适配目标函数输入格式
目标函数接收的参数是长度为20的一维数组,需要将其重塑为(10,2)的序列结构,再进行业务计算:
def func(self, x): # 将一维输入数组重塑为10个元素的序列,每个元素含2个值 sequence = x.reshape((self.sequence_length, 2)) # 替换为你的实际目标计算逻辑,返回需要最小化的数值 example_objective = np.sum(sequence) # 示例:计算序列所有元素的和 return example_objective
3. 调用dual_annealing
使用修正后的边界列表调用函数即可:
result = dual_annealing(self.func, initial_temp=10000, bounds=self.action_space, maxfun=1000)
内容的提问来源于stack exchange,提问作者HenDoNR
相关产品推荐
相关产品推荐

