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

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

  • 1.背景介绍
  • 2.数学模型
  • 3.文件结构
  • 4.详细代码及注释
    • 4.1 crossover.m
    • 4.2 elitism.m
    • 4.3 GeneticAlgorithm.m
    • 4.4 initialization.m
    • 4.5 Main.m
    • 4.6 mutation.m
    • 4.7 selection.m
    • 4.8 Sphere.m
  • 5.运行结果
  • 6.参考文献

1.背景介绍

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

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

2.数学模型

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

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

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

3.文件结构

在这里插入图片描述

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 crossoverNamecase '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_P1Cross_P2 = round (  (ub - lb) *rand() + lb  );endif Cross_P1 > Cross_P2temp =  Cross_P1;Cross_P1 =  Cross_P2;Cross_P2 = temp;endPart1 = 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];
endR1 = rand();if R1 <= Pcchild1 = child1;
elsechild1 = parent1;
endR2 = rand();if R2 <= Pcchild2 = child2;
elsechild2 = parent2;
endend

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_nonewPopulation2.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 :  MnewPopulation2.Chromosomes(k).Gene  = newPopulation.Chromosomes(k).Gene;newPopulation2.Chromosomes(k).fitness  = newPopulation.Chromosomes(k).fitness;
endend

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 : Mpopulation.Chromosomes(i).fitness = obj( population.Chromosomes(i).Gene(:) );
endg = 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 : MaxGendisp(['Generation #' , num2str(g)]);% Calcualte the fitness valuesfor i = 1 : Mpopulation.Chromosomes(i).fitness = Sphere( population.Chromosomes(i).Gene(:) );endfor 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;endfor i = 1 : MnewPopulation.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
endBestChrom.Gene    = population.Chromosomes(1).Gene;
BestChrom.Fitness = population.Chromosomes(1).fitness;if visuailzation == 1plot( 1 : MaxGen , cgcurve);xlabel('Generation');ylabel('Fitness of the best elite')
endend

4.4 initialization.m

function [ population ] = initialization(M, N)for i = 1 : Mfor 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_noR = rand();if R < Pmchild.Gene(k) = ~ child.Gene(k);end
endend

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 + ba = 1;b = abs( min(  [population.Chromosomes(:).fitness] )  );Scaled_fitness = a *  [population.Chromosomes(:).fitness] + b;normalized_fitness = [Scaled_fitness] ./ sum([Scaled_fitness]);
elsenormalized_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));
endcumsum = zeros(1 , M);for i = 1 : Mfor j = i : Mcumsum(i) = cumsum(i) + temp_population.Chromosomes(j).normalized_fitness;end
endR = rand(); % in [0,1]
parent1_idx = M;
for i = 1: length(cumsum)if R > cumsum(i)parent1_idx = i - 1;break;end
endparent2_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_idxwhile_loop_stop = while_loop_stop + 1;R = rand(); % in [0,1]if while_loop_stop > 20break;endfor i = 1: length(cumsum)if R > cumsum(i)parent2_idx = i - 1;break;endend
endparent1 = 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.运行结果

在这里插入图片描述

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).

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/28283.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Python基础合集 练习28 (数值运算函数)

from this import d x -120 x的绝对值 x1 abs(x) 同时输出商和余数 y 7 y1 divmod(x1, y) print(y1) /进行幂余运算 z可以省略 (x**y)%z pow(x,y[,z]) pow(3, pow(3, 99), 10000) 四舍五入函数 d是保留小数位数&#xff0c;默认为0 round(x,[,d]) print(round…

uniapp安卓签名证书生成,签名证书的SHA1,SHA256,MD5获取

uniapp安卓证书生成有两种方式&#xff0c;一种是去dcloud开发者中心生成证书&#xff0c;另一种是安装jre环境&#xff0c;自己生成证书 第一种 dcloud生成证书 去该项目对应的应用处&#xff0c;生成证书需要等几分钟&#xff0c;生成后可以查看证书信息 第二种 自己生成…

05-1_Qt 5.9 C++开发指南_Model/View结构基础(基本原理;数据模型;试图组件;代理)

