【Matlab】智能优化算法_遗传算法GA

这篇具有很好参考价值的文章主要介绍了【Matlab】智能优化算法_遗传算法GA。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

1.背景介绍

遗传算法(Genetic Algorithm,简称GA)是一种基于生物进化理论的优化算法,由John Holland于20世纪70年代初提出。它通过模拟自然选择和遗传机制,利用群体中个体之间的遗传信息交流和变异来搜索问题的解空间。

遗传算法的设计灵感来源于达尔文的进化论。达尔文提出,自然界中的生物通过遗传信息的传递和变异,逐步适应环境并进化。类似地,遗传算法通过对问题解空间中的个体进行选择、交叉和变异操作,模拟了生物进化的过程,以寻找问题的最优解或次优解。

2.数学模型

遗传算法的核心思想是通过不断迭代的过程,从初始的随机个体群体出发,通过选择、交叉和变异操作产生新一代的个体群体,使得群体中的个体逐渐适应环境并优化问题的目标函数。具体而言,遗传算法的步骤如下:

  1. 初始化:随机生成初始的个体群体,代表解空间中的潜在解。
  2. 评估:根据问题的目标函数,对每个个体进行评估,计算其适应度值,表示解的优劣程度。
  3. 选择:根据适应度值,选择优秀的个体作为父代,用于产生下一代的个体。选择策略可以是轮盘赌选择、竞争选择等。
  4. 交叉:从父代个体中选取一对个体,通过交叉操作产生新的个体,将两个个体的染色体信息进行混合。
  5. 变异:对新生成的个体进行变异操作,引入随机性,增加搜索空间的多样性。
  6. 更新:用新生成的个体替换原有的个体群体,形成下一代个体群体。
  7. 终止条件:通过设定的终止条件,如达到最大迭代次数、目标函数值达到一定阈值等,判断算法是否停止。
  8. 返回最优解:遗传算法迭代完成后,返回适应度值最高的个体作为问题的解。

遗传算法具有全局搜索能力、自适应性和鲁棒性,适用于各种优化问题,尤其在复杂、多模态和高维的问题中表现出色。它在工程、运筹学、人工智能等领域都有广泛应用,并衍生出许多变种算法和改进方法,如遗传编程、进化策略等。

3.文件结构

【Matlab】智能优化算法_遗传算法GA,# 智能优化算法,matlab,算法

crossover.m						% 交叉育种
elitism.m						% 精英化
GeneticAlgorithm.m				% 遗传算法
initialization.m				% 初始化
Main.m							% 主函数
mutation.m						% 变异
selection.m						% 选择
Sphere.m						% 

4.详细代码及注释

4.1 crossover.m

function [child1 , child2] = crossover(parent1 , parent2, Pc, crossoverName)

switch crossoverName
    case 'single'
        Gene_no = length(parent1.Gene);
        ub = Gene_no - 1;
        lb = 1;
        Cross_P = round (  (ub - lb) *rand() + lb  );
        
        Part1 = parent1.Gene(1:Cross_P);
        Part2 = parent2.Gene(Cross_P + 1 : Gene_no);
        child1.Gene = [Part1, Part2];
        
        Part1 = parent2.Gene(1:Cross_P);
        Part2 = parent1.Gene(Cross_P + 1 : Gene_no);
        child2.Gene = [Part1, Part2];
        
        
    case 'double'
        Gene_no = length(parent1);
       
        ub = length(parent1.Gene) - 1;
        lb = 1;
        Cross_P1 = round (  (ub - lb) *rand() + lb  );
        
        Cross_P2 = Cross_P1;
        
        while Cross_P2 == Cross_P1
            Cross_P2 = round (  (ub - lb) *rand() + lb  );
        end
        
        if Cross_P1 > Cross_P2
            temp =  Cross_P1;
            Cross_P1 =  Cross_P2;
            Cross_P2 = temp;
        end

        Part1 = parent1.Gene(1:Cross_P1);
        Part2 = parent2.Gene(Cross_P1 + 1 :Cross_P2);
        Part3 = parent1.Gene(Cross_P2+1:end);
        
        child1.Gene = [Part1 , Part2 , Part3];
        
        
        Part1 = parent2.Gene(1:Cross_P1);
        Part2 = parent1.Gene(Cross_P1 + 1 :Cross_P2);
        Part3 = parent2.Gene(Cross_P2+1:end);
        
        child2.Gene = [Part1 , Part2 , Part3];
