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

如何在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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.26 14:43:10