You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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
)

关键修改点说明

  1. 采样器替换:用MixedVariableSampling替代FloatRandomSampling,该采样器会根据变量类型自动选择对应采样逻辑,避免对dict执行非法比较。
  2. 交叉/突变算子适配:用MixedVariableCrossover和MixedVariableMutation包裹原有连续变量算子,同时为Choice类型变量指定合适的算子(或留空使用默认逻辑)。

内容的提问来源于stack exchange,提问作者bbk

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.28 18:10:31