Model/View(模型/视图) 结构是 Qt 中用界面组件显示与编辑数据的一种结构&#xff0c;视图 (View)是显示和编辑数据的界面组件&#xff0c;模型 (Model) 是视图与原始数据之间的接口。Model/View 结构的典型应用是在数据库应用程序中&#xff0c;例如数据库中的一个数据表可以在…

Mac平台下如何制作pkg安装包以及rpath设置

打包工具介绍 Mac平台规范包可以使用Packages工具。下载地址 打包前准备工作 创建一个目录 macProject macProject目录中是以下目录结构 myProject.app└── Contents├── Info.plist├── MacOS├── res├── libmymath.dylib├── Frameworks└── Resources├…

利用 jenkins 关联 Job 方式完善 RobotFramework 测试 Setup 以及 Teardown 后操作

目录 1.前言 2.Jekins 关联 Job 方式 1.前言 Jenkins是一个流行的持续集成和交付工具&#xff0c;它可以帮助自动化构建、测试和部署软件。与Robot Framework结合使用&#xff0c;可以实现更高效的测试工作流程。 在Robot Framework中&#xff0c;Setup和Teardown是测试用例…

CONTAINER = ALL是ALTER USER语句的默认值

连接到root时查看有关root&#xff0c;CDB和PDB的数据 当公用用户执行查询时&#xff0c;可以限制X $表和V $&#xff0c;GV $和CDB_ *视图的视图信息。X$表和这些视图包含有关应用程序root及其关联应用程序PDB的信息&#xff0c;或者如果连接到CDB root&#xff0c;则是整个C…

Prometheus、Grafana使用

文章目录 系统性能监控相关命令lscputopfreehtopdstatglancesiftopiptrafnethogs 监控软件Prometheus安装、使用将promethues做成服务监控其他机器 exportergrafana配置、使用密码忘记重置 系统性能监控 相关命令 lscpu lscpu 是一个 Linux 命令&#xff0c;用于显示关于 CP…

如何通过三级缓存解决 Spring 循环依赖

以下内容基于 Spring6.0.4。 这个其实是一个特别高频的面试题&#xff0c;松哥也一直很想和大家仔细来聊一聊这个话题&#xff0c;网上关于这块的文章很多&#xff0c;但是我一直觉得要把这个问题讲清楚还有点难度&#xff0c;今天我来试一试&#xff0c;看能不能和小伙伴们把…

前端 | (五)CSS三大特性及常用属性 | 尚硅谷前端html+css零基础教程2023最新

学习来源&#xff1a;尚硅谷前端htmlcss零基础教程&#xff0c;2023最新前端开发html5css3视频 文章目录 &#x1f4da;CSS三大属性&#x1f407;层叠性&#x1f407;继承性&#x1f407;优先级 &#x1f4da;CSS常用属性&#x1f407;像素的概念&#x1f407;颜色的表示⭐️表…

Mysql——》InnoDB内存结构和磁盘存储结构

推荐链接&#xff1a; 总结——》【Java】 总结——》【Mysql】 总结——》【Redis】 总结——》【Kafka】 总结——》【Spring】 总结——》【SpringBoot】 总结——》【MyBatis、MyBatis-Plus】 总结——》【Linux】 总结——》【MongoD…

CSS样式

1.高度和宽度 .c1{height:300px;width:500px;}注意事项&#xff1a; 宽度支持百分比&#xff0c;高度不支持。行内标签&#xff1a;默认无效会计标签&#xff1a;默认有效&#xff08;霸道&#xff0c;右侧区域空白&#xff0c;也不给你用&#xff09; 2.块级和行内标签 块…

【分立元件】案例:为什么温度探头有1米长,但测量温度还是准的?

之前被问到这么一个问题&#xff0c;如下图所示的温度传感器&#xff0c;探头的连接线搞这么长&#xff0c;有1m/2m/3m的规格&#xff0c;那这段线里没有电阻吗&#xff1f;如果只放一部分进去到测试环境中&#xff08;比如3m长的连接线放1m进入高低温箱&#xff09;&#xff0…