如何将黑箱模型转换为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
相关产品推荐
相关产品推荐

