如何在MATLAB中定义y=(x-1)²函数并通过Python遗传算法优化
一、MATLAB中定义目标函数y=(x-1)²
方式1:脚本内匿名函数(适合简单函数)
直接在MATLAB脚本中定义,快速调用:
% 定义匿名函数,支持向量输入 y = @(x) (x - 1).^2; % 测试函数输出 test_x = 2; disp(['x=', num2str(test_x), '时,y=', num2str(y(test_x))]);
方式2:独立函数文件(适合复杂逻辑)
新建my_obj_fun.m文件,可扩展多行复杂计算:
function output = my_obj_fun(x) % 支持批量计算,适配遗传算法的种群输入 output = (x - 1).^2; end
二、Python遗传算法优化实现(适配复杂场景)
你当前用的Ipopt是梯度类优化器,遗传算法属于无梯度启发式算法,更适合非凸、多模态、无解析梯度的复杂问题。以下提供两种实用方案:
方案1:保持Pyomo建模习惯,用遗传算法求解器
Pyomo有官方遗传算法扩展,无需改变建模逻辑:
步骤1:安装依赖
pip install pyomo[ga]
步骤2:实现代码
import pyomo.environ as pyo # 1. 构建Pyomo模型(与你原有代码一致) model = pyo.ConcreteModel() model.x = pyo.Var(bounds=(-3, 3)) x = model.x def my_function(x): return (x - 1)**2 model.obj = pyo.Objective(expr=my_function(x), sense=pyo.minimize) # 2. 调用遗传算法求解器 from pyomo.contrib.ga import GeneticAlgorithm ga = GeneticAlgorithm(model) # 配置算法参数(可根据复杂场景调整) ga.options['max_generations'] = 40 ga.options['population_size'] = 50 ga.solve() # 3. 输出结果 x_value = pyo.value(model.x) print(f'最优解x = {x_value:.4f}') print(f'目标函数值 = {pyo.value(model.obj):.4f}')
方案2:用DEAP框架自定义遗传算法(灵活适配复杂场景)
DEAP是Python最常用的遗传算法框架,支持自定义编码、交叉、变异逻辑,应对多变量、带约束的复杂问题更灵活:
步骤1:安装依赖
pip install deap
步骤2:实现代码
import random from deap import base, creator, tools, algorithms # 1. 定义优化目标:最小化目标函数 creator.create("FitnessMin", base.Fitness, weights=(-1.0,)) # 权重-1表示最小化 creator.create("Individual", list, fitness=creator.FitnessMin) # 2. 初始化个体与种群 toolbox = base.Toolbox() # 定义变量x的范围:[-3, 3],采用实数编码 toolbox.register("attr_float", random.uniform, -3, 3) # 生成个体(单变量,多变量时修改n值) toolbox.register("individual", tools.initRepeat, creator.Individual, toolbox.attr_float, n=1) # 生成种群 toolbox.register("population", tools.initRepeat, list, toolbox.individual) # 3. 定义目标函数(可替换为任意复杂逻辑) def eval_obj(individual): x = individual[0] return (x - 1)**2, # 返回元组,适配DEAP接口 toolbox.register("evaluate", eval_obj) # 4. 定义遗传操作 toolbox.register("mate", tools.cxBlend, alpha=0.5) # 实数交叉 toolbox.register("mutate", tools.mutGaussian, mu=0, sigma=0.5, indpb=0.2) # 高斯变异 toolbox.register("select", tools.selTournament, tournsize=3) # 锦标赛选择 # 5. 运行遗传算法 def main(): random.seed(42) # 设置随机种子,保证结果可复现 pop = toolbox.population(n=50) # 种群规模 CXPB, MUTPB, NGEN = 0.7, 0.2, 40 # 交叉概率、变异概率、进化代数 # 评估初始种群 fitnesses = list(map(toolbox.evaluate, pop)) for ind, fit in zip(pop, fitnesses): ind.fitness.values = fit # 迭代进化 for g in range(NGEN): print(f"第 {g+1} 代进化") # 选择下一代个体 offspring = toolbox.select(pop, len(pop)) offspring = list(map(toolbox.clone, offspring)) # 交叉操作 for child1, child2 in zip(offspring[::2], offspring[1::2]): if random.random() < CXPB: toolbox.mate(child1, child2) del child1.fitness.values del child2.fitness.values # 变异操作 for mutant in offspring: if random.random() < MUTPB: toolbox.mutate(mutant) del mutant.fitness.values # 评估新生成的个体 invalid_ind = [ind for ind in offspring if not ind.fitness.valid] fitnesses = map(toolbox.evaluate, invalid_ind) for ind, fit in zip(invalid_ind, fitnesses): ind.fitness.values = fit # 更新种群 pop[:] = offspring # 输出最优解 best_ind = tools.selBest(pop, 1)[0] print(f"\n最优解:x = {best_ind[0]:.4f},目标函数值 = {best_ind.fitness.values[0]:.4f}") if __name__ == "__main__": main()
三、复杂场景适配要点
- 多变量优化:DEAP中修改
n=1为变量个数;Pyomo中新增model.x2、model.x3等变量即可。 - 约束处理:DEAP中可给违反约束的个体添加惩罚项(比如目标函数值+1000);Pyomo中直接定义
model.con1 = pyo.Constraint(expr=...),遗传算法会自动处理。 - 复杂函数逻辑:将目标函数的计算逻辑封装为独立函数,可调用外部程序(比如用
matlab.engine调用MATLAB中的复杂函数)。
内容的提问来源于stack exchange,提问作者MENG
相关产品推荐
相关产品推荐

