遗传算法(包含选择、交叉、变异) MATLAB完整代码 中文注释详解
该算法的选择、交叉、变异操作都采用了基础的方法,操作方法在代码的注释给出:
选择:二元锦标赛选择法;
交叉:单点交叉;
变异:单点变异
1.主程序 main
clc;clearnVar = 100; %定义一个变量来接受x的长度
nPop = 30; %定义种群大小
maxIt = 2000; %定义最大种群迭代次数
%在进行选择、交叉、变异之前要先定义子代规模大小
nPc = 0.8; %代表交叉比列
nC = round(nPop * nPc / 2) * 2; %代表子代规模的大小;其中做了偶数化处理
nMu = 0.01; %变异概率template.x = []; %定义结构体来存储变量x、y 后面经常要用到,所以下面直接生成一个模板
template.y = [];Parent = repmat(template, nPop, 1); %初始化种群之后的变量,用Parent来接收,代表他是一个父代种群 repmat()矩阵复制命令for i = 1 : nPopParent(i).x = randi([0,1], 1, nVar);Parent(i).y = fun(Parent(i).x);endfor It = 1 : maxItoffspring = repmat(template, nC/2, 2); %定义子代规模后,定义子代数据存放的模板;子代种群会刷新,写进循环内,防止数据不断增长for j = 1 : nC / 2 %首先生成一个12*2的子代种群p1 = selectPop(Parent); %选择两个个体,把父代种群传进来进行选择p2 = selectPop(Parent);[offspring(j,1).x, offspring(j,2).x] = crossPop(p1.x , p2.x); %交叉endoffspring = offspring(:);for k = 1 : nCoffspring(k).x = mutatePop(offspring(k).x, nMu); %变异offspring(k).y = fun(offspring(k).x); %调用fun()函数,计算y值end% 进行种群筛选,如果不进行种群筛选,种群会越来越庞大newPop = [Parent; offspring];[~,so] = sort([newPop.y], 'ascend');newPop = newPop(so);Parent = newPop(1 : nPop); %进行筛选,只保留前30个,同时前30个也最接近我们需要的结果disp(['迭代次数:', num2str(It), ',最小值为:', num2str(Parent(1).y)]);end
2.选择 selectPop
function p =selectPop(Parent) %从父代种群中选择%锦标赛选择法 :从父代种群中选择两个个体,比较他们的适应度值,如果谁的适应度值更接近我们最后理想结果,就选中,另外一个被淘汰n = numel(Parent); %计算父代种群中有多少个体,先读取一下index = randperm(n); %随机的生成一个序列,选中两个个体出来p1 = Parent(index(1));p2 = Parent(index(2));if p1.y <= p2.yp = p1;else p = p2;end
end
3.交叉 crossPop
function [y1,y2] = crossPop(x1,x2) %传进两个个体让他们去交叉%单点交叉,交换随机点后面的元素,随机点不能为最后一位!n = numel(x1); %先获取x长度s = randi([1, n - 1]); %随机生成随机点且不能为最后一位y1 = [x1(1 : s) x2(s + 1 : end)];y2 = [x2(1 : s) x1(s + 1 : end)];
end
4.变异 mutatePop
function p = mutatePop(x, mu)%单点变异:随机指定一个点,原来是1则变为0,原来是0则变为1;mu为变异概率if rand <= mun = numel(x);s = randi([1,n]);if x(s) == 0x(s) = 1;elseif x(s) == 1x(s) = 0;endendp = x;
end
遗传算法(包含选择、交叉、变异) MATLAB完整代码 中文注释详解相关推荐
- 史上最详细的Pytorch版yolov3代码中文注释详解(四)
史上最详细的Pytorch版yolov3代码中文注释详解(一):https://blog.csdn.net/qq_34199326/article/details/84072505 史上最详细的Pyt ...
- HTML简单入门 代码加注释详解
HTML 初识网页 <!DOCTYPE html> <html lang="en"> <!--head标签代表网页头部--> <head& ...
- ftp服务器搭建类似云盘功能代码(带注释详解代码)
ftp服务器使用说明 运行服务端 ./server 本机IP地址 端口号(使用ifconfig查看本机IP 地址) 运行客户端 ./client 服务器IP地址 相同端口号 运行成功后可执行以下指令, ...
- Lift-Splat-Shoot算法理解及代码中文注释
论文:Lift, Splat, Shoot: Encoding Images from Arbitrary Camera Rigs by Implicitly Unprojecting to 3D 完 ...
- 基于Python实现的网络爬虫项目——多线程下载小说并保存为txt文件(包含完整代码及注释)
基于Python实现的网络爬虫项目--多线程下载小说并保存为txt文件(包含完整代码及注释) 一.确立预期目标 二.完成项目所需工具 三.项目需要解决的问题 问题一 问题二 问题三 问题四 问题五 问 ...
- 代码+步骤GM(1,1)灰色预测模型-案例长江水质综合评价赛题-级比检测C的确定-matlab完整代码附送
GM(1,1)灰色预测模型-案例长江水质综合评价赛题第三题-matlab完整代码附送 看到上一篇Blog在短短几天Pageviews就达到了1300多,看来大家还是比较中意建模上的笔记
- python外星人入侵代码提示has no attri_Python外星人入侵完整代码和注释(四)
四.重构:模块game_function,创建game_function.py 文件名 1.创建game_function.py(用来存储项目的大部分函数) 2.函数check_events() :响 ...
- 人民币 matlab,Matlab实现人民币币值的显示 实现代码及教程详解
上图像和程序了--记得程序好像是很久以前收藏的了--分享出来了-- clear all;clc; Img = imread('I.jpg'); if ndims(Img)==3 I=rgb2gray( ...
- matlab圆周运动表示三角函数,用代码画画-详解三角函数
原标题:用代码画画-详解三角函数 用代码画画,必需要懂很多数学知识?如果数学基础没那么好,是否就无法肆意表达,领略其中的乐趣? 其实不然.很多时候,只要用简单的数学知识,也能做出复杂精妙的作品. 希望 ...
最新文章
- Linux负载均衡实现
- nebula语法学习
- springMVC 不扫描 controller 中的方法
- Java,想说爱你真不容易
- Android动画及滑动事件冲突解决(转载)
- android rtsp 延时,ijkplayer 单视频流直播延迟问题解决过程
- Spring验证示例 - Spring MVC Form Validator
- HDU1048 The Hardest Problem Ever
- python之optparse模块
- [转]Bash的输入输出重定向
- 汉字常用字unicode码表
- 大学生信息检索概论练习题
- eval()与train()(结合源码理解)
- 基于SEIR模型对美国COVID-19疫情传播的预测和分析
- k8s、pod、容器、虚拟机概念
- tomcat 做为大型应用的配置
- 2021.1.28课程摘要(逻辑教育-王劲胜)
- linux停止tomcat 8005,为什么Tomcat不会绑定到关闭端口(8005)?
- 数码相机短片合并及压缩工具(数码短片伴侣)
- Q2财报:联想的逆向“比较优势”