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

基于已训练Keras ANN模型 寻找生成最优多输出的输入组合方案问询

基于预训练Keras ANN模型的多目标遗传算法寻优实现方案

你当前的需求属于典型的带黑盒目标函数的多目标优化问题,目标函数就是你已经训练完成的Keras ANN模型,输入为10个X变量,输出为3个Y变量,优化方向为min(Y1)、max(Y2)、min(Y3),遗传算法是这类问题非常适配的解法,具体实现思路和实操代码如下:

核心实现步骤

  • 第一步:先明确10个输入项X1~X10的取值约束:每个X是连续值还是离散值?取值上下限是多少?有没有交叉约束(比如X1+X2不能超过固定阈值)?这是遗传算法编码的核心前提。
  • 第二步:确定多目标优化的判定规则:如果你对三个目标的优先级有明确要求,可以给三个目标加权计算综合适应度得分,直接输出单个最优解;如果需要得到多个非支配的可选最优方案,可直接用NSGA-II这类成熟的多目标遗传算法输出帕累托最优解集。
  • 第三步:封装适应度函数:把训练好的Keras模型封装成遗传算法可以直接调用的函数,输入是单个个体的10个X取值,输出是适应度得分(注意遗传算法默认求解最大值,所以如果是要最小化Y1和Y3,需要做符号反转处理)。
  • 第四步:设置遗传算法参数迭代寻优:配置种群规模、迭代次数、交叉概率、变异概率等参数,运行迭代直到收敛,输出最优的X组合。

实操代码示例

你需要先安装deap、numpy、tensorflow三个依赖包,以下代码可直接修改适配你的项目:

import numpy as np
from deap import base, creator, tools, algorithms
import tensorflow as tf

# 加载你已经训练好的Keras模型,替换成你自己的模型路径
model = tf.keras.models.load_model("your_trained_ann.h5")

# 1. 定义问题:多目标优化权重分别对应Y1(最小化)、Y2(最大化)、Y3(最小化)
creator.create("FitnessMulti", base.Fitness, weights=(-1.0, 1.0, -1.0))
creator.create("Individual", list, fitness=creator.FitnessMulti)

# 2. 定义X1~X10的取值范围,示例为每个X都是0-1之间的连续值,可替换成你自己的上下限
X_BOUNDS = [(0, 1) for _ in range(10)]
toolbox = base.Toolbox()

# 3. 注册个体和种群生成方法
for i in range(10):
    toolbox.register(f"attr_{i}", np.random.uniform, X_BOUNDS[i][0], X_BOUNDS[i][1])
toolbox.register("individual", tools.initCycle, creator.Individual,
                 (getattr(toolbox, f"attr_{i}") for i in range(10)), n=1)
toolbox.register("population", tools.initRepeat, list, toolbox.individual)

# 4. 定义适应度评估函数
def evaluate(individual):
    x = np.array(individual).reshape(1, -1)
    y1, y2, y3 = model.predict(x, verbose=0)[0]
    # 返回三个目标值,和之前定义的权重一一对应
    return (y1, y2, y3)

toolbox.register("evaluate", evaluate)
# 注册遗传操作算子
toolbox.register("mate", tools.cxBlend, alpha=0.5)
toolbox.register("mutate", tools.mutPolynomialBounded, low=[b[0] for b in X_BOUNDS], 
                 up=[b[1] for b in X_BOUNDS], eta=0.5, indpb=0.2)
toolbox.register("select", tools.selNSGA2)

# 5. 运行遗传算法
if __name__ == "__main__":
    pop = toolbox.population(n=100) # 种群规模可根据算力调整
    hof = tools.ParetoFront() # 保存帕累托最优解集
    stats = tools.Statistics(lambda ind: ind.fitness.values)
    stats.register("avg", np.mean, axis=0)
    stats.register("min", np.min, axis=0)
    stats.register("max", np.max, axis=0)

    pop, log = algorithms.eaSimple(pop, toolbox, cxpb=0.5, mutpb=0.2, ngen=50, 
                                   stats=stats, halloffame=hof, verbose=True)
    
    # 输出最优的几个输入组合和对应的输出
    print("最优输入组合(X1~X10)及对应输出(Y1,Y2,Y3):")
    for ind in hof:
        print(f"X: {[round(x,4) for x in ind]},Y: {evaluate(ind)}")

注意事项

  • 如果你的X有离散取值,只需要把生成个体的方法从np.random.uniform改成对应的离散值生成方法即可,变异算子也对应调整为离散变异算子。
  • 权重可根据你对三个目标的优先级调整,比如Y2的重要性是其他目标的两倍,就把weights里Y2对应的权重改成2.0。
  • 如果不需要多个可选方案,只需要单个最优组合,可直接将多目标合并为单目标加权求和,修改适应度定义即可,不需要使用NSGA-II选择算子。
  • 种群规模和迭代次数可根据你的算力调整,输入维度越高通常需要的种群和迭代次数越大。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.06 13:18:03