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

如何将黑箱模型转换为GA等优化算法实现带约束的y值最小化?

黑箱模型结合遗传算法实现带约束的目标优化

核心需求

已有黑箱模型 ( y = f(x_1, x_2, ..., x_n) )(示例为RandomForestRegressor),需将其整合进遗传算法(GA),对输入变量 ( x_1, x_2, ..., x_n ) 设置约束,实现预测值 ( y_{pred} ) 的最小化。

实现思路与代码示例

步骤1:训练黑箱模型

先完成RandomForestRegressor的训练,确保模型能稳定输出预测结果:

# 导入依赖库
from sklearn.model_selection import train_test_split
from sklearn.ensemble import RandomForestRegressor

# 划分训练集与测试集
x_train, x_test, y_train, y_test = train_test_split(x, y, test_size=0.25, shuffle=True, random_state=0)

# 初始化并训练模型
model = RandomForestRegressor(n_estimators=200, min_samples_split=2, min_samples_leaf=2, max_depth=20)
model.fit(x_train, y_train)

步骤2:结合遗传算法实现带约束优化

使用deap库(专门用于进化算法的Python工具库)搭建遗传算法框架,核心是定义适应度函数、变量约束和进化流程:

import random
from deap import base, creator, tools, algorithms

# 定义优化目标:最小化y_pred,因此权重设为-1
creator.create("FitnessMin", base.Fitness, weights=(-1.0,))
creator.create("Individual", list, fitness=creator.FitnessMin)

# 定义输入变量的约束范围:示例为x₁∈[0,10]、x₂∈[2,15],可根据实际需求调整
var_bounds = [(0, 10), (2, 15), ...]  # 每个元组对应一个x_n的上下限

toolbox = base.Toolbox()
# 为每个变量注册随机初始化方法
for i, bounds in enumerate(var_bounds):
    toolbox.register(f"attr_x{i}", random.uniform, bounds[0], bounds[1])

# 生成个体:按变量顺序组合成一组输入
toolbox.register("individual", tools.initCycle, creator.Individual,
                 (toolbox.attr_x0, toolbox.attr_x1, ...), n=1)
# 生成种群
toolbox.register("population", tools.initRepeat, list, toolbox.individual)

# 定义适应度函数:输入一组变量,返回模型预测的y_pred
def evaluate(individual):
    x_input = [individual]
    y_pred = model.predict(x_input)[0]
    return (y_pred,)

toolbox.register("evaluate", evaluate)
# 定义遗传操作:交叉、变异、选择
toolbox.register("mate", tools.cxBlend, alpha=0.5)
toolbox.register("mutate", tools.mutPolynomialBounded, low=[b[0] for b in var_bounds],
                 up=[b[1] for b in var_bounds], eta=20.0, indpb=0.2)
toolbox.register("select", tools.selTournament, tournsize=3)

# 运行遗传算法
def run_ga():
    random.seed(42)
    pop = toolbox.population(n=50)  # 种群规模
    hof = tools.HallOfFame(1)  # 保留最优个体
    stats = tools.Statistics(lambda ind: ind.fitness.values)
    stats.register("avg", lambda x: sum(x)/len(x))
    stats.register("min", min)
    
    pop, log = algorithms.eaSimple(pop, toolbox, cxpb=0.5, mutpb=0.2, ngen=100,
                                   stats=stats, halloffame=hof, verbose=True)
    return hof[0], log

# 执行优化流程
best_ind, log = run_ga()
print("最优输入变量组合:", best_ind)
print("最小预测值y_pred:", model.predict([best_ind])[0])

关键说明

  • 约束处理:通过var_bounds定义每个变量的取值范围,变异操作mutPolynomialBounded确保变异后的值不会超出约束;交叉操作也可按需调整,避免生成违反约束的个体。
  • 适应度函数:直接调用训练好的黑箱模型做预测,将预测值作为适应度指标,直接对应“最小化y_pred”的目标。
  • 参数调优:种群规模、交叉概率(cxpb)、变异概率(mutpb)、进化代数(ngen)等参数可根据实际问题调整,平衡优化效果与计算效率。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.13 23:55:19