遗传算法——matlab实现

遗传算法——matlab实现遗传算法

1. 遗传算法的原理

网上实在太多了,这里就不过多赘述了

2. 主函数

% 遗传算法 %sum(x)的最小值(具体要求见fun.m) clc;clear nVar = 100; % x的长度 nPop = 30; % 种群规模大小为30 maxIt = 2000; % 最大迭代次数 nPc = 0.8; % 子代规模的比例 nC = round(nPop * nPc/2)*2;% 子代规模的大小 round()得出最接近的整数,同时进行偶数化操作 nMu = 0.01; % 变异概率为0.01 % 用结构体方式来存储变量,使得x,y有一个绑定的关系 template.x = []; % 模板 template.y = []; % 模板 % repmat函数主要是用于快速的产生一个大的矩阵 Parent = repmat(template,nPop,1); % 父染色体,产生一个30*1的矩阵,每行包括x和y % 初始化种群 for i = 1 : nPop Parent(i).x = randi([0,1],1,nVar); % 随机生成100个【0,1】的x值 Parent(i).y = fun(Parent(i).x); % 计算适应度,也就是目标函数 end for It = 1 : maxIt Offspring = repmat(template,nC/2,2); % 分成两列为了好进行数据的交叉操作 for j = 1 : nC/2 p1 = SelectPop(Parent); p2 = SelectPop(Parent); [Offspring(j,1).x, Offspring(j,2).x] = crossPop(p1.x, p2.x); % 进行交叉操作 end Offspring = Offspring(:); % 变成列的形式,便于写for循环 for k = 1 : nC Offspring(k).x = mutatePop(Offspring(k).x,nMu); % 进行变异操作 Offspring(k).y = fun(Offspring(k).x); end newPop = [Parent;Offspring]; % 新的种群 % ~是不输出此参数,sort返回的第一个参数是数值大小,第二个是索引,’ascend’为升序排列 [~,so]= sort([newPop.y],'ascend'); % 从小到大对y值进行排列 newPop = newPop(so); % 刷新种群排序 Parent = newPop(1 : nPop); disp(['迭代次数:',num2str(It), ', 最小值为: ', num2str(Parent(1).y)]) end 

3 . 选择函数

% 选择函数 function p = SelectPop(Parent) % 锦标赛选择法 % 锦标赛方法选择策略每次从种群中取出一定数量个体,然后选择其中最好的一个进入子代种群 % 重复该操作,直到新的种群规模达到原来的种群规模 n = numel(Parent); % 父代种群的个数 index = randperm(n); % 随机打乱序列,选中前两个 p1 = Parent(index(1));% 第一个 p2 = Parent(index(2));% 第二个 if p1.y < p2.y p = p1; else p = p2; end end 

4.交叉函数(单点交叉)

% 交叉函数 function [y1,y2] = crossPop(x1, x2) %单点交叉 n = numel(x1);% 算出x1的长度 s = randi([1, n-1]);% 随机选出一个交叉点,-1操作是因为如果选择最后一位,就相当于没有交叉 y1 = [x1(1:s) x2(s+1:end)];% 重组 y2 = [x2(1:s) x1(s+1:end)];% 重组 end 

5.变异函数(单点变异)

% 变异函数 function p = mutatePop(x,mu) % 单点变异 if rand <= mu % 单独一个rand是得到一个在(0,1)之间均匀分布的伪随机数 n = numel(x); s = randi([1,n]); if x(s) == 0 x(s) = 1; elseif x(s) ==1 x(s) = 0; end end p = x; end 

6.适应度函数

function y = fun(x) % 计算输入x的和,x是【0,1】区间的正整数 y = sum(x); end % randi()函数 % randi(limin,imax].[m n]) % 产生m*n矩阵,这个矩阵的元素都是处于imin和imax之间的整数 
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/225547.html原文链接:https://javaforall.net

(0)
上一篇 2026年3月17日 上午9:04
下一篇 2026年3月17日 上午9:04


相关推荐

  • 3.20 DAY3[通俗易懂]

    3.20 DAY3[通俗易懂]1.msg=’我叫%s,我看着像%r’%(‘太白’,’郭德纲’)print(msg)我叫太白,我看着像’郭德纲’句中出现引号,把%s替换成%r,可以打印出原来样式2.ASCII8位字节英文字母,数字,特殊字符unicode:万国码  python2:unicode默认是2个字节表示一个字符  python3:unicode统一是4个字节表示一个字符    创建初期16位字…

    2026年4月13日
    3
  • 数论概论读书笔记 23.二次互反律的证明

    数论概论读书笔记 23.二次互反律的证明二次互反律的证明二次互反定律有三部分 第一部分告诉我们 1 1 1 何时是二次剩余 第二部分告诉我们 222 何时是二次剩余 第三部分告诉我们 精简一下 pq qp 1 p 12 q 12 pq qp 1 p 12 q 12 left frac p q right left frac q p right 1 frac p 1 2 cdo

    2026年3月20日
    4
  • PHP实现打印出库单,有没有实现过?

    PHP实现打印出库单,有没有实现过?

    2021年10月28日
    57
  • 【python】如何使用pip安装、卸载包

    【python】如何使用pip安装、卸载包1、在安装python的时候要把pip勾选上(默认安装时勾选的)。这样你就已经安装了pip。2、打开命令提示符窗口开始→所有程序→附件→运行(快捷键Win+R),在对话框中输入cmd,回车确认即可3.安装想要的包。具体名称可以上PyPI或输入pipsearchXX确认一下,比如numpy。平常使用的过程中经常将其简写成np,在这里安装的时候不能简写,只能用numpy。

    2022年10月16日
    4
  • MySQL8.0正确修改密码的姿势[通俗易懂]

    MySQL8.0正确修改密码的姿势[通俗易懂]mysql更新完密码,总是拒绝连接、登录失败?MySQL8.0不能通过直接修改mysql.user表来更改密码。正确更改密码的方式备注:清空root密码MySQL8.0不能通过直接修改mysql.user表来更改密码。因为authentication_string字段下只能是MySQL加密后的43位字符串密码,其他的导致错误。错误不报出,但是无法再登录mysql,总是会提示无…

    2022年8月13日
    4
  • 相机姿态估计(二)–单目POSIT算法

    相机姿态估计(二)–单目POSIT算法3D 姿态估计 POSIT 算法 POSIT 算法 PosefromOrth nbsp 比例正交投影迭代变换算法 用于估计物体的 3D 姿态 相对于镜头的平移和旋转量 算法正常工作的前提是物体在 Z 轴方向的 厚度 远小于其在 Z 轴方向的平均深度 比如距离镜头 10 米远的一张椅子 算法流程 假设待求的姿态 包括旋转矩阵 R 和平移

    2026年3月18日
    2

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号