Pymoo 0.6.1混合变量类型优化问题报错求助
解决pymoo 0.6.1中MixedVariableGA求解混合变量的TypeError问题
问题场景与报错
使用pymoo 0.6.1版本求解混合变量优化问题:
- 自定义
Problem类包含两类变量:Real类型的体积分数变量、Choice类型的角度变量 - 采用
MixedVariableGA算法求解
运行时触发如下类型错误:
TypeError: '>=' not supported between instances of 'dict' and 'dict'
错误源于pymoo采样模块尝试对dict类型变量执行>=比较操作。
核心代码片段:
class Problem(ElementwiseProblem): def __init__(self): vol_frac_vars = {'vol_frac_' + str(i): Real(bounds=(0, 1)) for i in range(LAM_NUM)} theta_vars = {'theta_' + str(i): Choice(options=[-45, 0, 45, 90]) for i in range(LAM_NUM)} vars = {**vol_frac_vars, **theta_vars} super().__init__(vars=vars, n_obj=1, n_eq_constr=0, n_ieq_constr=1) # 省略_evaluate方法实现 algorithm = MixedVariableGA(pop_size=100, n_offsprings=10, sampling=FloatRandomSampling(), crossover=SBX(prob=0.9, eta=15), mutation=PM(eta=20), eliminate_duplicates=True)
问题原因
你使用的FloatRandomSampling是针对连续浮点变量设计的采样器,无法适配dict形式定义的混合变量。在内部逻辑中,该采样器会尝试对整个变量dict做数值比较,导致类型不兼容错误。此外,SBX交叉算子和PM突变算子仅适用于连续变量,同样无法处理Choice类型变量。
解决方法
必须使用适配混合变量的算子组合,替换采样、交叉、突变算子:
修正后的代码
from pymoo.algorithms.soo.nonconvex.ga import MixedVariableGA from pymoo.core.variable import Real, Choice from pymoo.problems.elementwise import ElementwiseProblem from pymoo.operators.sampling.rnd import MixedVariableSampling from pymoo.operators.crossover.mixed import MixedVariableCrossover from pymoo.operators.mutation.mixed import MixedVariableMutation from pymoo.operators.crossover.sbx import SBX from pymoo.operators.mutation.pm import PM class Problem(ElementwiseProblem): def __init__(self): vol_frac_vars = {'vol_frac_' + str(i): Real(bounds=(0, 1)) for i in range(LAM_NUM)} theta_vars = {'theta_' + str(i): Choice(options=[-45, 0, 45, 90]) for i in range(LAM_NUM)} vars = {**vol_frac_vars, **theta_vars} super().__init__(vars=vars, n_obj=1, n_eq_constr=0, n_ieq_constr=1) def _evaluate(self, x, out, *args, **kwargs): # 实现你的目标函数与约束逻辑 out["F"] = sum(x[f'vol_frac_{i}'] for i in range(LAM_NUM)) out["G"] = [-sum(x[f'theta_{i}'] for i in range(LAM_NUM))] # 为不同变量类型分配对应的交叉算子 crossover = MixedVariableCrossover( operators={ Real: SBX(prob=0.9, eta=15), Choice: None # Choice类型默认不交叉,可按需替换为对应交叉算子 } ) # 为不同变量类型分配对应的突变算子 mutation = MixedVariableMutation( operators={ Real: PM(eta=20), Choice: None # Choice类型默认随机突变,可按需替换为对应突变算子 } ) # 使用混合变量专用采样器与算子 algorithm = MixedVariableGA( pop_size=100, n_offsprings=10, sampling=MixedVariableSampling(), crossover=crossover, mutation=mutation, eliminate_duplicates=True )
关键修改点说明
- 采样器替换:用
MixedVariableSampling替代FloatRandomSampling,该采样器会根据变量类型自动选择对应采样逻辑,避免对dict执行非法比较。 - 交叉/突变算子适配:用
MixedVariableCrossover和MixedVariableMutation包裹原有连续变量算子,同时为Choice类型变量指定合适的算子(或留空使用默认逻辑)。
内容的提问来源于stack exchange,提问作者bbk
相关产品推荐
相关产品推荐