end

R1 = rand();

if R1 <= Pc
    child1 = child1;
else
    child1 = parent1;
end

R2 = rand();

if R2 <= Pc
    child2 = child2;
else
    child2 = parent2;
end

end

4.2 elitism.m

function [ newPopulation2 ] = elitism(population , newPopulation, Er)

M = length(population.Chromosomes); % number of individuals 
Elite_no = round(M * Er);

[max_val , indx] = sort([ population.Chromosomes(:).fitness ] , 'descend');
    
% The elites from the previous population
for k = 1 : Elite_no
    newPopulation2.Chromosomes(k).Gene  = population.Chromosomes(indx(k)).Gene;
    newPopulation2.Chromosomes(k).fitness  = population.Chromosomes(indx(k)).fitness;
end

% The rest from the new population
for k = Elite_no + 1 :  M
    newPopulation2.Chromosomes(k).Gene  = newPopulation.Chromosomes(k).Gene;
    newPopulation2.Chromosomes(k).fitness  = newPopulation.Chromosomes(k).fitness;
end

end

4.3 GeneticAlgorithm.m

function [BestChrom]  = GeneticAlgorithm (M , N, MaxGen , Pc, Pm , Er , obj, visuailzation)

cgcurve = zeros(1 , MaxGen);

%%  Initialization
[ population ] = initialization(M, N);
for i = 1 : M
    population.Chromosomes(i).fitness = obj( population.Chromosomes(i).Gene(:) );
end

g = 1;
disp(['Generation #' , num2str(g)]);
[max_val , indx] = sort([ population.Chromosomes(:).fitness ] , 'descend');
cgcurve(g) = population.Chromosomes(indx(1)).fitness;

%% Main loop
for g = 2 : MaxGen
    disp(['Generation #' , num2str(g)]);
    % Calcualte the fitness values
    for i = 1 : M
        population.Chromosomes(i).fitness = Sphere( population.Chromosomes(i).Gene(:) );
    end
    
    for k = 1: 2: M
        % Selection
        [ parent1, parent2] = selection(population);
        
        % Crossover
        [child1 , child2] = crossover(parent1 , parent2, Pc, 'single');
        
        % Mutation
        [child1] = mutation(child1, Pm);
        [child2] = mutation(child2, Pm);
        
        newPopulation.Chromosomes(k).Gene = child1.Gene;
        newPopulation.Chromosomes(k+1).Gene = child2.Gene;
    end
    
    for i = 1 : M
        newPopulation.Chromosomes(i).fitness = obj( newPopulation.Chromosomes(i).Gene(:) );
    end
    % Elitism
    [ newPopulation ] = elitism(population, newPopulation, Er);
    
    cgcurve(g) = newPopulation.Chromosomes(1).fitness;
    
    population = newPopulation; % replace the previous population with the newly made
end

   
BestChrom.Gene    = population.Chromosomes(1).Gene;
BestChrom.Fitness = population.Chromosomes(1).fitness;


if visuailzation == 1
    plot( 1 : MaxGen , cgcurve);
    xlabel('Generation');
    ylabel('Fitness of the best elite')
end


end

4.4 initialization.m

function [ population ] = initialization(M, N)

for i = 1 : M
    for j = 1 : N 
        population.Chromosomes(i).Gene(j) = [ round( rand() ) ];
    end
end

4.5 Main.m

clear
clc

%% controling paramters of the GA algortihm
Problem.obj = @Sphere;
Problem.nVar = 20;

M = 20; % number of chromosomes (cadinate solutions)
N = Problem.nVar;  % number of genes (variables)
MaxGen = 100;
Pc = 0.85;
Pm = 0.01;
Er = 0.05;
visualization = 1; % set to 0 if you do not want the convergence curve 

