matlab智能算法之遗传算法

news/2024/11/15 3:18:41/

智能算法之遗传算法

  • 智能算法之遗传算法
    • 1.背景
    • 2.算法
    • 3.案例
      • 3.1 案例求解二元函数的最大值

智能算法之遗传算法

1.背景

2.算法

3.案例

3.1 案例求解二元函数的最大值

例1:计算二元函数f(x,y)=20+x2+y2−10∗(cos(2πx)+cos(2πy))f(x,y)=20+x^2+y^2-10*(cos(2\pi x)+cos(2\pi y))f(x,y)=20+x2+y210(cos(2πx)+cos(2πy)) 的最大值,其中 x∈[0,10],y∈[0,5]x\in[0,10],y\in [0,5]x[0,10],y[0,5]
目标函数:

% -------------------适应度函数--------------------目标函数
function y = fitnessfcn(x)y = 20+x(1)^2+x(2)^2-10*(cos(2*pi*x(1))+cos(2*pi*x(2)));
end

选择/复制:

% ----------------------------选择子函数selection--------------------------------
function population = selection(population, best, fitness, N)newpopulation = zeros(N, size(population, 2));           % 先预先分配内存   可以不要p = fitness./sum(fitness);q = cumsum(p);for i = 1:(N-1)r = rand;tmp = find(r <= q);newpopulation(i, :) = population(tmp(1), :);endnewpopulation(N, :) = best;                              % 保留最优 population = newpopulation;
end

交叉:

% -------------------交叉子函数crossover-------------------
function population = crossover(population, best, pc, L, N)for i = 1:2:(N-1)cc = rand;if cc < pcpoint = 1 + ceil(rand*(L-2));                    % 取得一个2到L-1的整数ch = population(i, :);population(i, point+1:L) = population(i+1, point+1:L);population(i+1, point+1:L) = ch(1, point+1:L);endendpopulation(N, :) = best;                                 % 保留最优
end

变异:

% -------------------------变异子函数mutation----------------------
function population = mutation(population, pm, L, N)mm = rand(N, L)<pm;                                      % 小于变异概率的赋值为1,其他为0;也可以取反变异,这里的mm是逻辑值mm(N, :) = zeros(1, L);                                  % 最优保留,不变异population(mm) = 1-population(mm);                       % 变异发生
end

二进制转换为十进制:

% ----------------解码子函数decode------------------
function [xx, fitness] = decoding(population, lb, ub, Li, N)for i = 1:Nfor k = 1:length(Li)s(k) = 0;for j = 1:Li(k)s(k) = s(k) + population(i, sum(Li(1:k))-j+1)*2^(j-1);    % 二进制转十进制endx(k) = (ub(k) - lb(k))*s(k)/(2^Li(k)-1)+lb(k);                % 映射到取值范围内endfitness(i) = fitnessfcn(x);xx(i, :) = x;end
end

主函数:

clc;clear;close all;
% ----------------初始化参数--------------------
e = 0.01;                         % 计算精度
lb = [0; 0];                      % 自变量下界
ub = [10; 5];                     % 自变量上界
Li = ceil(log2((ub-lb)./e));       
L = sum(Li);                      % 变量字串长度
N = 30;                           % 群体规模
T = 30;                           % 最大遗传代数
pc = 0.9;                         % 交叉概率
pm = 0.05;                        % 变异概率                       
% -----------------初始种群----------------------
population = round(rand(N, L));                           % 初始种群,二进制编码(0,1)之间随机数,然后四舍五入为0/1
[xx, fitness] = decoding(population, lb, ub, Li, N);      % 解码,计算适应度
[optfit, indmax] = max(fitness);                 % 初始种群最佳个体的适应度和索引
best = population(indmax, :);                    % 初始种群最优染色体  二进制的
optx = xx(indmax, :);                            % 初始种群最优变量值  十进制的
fitcurve = zeros(1, T+1);                        % 有多少代最优适应度
fitcurve(1) = optfit;                            % 第一代的最优适应度
% -------------------迭代求解----------------------
for ii = 1:Tpopulation = selection(population, best, fitness, N);        % 选择(复制)population = crossover(population, best, pc, L, N);          % 交叉population = mutation(population, pm, L, N);                 % 变异[xx, fitness] = decoding(population, lb, ub, Li, N);         % 解码,计算适应度[fmax, indmax] = max(fitness);                               % 当代最佳个体if fmax >= optfitbest = population(indmax, :);                             % 到目前为止最优染色体optx = xx(indmax, :);                                     % 到目前为止最优变量值optfit = fmax;                                            % 到目前为止最优适应度endfitcurve(ii+1) = optfit;                                     % 存储每代的最优适应度
end
optx                                                             % 最优变量
optfit                                                           % 最优适应度% ------------------------画图---------------------------
subplot(1,2,1);
plot(0:T, fitcurve);
title('最优适应度曲线');
xlabel('遗传代数'); ylabel('最优适应度');
subplot(1,2,2);
x = linspace(0, 10);
y = linspace(0, 5);
[x, y] = meshgrid(x, y);
f = 20+x.^2+y.^2-10*(cos(2*pi*x)+cos(2*pi*y));
mesh(x, y, f);
hold on;
scatter3(optx(1), optx(2), optfit, 'red', 'filled');  
xlabel('x'); ylabel('y'); zlabel('f');title('f(x,y)=20+x^2+y^2-10*(cos(2\pi x)+cos(2\pi y))')

