博客
关于我
【车间调度】多层编码遗传算法求解车间调度问题【Matlab 016期】
阅读量:713 次
发布时间:2019-03-21

本文共 2617 字,大约阅读时间需要 8 分钟。

遗传算法概述及实现技术

简介

遗传算法(Genetic Algorithm, GA)是进化计算领域的一种重要 模型,通过模拟生物自然选择和进化过程,用于解决复杂系统优化问题。其算法简单、通用且具备强大的鲁棒性,广泛应用于多个领域,如函数优化、生产调度、机器学习等。

特点及应用

遗传算法的核心在于其独特的搜索策略:

  • 编码处理:将决策变量编码为易于操作的形式(如二进制、浮点等),模仿遗传信息的传递。
  • 适应度评估:直接使用目标函数值评估个体优劣,无需依赖梯度或其他复杂信息。
  • 多个体帮手:通过种群多个体进行同时搜索,有效避免局部最优陷阱。
  • 概率规则:运用随机机选择和遗传操作,增强搜索灵活性和全局优化能力。
  • 基本流程

    遗传算法通常包含以下步骤:

  • 编码:将问题解空间中的每个解编码为染色体,初始种群随机生成。
  • 适应度评估:通过适应度函数(如目标函数值),筛选优质解。
  • 遗传操作:包括选择、交叉和变异,生成新一代种群。
  • 迭代优化:直到达到停止准则,输出最优解。
  • 实现技术

    遗传算法实现常涉及以下关键环节:

  • 编码

    • 二进制编码:简单且易实现,适合二值问题。
    • 其他编码:如浮点数、符号编码等,可适应不同问题。
  • 适应度函数设计:需反映目标函数的最优方向,确保评价准确。

  • 选择算子:通过适应度排序,如线性或非线性排名,选出优质个体参与遗传。

  • 交叉算子:通过基因重组产生新个体,提升多样性和全局搜索能力。

  • 变异算子:故意引入有利突变,增加解的多样性。

  • 运行参数:包括种群规模、遗传代数、交叉率、变异率等,调节搜索策略。

  • 原理解析

    遗传算法主要基于以下理论:

  • 模式定理:表明优质基因片段(积木块)能通过遗传操作拼接,形成更优解。
  • 积木块假设:种群通过不断积木块重组,逐步逼近最优解,理论基础为适应度的逐步提升。
  • 运行实例

    通过对生产调度问题的应用中,遗传算法展示了其优越性。初始种群通过编码生成各工序分配方案,适应度评估后,通过选择、交叉和变异操作逐步优化,直至达到最优。

    工具基础

    遗传算法暴力搜索空间,常用编程语言如Matlab、Python等实现。具体实现需注意代码结构,确保正确执行遗传算子和适应度评估。

    代码解析

    以下为Matlab代码示例,主要包含参数设置、种群初始化、适应度评估及遗传操作步骤:

    %% 清空环境
    clc
    clear
    %% 导入数据
    load scheduleData Jm T JmNumber
    %% 基本参数
    NIND = 40; % 种群规模
    MAXGEN = 50; % 最大遗传代数
    GAP = 0.9; % 遗传代步长
    CROSS_RATE = 0.8; % 交叉率
    MUT_RATE = 0.6; % 变异率
    %% 数据准备
    [PNumber, MNumber] = size(Jm);
    trace = zeros(2, MAXGEN); % 记录等待优化结果
    WNumber = PNumber * MNumber; % 工序总数
    %% 初始化编码
    Number = zeros(1, PNumber);
    for i = 1:PNumber
    Number(i) = MNumber; % 初始化为工序个数
    end
    % 两层编码
    Chrom = zeros(NIND, 2 * WNumber);
    for j = 1:NIND
    WPNumberTemp = Number;
    for i = 1:WNumber
    val = round(unidrnd(PNumber)); % 随机生成工序
    while WPNumberTemp(val) == 0
    val = round(unidrnd(PNumber));
    end
    Chrom(j, i) = val;
    WPNumberTemp(val) = WPNumberTemp(val) - 1; % 减少剩余工序
    Temp = Jm{val, MNumber - WPNumberTemp(val)}; % 选择机器
    Machine = round(unidrnd(length(Temp)));
    Chrom(j, i + WNumber) = Machine;
    end
    end
    %% 计算目标函数值
    [PVal, ObjV, P, S] = cal(Chrom, JmNumber, T, Jm);
    % 迭代优化开始
    while gen <= MAXGEN
    % 评估适应度
    fitnv = ranking(ObjV);
    % 选择操作
    [selCh, fitnv] =-select(Jm, MUT Rate, Jm, T);
    % 遗传操作
    [Chrom, FitnV] = crossover(selCh, Gap, Chrom, MutRate);
    [Chrom, FitnV] = mutation(Chrom, MutRate);
    % 计算新适应度
    [Pval, Objvsel, P, S] = cal(Chrom, JmNumber, T, Jm);
    % 更新代计数器
    gen = gen + 1;
    % 记录最优值
    if gen == MAXGEN
    trace(1,) = mean(ObjV);
    minVal = trace(1,);
    STemp = S;
    end
    end
    %% 画图
    figure(1)
    plot(trace(1:))
    hold on
    plot(trace(2:), '-')
    grid
    legend('解的变化', '种群均值的变化')
    ## 运行结果
    通过代码运行结果表明,遗传算法能够在一定代数内有效找到优解。两张图展示了优化过程中的解表现和最终最优值。
    ## 注释
    本文基于遗传算法理论和Matlab示例,旨在为复杂优化问题提供参考实现。完整代码可根据需求补充细节,或按需调整参数间隔值。

    转载地址:http://mqnrz.baihongyu.com/

    你可能感兴趣的文章
    Netty工作笔记0085---TCP粘包拆包内容梳理
    查看>>
    Netty常用组件一
    查看>>
    Netty常见组件二
    查看>>
    netty底层源码探究:启动流程;EventLoop中的selector、线程、任务队列;监听处理accept、read事件流程;
    查看>>
    Netty心跳检测机制
    查看>>
    Netty核心模块组件
    查看>>
    Netty框架内的宝藏:ByteBuf
    查看>>
    Netty框架的服务端开发中创建EventLoopGroup对象时线程数量源码解析
    查看>>
    Netty源码—2.Reactor线程模型一
    查看>>
    Netty源码—3.Reactor线程模型三
    查看>>
    Netty源码—4.客户端接入流程一
    查看>>
    Netty源码—4.客户端接入流程二
    查看>>
    Netty源码—5.Pipeline和Handler一
    查看>>
    Netty源码—5.Pipeline和Handler二
    查看>>
    Netty源码—6.ByteBuf原理一
    查看>>
    Netty源码—6.ByteBuf原理二
    查看>>
    Netty源码—7.ByteBuf原理三
    查看>>
    Netty源码—7.ByteBuf原理四
    查看>>
    Netty源码—8.编解码原理一
    查看>>
    Netty源码—8.编解码原理二
    查看>>