如何为Scipy的optimize.shgo定义线性约束?为何出现下标错误?
Scipy optimize.shgo线性约束定义错误解决方法
错误原因
scipy.optimize.shgo的constraints参数要求传入约束对象的列表,而非单个LinearConstraint实例——这是它和optimize.minimize的核心区别,后者支持传入单个或列表形式的约束。直接传单个约束对象会触发TypeError: 'LinearConstraint' object is not subscriptable,因为函数内部会尝试对约束对象执行下标遍历操作。
修正步骤
- 将单个
LinearConstraint对象包裹进列表,作为constraints参数的值 - 修正
args参数写法:必须传入元组形式,即使只有一个参数也要加逗号(避免被解析为可迭代对象拆分)
修正后的完整代码
def scipy_shgo(id): data = get_data(id) lb = [0] ub = [np.inf] linear_constraint = LinearConstraint([0,0,-1,1], lb=lb, ub=ub) bounds = [(0, None)] * 4 # 两处关键修正:约束放入列表,args改为元组格式 res = shgo(mae_func, bounds=bounds, constraints=[linear_constraint], args=(data,)) return res result = scipy_shgo('some_id')
内容的提问来源于stack exchange,提问作者user546106
相关产品推荐
相关产品推荐