得到最优解为:(9.5406,4.5303)(9.5406,4.5303)(9.5406,4.5303),最大值为 f(9.5406,4.5303)=151.0422f(9.5406,4.5303)=151.0422f(9.5406,4.5303)=151.0422
在这里插入图片描述


http://www.ppmy.cn/news/3031.html

相关文章

手写js——继承

原型链继承 所谓 函数 也就是 函数 Father其本身&#xff0c;也叫作构造函数 &#xff0c;当一个函数被创建的同时&#xff0c;也会为其创建一个 prototype 属性&#xff0c;而这个属性&#xff0c;就是用来指向 函数原型&#xff0c;的我们可以把 prototype 理解为 Father的一…

教育的本质——采用不同学习方式,学习者在两周后还能记住的内容有多少

目录 一、学习金字塔模型 二、学习曲线 三、左右脑交替学习法 一、学习金字塔模型 “学习金字塔模型”&#xff0c;人们学习的效率一共分为七个层次&#xff1a; 第一层 ~ 第四层&#xff1a;这是我们最熟悉不过的形式&#xff0c;在学生时代&#xff0c;老师在上面讲课、…

冯诺依曼体系和操作系统概念

Ⅰ. 冯诺依曼体系结构 我们常见的计算机&#xff0c;如笔记本。我们不常见的计算机&#xff0c;如服务器&#xff0c;大部分都遵守冯诺依曼体系。 截至目前&#xff0c;我们所认识的计算机&#xff0c;都是有一个个的硬件组件组成 输入单元&#xff1a;包括键盘, 鼠标&#xf…

redis 主从复制(读写分离)集群搭建(含错误处理)

目录 1.概述 2.搭建 2.1.安装配置 2.2.认主 2.3.错误处理 3.原理 1.概述 当面临大流量时&#xff0c;redis可以采取集群的方式进行扩容&#xff0c;将压力分散到集群中的多个结点上去防止redis被打挂。redis的扩容方式有两种&#xff1a; 垂直扩容&#xff0c;即读写分离…

MATLAB | 一起来感受数学之美,第一届迷你黑客大赛回顾

Hey真的是好久不见&#xff0c;最近确实是比较忙更新频率也下来了&#xff0c;过段时间应该能恢复正常更新速度&#xff0c;之前给大家解说过今年举办的math is beautiful迷你黑客大赛&#xff0c;但这其实是第二届大赛&#xff0c;本期推送带大家回顾一下第一期大赛&#xff0…

大一作业HTML个人网页作业(宠物狗)

&#x1f389;精彩专栏推荐 &#x1f4ad;文末获取联系 ✍️ 作者简介: 一个热爱把逻辑思维转变为代码的技术博主 &#x1f482; 作者主页: 【主页——&#x1f680;获取更多优质源码】 &#x1f393; web前端期末大作业&#xff1a; 【&#x1f4da;毕设项目精品实战案例 (10…

第四部分 书写命令

目录一、显示命令二、命令执行三、命令出错四、嵌套执行 make五、定义命令包每条规则中的命令和操作系统 shell 的命令行是一致的。make 会按顺序一条一条地执行命令&#xff0c;每条命令的开头必须以[Tab] 键开头&#xff0c;除非&#xff0c;命令是紧跟在依赖规则后面的分号后…

jmeter接口测试之大家都来我家领豆子

一、测试目的&#xff1a; 2万用户不停请求云豆领取接口时&#xff0c;查看服务器内存占用情况&#xff0c;从而确认服务器内存占用异常的情况是否得到修复。 二、测试策略&#xff1a; 用2万个账号&#xff0c;以每2秒100次请求的速度向服务器发出请求&#xff0c;观察内存…