[BestChrom]  = GeneticAlgorithm (M , N, MaxGen , Pc, Pm , Er , Problem.obj , visualization)

disp('The best chromosome found: ')
BestChrom.Gene
disp('The best fitness value: ')
BestChrom.Fitness

4.6 mutation.m

function [child] = mutation(child, Pm)

Gene_no = length(child.Gene);

for k = 1: Gene_no
    R = rand();
    if R < Pm
        child.Gene(k) = ~ child.Gene(k);
    end
end

end

4.7 selection.m

function [parent1, parent2] = selection(population)

M = length(population.Chromosomes(:));

if any([population.Chromosomes(:).fitness] < 0 ) 
    % Fitness scaling in case of negative values scaled(f) = a * f + b
    a = 1;
    b = abs( min(  [population.Chromosomes(:).fitness] )  );
    Scaled_fitness = a *  [population.Chromosomes(:).fitness] + b;
    
    normalized_fitness = [Scaled_fitness] ./ sum([Scaled_fitness]);
else
    normalized_fitness = [population.Chromosomes(:).fitness] ./ sum([population.Chromosomes(:).fitness]);
end



%normalized_fitness = [population.Chromosomes(:).fitness] ./ sum([population.Chromosomes(:).fitness]);

[sorted_fintness_values , sorted_idx] = sort(normalized_fitness , 'descend');

for i = 1 : length(population.Chromosomes)
    temp_population.Chromosomes(i).Gene = population.Chromosomes(sorted_idx(i)).Gene;
    temp_population.Chromosomes(i).fitness = population.Chromosomes(sorted_idx(i)).fitness;
    temp_population.Chromosomes(i).normalized_fitness = normalized_fitness(sorted_idx(i));
end


cumsum = zeros(1 , M);

for i = 1 : M
    for j = i : M
        cumsum(i) = cumsum(i) + temp_population.Chromosomes(j).normalized_fitness;
    end
end


R = rand(); % in [0,1]
parent1_idx = M;
for i = 1: length(cumsum)
    if R > cumsum(i)
        parent1_idx = i - 1;
        break;
    end
end

parent2_idx = parent1_idx;
while_loop_stop = 0; % to break the while loop in rare cases where we keep getting the same index
while parent2_idx == parent1_idx
    while_loop_stop = while_loop_stop + 1;
    R = rand(); % in [0,1]
    if while_loop_stop > 20
        break;
    end
    for i = 1: length(cumsum)
        if R > cumsum(i)
            parent2_idx = i - 1;
            break;
        end
    end
end

parent1 = temp_population.Chromosomes(parent1_idx);
parent2 = temp_population.Chromosomes(parent2_idx);

end

4.8 Sphere.m

function  [fitness_value] = Sphere( X )
  
   
   fitness_value = sum(X.^2);

end

5.运行结果

【Matlab】智能优化算法_遗传算法GA,# 智能优化算法,matlab,算法

6.参考文献

[1]Hayes-Roth F. Review of “Adaptation in Natural and Artificial Systems by John H. Holland”, The U. of Michigan Press, 1975[J]. ACM SIGART Bulletin,1975,53(53).文章来源地址https://www.toymoban.com/news/detail-597882.html

