遗传算法(Genetic Algorithm, GA)是一类借鉴达尔文生物进化论思想的智能优化算法,其核心在于模拟自然界中 "物竞天择、适者生存" 的遗传与进化机制。在算法中,待求解问题的每个潜在解被抽象为 "个体"(或 "染色体"),解的关键参数则对应染色体上的 "基因"。通过模拟生物进化中的选择、交叉和变异过程,算法不断迭代优化种群,最终筛选出逼近最优解的个体。
一、遗传算法核心实现(属性约简场景)
以下为基于 MATLAB 的遗传算法用于属性约简的核心代码,通过二进制编码表示特征子集(1 表示选中该特征,0 表示剔除),实现对最优特征组合的搜索:
            
            
              matlab
              
              
            
          
          function [overtime,red,year] = Cal_GA(data,parameter,threshold,length_threshold)
%CAL_INHERIT 遗传算法求属性约简
%   输入:data(数据集,含特征与标签)、parameter(适应度函数参数)、
%         threshold(收敛阈值)、length_threshold(特征选择比例阈值)
%   输出:overtime(运行时间)、red(最优特征子集)、year(迭代次数)
% 记录时间
start=tic;
[~,n]=size(data);
% 初始种群数量
pop_size=xxx;
% 最大迭代次数(繁衍上限)
pop_limit=xxx;
% 种群基因编码长度(最后一列为标签,故特征数为n-1)
Length=n-1;
% 交叉概率(平衡全局与局部搜索)
pc=xxx;
% 变异概率(维持种群多样性)
pm=xxx;
% 生成初始种群(确保特征选择数量不低于阈值)
pop=zeros(pop_size,Length);
tmp_length=length_threshold*Length;
for i=1:pop_size
    while sum(pop(i,:),2)<tmp_length
        t_index=ceil(rand*Length);
        pop(i,t_index)=1;
    end
end
% 计算初始适应度(以全特征子集为基准)
rawpos=fitness(data,ones(1,n-1),parameter);
year=0;
for i=1:size(pop,1)
    pop_quality(i,1)=fitness(data,pop(i,:),parameter);
end
% 迭代优化主循环
tmppos=-1000; % 初始最优适应度
while (tmppos<threshold*rawpos)&&(year<pop_limit)
    %% 基因选择:保留优质个体
    [pop]=selection(pop,pop_quality);
    
    %% 基因交叉:重组基因片段
    [pop]=crossover(pop,pc);
    
    %% 基因变异:引入随机变化
    [pop]=mutation(pop,pm);
    
    %% 评估新种群适应度
    for i=1:size(pop,1)
        pop_quality(i,1)=fitness(data,pop(i,:),parameter);
    end
    [tmppos,index]=max(pop_quality); % 记录当前最优适应度及对应个体
    red=pop(index,:);
    year=year+1;
end
overtime=toc(start);
end
        二、关键参数设置指南
遗传算法的性能高度依赖参数配置,以下为经过实践验证的参数范围及调整原则:
| 参数名称 | 符号 | 推荐范围 | 调整逻辑 | 
|---|---|---|---|
| 种群大小 | pop_size | 20~200 | 特征维度高时取 100 | 
| 迭代次数 | pop_limit | 50~500 | 问题复杂度高时增加(如 500),简单场景可减少(如 50) | 
| 交叉概率 | pc | 0.6~0.9 | 高概率(如 0.9)促进全局探索,低概率(如 0.6)侧重局部精细化搜索 | 
| 变异概率 | pm | 0.01~0.1 | 过低易导致 "早熟收敛"(种群多样性不足),过高则破坏优质基因结构 | 
三、核心操作解析
遗传算法的迭代优化通过选择、交叉、变异三大操作实现,三者协同维持种群多样性与进化方向:
- 选择操作:优胜劣汰,保留优质基因
选择的核心是让适应度高的个体更易被保留为父代。代码中采用 "轮盘赌选择法",个体被选中的概率与其适应度成正比,同时引入 "精英保留" 策略(将最优个体直接复制到下一代,避免优质基因丢失)。 
            
            
              matlab
              
              
            
          
                function newpop = selection(pop, pop_quality)
          [m, ~] = size(pop);
          % 处理负适应度(确保概率非负)
          min_fit = min(pop_quality);
          if min_fit < 0
              pop_quality = pop_quality - min_fit + eps;
          end
          % 计算累积概率并进行轮盘赌选择
          total_fit = sum(pop_quality);
          if total_fit == 0
              indices = randperm(m); % 适应度为0时随机选择
              newpop = pop(indices, :);
              return;
          end
          cum_probs = cumsum(pop_quality) / total_fit;
          rand_vals = rand(m, 1);
          newpop = zeros(size(pop));
          for i = 1:m
              idx = find(cum_probs >= rand_vals(i), 1, 'first');
              newpop(i, :) = pop(idx, :);
          end
          % 精英保留:用最优个体替换最差个体
          [~, best_idx] = max(pop_quality);
          [~, worst_idx] = min(pop_quality);
          newpop(worst_idx, :) = pop(best_idx, :);
      end
        - 
交叉操作:基因重组,产生新个体
交叉模拟生物繁殖中的基因重组,通过交换两个父代个体的部分基因片段生成子代。代码中采用 "单点交叉":随机选择一个交叉点,交换该点两侧的基因序列。
matlabfunction [pop] = crossover(pop, pc) [m, n] = size(pop); newpop = zeros(size(pop)); for i = 1:2:m-1 if rand < pc % 以概率pc触发交叉 cpoint = randi(n-1); % 随机选择交叉点 newpop(i,:) = [pop(i, 1:cpoint), pop(i+1, cpoint+1:n)]; newpop(i+1,:) = [pop(i+1, 1:cpoint), pop(i, cpoint+1:n)]; else newpop(i,:) = pop(i,:); newpop(i+1,:) = pop(i+1,:); end end if mod(m, 2) == 1 % 处理奇数种群 newpop(m,:) = pop(m,:); end end - 
变异操作:随机突变,维持种群多样性
变异通过随机翻转个体的某个基因(0→1 或 1→0)引入新的基因组合,避免种群陷入局部最优。变异概率通常较低,以平衡 "探索新解" 与 "保留优质解"。
 
            
            
              matlab
              
              
            
          
                  function [newpop] = mutation(pop, pm)
            [m, n] = size(pop);
            newpop = pop;
            for i = 1:m
                if rand < pm % 以概率pm触发变异
                    index = ceil(rand * n); % 随机选择变异位置
                    newpop(i, index) = ~pop(i, index); % 二进制位翻转
                end
            end
        end
        总结:遗传算法的核心价值
遗传算法通过模拟自然进化过程,无需依赖问题的数学特性(如连续性、可导性),即可高效搜索复杂解空间,尤其适用于属性约简、路径规划、参数优化等传统方法难以解决的问题。其关键在于合理配置参数(种群大小、交叉 / 变异概率等)及设计适配问题场景的适应度函数,以平衡搜索效率与解的质量。通过选择、交叉、变异的协同作用,算法能够在迭代中不断逼近最优解,展现出强大的全局优化能力。