使用pymoo优化时if语句触发ValueError数组真值模糊问题咨询
问题原因
- pymoo的
_evaluate方法每次会传入整个种群的样本集合,你传入joist_h_des的X[:, 0]、X[:, 1]都是长度等于种群规模的numpy数组,不是单个数值,因此计算得到的defCHK也是数组 - Python的
if语句只能判断单个布尔值,直接对数组做defCHK > 1运算得到的是一个布尔数组,numpy无法确定是要判断「所有元素都大于1」还是「存在元素大于1」,因此抛出歧义错误。
解决方案
推荐使用numpy向量化操作替代if判断,效率更高,也适配pymoo的批量计算逻辑,把joist_h_des函数里的if分支用np.where替换即可:
def joist_h_des(b, h): defCHK = 581818181/(b*h**3/12)/50 # 批量处理数组:大于1的元素设为0,其余保留原值 defCHK = np.where(defCHK > 1, 0, defCHK) return defCHK
如果后续需要写更复杂的逐个体判断逻辑,也可以遍历X的每一行单独计算,缺点是运行效率更低,示例如下:
def _evaluate(self, X, out, *args, **kwargs): f1 = [] # 逐行遍历每个个体计算f1 for x in X: f1.append(-joist_h_des(x[0], x[1])) f1 = np.array(f1) f2 = X[:, 0] * X[:, 1] g1 = ((X[:, 0] * X[:, 1])-200000) g2 = - (X[:, 0] * X[:, 1])-60000 out["F"] = np.column_stack([f1, f2]) out["G"] = np.column_stack([g1, g2])
额外优化提示
你当前代码里的约束g2 = - (X[:, 0] * X[:, 1])-60000,按照pymoo默认「g<=0为可行」的规则,等价于要求X[:,0]*X[:,1] >= -60000,这个约束永远成立没有实际意义。如果你是要限制截面面积不小于60000,可以修改为g2 = 60000 - X[:,0] * X[:,1]。
内容的提问来源于stack exchange,提问作者rsc
相关产品推荐
相关产品推荐