到了这里,关于【Matlab】智能优化算法_遗传算法GA的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 分类预测 | MATLAB实现GA-GRU遗传算法优化门控循环单元的数据多输入分类预测

    效果一览 基本介绍 Matlab实现GA-GRU遗传算法优化门控循环单元的数据多输入分类预测 多特征输入的二分类及多分类模型。程序内注释详细,直接替换数据就可以用。程序语言为matlab,程序可出分类效果图,混淆矩阵图。 程序设计 完整程序和数据下载方式1(资源处直接下载):

    2024年02月11日
    浏览(49)
  • BP神经网络优化 | MATLAB基于遗传算法优化BP神经网络(GA-BP)的预测模型(含完整代码)

    文章目录 前言 一、遗传算法描述 二、优化思路 三、完整代码 预测结果  首先需要安装一下遗传算法工具箱,可参考这篇博客 MATLAB遗传算法工具箱安装包及安装方法(图解)_周杰伦今天喝奶茶了吗的博客-CSDN博客_matlab遗传算法工具箱安装 本模型可以结合自己的数据集进行

    2024年02月02日
    浏览(60)
  • 回归预测 | MATLAB实现GA-LSTM遗传算法优化长短期记忆网络的数据多输入单输出回归预测

    效果一览 基本介绍 MATLAB实现GA-LSTM遗传算法优化长短期记忆网络的数据多输入单输出回归预测 GA-LSTM遗传算法优化长短期记忆网络回归预测(Matlab完整程序和数据) 输入6个特征,输出1个,即多输入单输出; 运行环境Matlab2018及以上,运行主程序main即可,其余为函数文件无需运

    2023年04月09日
    浏览(44)
  • 回归预测 | MATLAB实现GA-ELM遗传算法优化极限学习机多输入单输出回归预测(多指标,多图)

    效果一览 基本介绍 回归预测 | MATLAB实现GA-ELM遗传算法优化极限学习机多输入单输出回归预测(多指标,多图),输入多个特征,输出单个变量,多输入单输出回归预测; 多指标评价,代码质量极高;excel数据,方便替换,运行环境2018及以上。 程序设计 完整源码和数据获取

    2024年02月11日
    浏览(49)
  • 回归预测 | MATLAB实现GA-APSO-IBP改进遗传-粒子群算法优化双层BP神经网络多输入单输出回归预测

    效果一览 基本介绍 MATLAB实现GA-APSO-IBP改进遗传-粒子群算法优化双层BP神经网络多输入单输出回归预测; 程序包含:单隐含层BP神经网络、双层隐含层IBP神经网络、遗传算法优化IBP神经网络、改进遗传-粒子群算法优化IBP神经网络,结果显示改进的遗传-粒子群算法优化结果更佳

    2024年02月10日
    浏览(57)
  • 遗传算法与Matlab GA工具箱

    GA是一种进化算法,基本原理效仿生物界“物竞天择,适者生存”的演化法则。 一些基本概念 种群population:问题潜在的解集 个体individual:每一个可能的解,通过基因编码一定数目的个体形成一个种群 适应度fitness:由此判断个体的优良,进而进行选择 选择selection、交叉cr

    2024年02月09日
    浏览(59)
  • 【MatLab】《遗传算法GA+BP神经网络——电路参数估计》

    根据采样数据训练BP神经网络,用训练好的网络来作为目标函数输出电路参数误差,通过GA寻找误差最小的电路参数值。 BP.m 主函数 BPMod.m 数据处理+训练BP网络 GA.m 遗传算法主函数 BP神经网络训练情况 本模型使用BP神经网络来代理实际电路的输出,因此神经网络的回归效果一定

    2024年02月02日
    浏览(56)
  • 基于遗传算法GA的机器人栅格地图最短路径规划,可以自定义地图及起始点(提供MATLAB代码)

    遗传算法是一种基于生物进化原理的优化算法,常用于求解复杂问题。在机器人栅格地图最短路径规划中,遗传算法可以用来寻找最优路径。 遗传算法的求解过程包括以下几个步骤: 1. 初始化种群:随机生成一组初始解,每个解表示机器人在栅格地图上的路径。 2. 评估适应

    2024年03月11日
    浏览(117)
  • matlab simulink 遗传算法优化RBF

    1、内容简介 略 2-可以交流、咨询、答疑 2、内容说明 先用遗传算法优化RBF的权重系数,然后用RBF来做个控制器,查看效果 遗传算法、RBF控制、优化 3、仿真分析 4、参考论文 略  

    2024年02月08日
    浏览(46)
  • Matlab | 基于遗传算法的TSP路径优化

    理论基础 问题导入 MATLAB程序实现及结果分析 总结与扩展 TSP (traveling salesman problem,旅行商问题)是典型的NP完全问题,即其最坏情况下的时间复杂度随着问题规模的增大按指数方式增长,到目前为止还未找到一个多项式时间的有效算法。 TSP问题可描述为: 已知有 n 个城市,各城市

    2024年02月04日
    浏览(47)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包