遗传算法python与matlab_遗传算法简单介绍与MATLAB实现
题目:
定义一个二元函数,
。用遗传算法求全局最大值;
遗传算法简单介绍与MATLAB实现(二)
引入题目一
上一篇文章中我们简单的介绍了一了一下遗传算法,其中提到了多元函数f=f(x,y)f=f(x,y),所以在这里我们就定义一个二元函数,作为第一个练手的程序。
遗传算法MATLAB程序
设定参数
首先我们要确定一系列参数
N = 100; %种群内个体数目
N_chrom = 2; %染色体节点数
iter = 2000; %迭代次数
mut = 0.2; %突变概率
acr = 0.2; %交叉概率
其中突变概率指的是某个个体的染色体发生突变的概率。因为实际中并不可能每一个个体都会发生突变,而是存在一定的概率,因此我们在这里定义每一个个体突变发生的概率为0.2。
同理,交叉概率指的就是某个个体与另一个个体发生染色体交叉的概率。
迭代次数指的是整个种群迭代2000多次。
一般来说,并不是突变概率、交叉概率越小或者越大越好。比如说突变概率特别高的话,会让整个种群的最优适应度飘忽不定。如果特别小的话,会让种群迭代的速度特别慢,很难找到最优适应度。这里取0.2是我经过多次试验以后,觉得0.2是一个比较稳定不会乱飘且适应度收敛也不错的一个值。
迭代次数也同理,如果一个特别简单的模型去求最优解,可能五六次迭代就求出来了,那么2000次迭代纯属浪费时间。但是如果是一个特别复杂的模型,那么2000次迭代就有可能不够。具体迭代次数可以自己灵活决定。
chrom_range = [-10 -10; 10 10];%每个节点的值的区间
chrom = zeros(N, N_chrom);%存放染色体的矩阵
fitness = zeros(N, 1);%存放染色体的适应度
fitness_ave = zeros(1, iter);%存放每一代的平均适应度
fitness_best = zeros(1, iter);%存放每一代的最优适应度
chrom_best = zeros(1, N_chrom+1);%存放当前代的最优染色体与适应度
其中的chrom_range指的是每个节点值的区间。在我们的这个模型中,x∈[−10,10],y∈[−10,10]x∈[−10,10],y∈[−10,10]。第一行放的是两个变量的区间下限,第二行放的是区间上限。
chrom和fitness两个矩阵你们可以自己理解一下为什么这样子写。
fitness_ave用来存放每一代的平均适应度,主要是用来最后画图,观察种群在每一次迭代中适应度的变化情况。fitness_best同理。
chrom_best用来存放最优适应度对应的最优染色体与适应度,可以回想一下上一章染色体变异中需要最优适应度,优胜劣汰中需要最优染色体,这个矩阵作用就是如此。
初始化种群
接下来开始初始化参数
chrom = Initialize(N, N_chrom, chrom_range); %初始化染色体
fitness = CalFitness(chrom, N, N_chrom); %计算适应度
chrom_best = FindBest(chrom, fitness, N_chrom); %寻找最优染色体
fitness_best(1) = chrom_best(end); %将当前最优存入矩阵当中
fitness_ave(1) = CalAveFitness(fitness); %将当前平均适应度存入矩阵当中
Initialize函数是我自定义的一个函数,用于初始化染色体。具体操作就是用一个for循环对每个个体的染色体进行随机赋值,并利用chrom_range将其限定在变量规定的区间之内。function chrom_new = Initialize(N, N_chrom, chrom_range)
chrom_new = rand(N, N_chrom);
for i = 1:N_chrom %每一列乘上范围
chrom_new(:, i) = chrom_new(:, i)*(chrom_range(2, i)-chrom_range(1, i))+chrom_range(1, i);
end
CalFitness函数则是计算chrom内每个个体的适应度,并将其保存在fitness中。这个函数很重要,请着重理解这个函数的用法。function fitness = CalFitness(chrom, N, N_chrom)
fitness = zeros(N, 1);
%开始计算适应度
for i = 1:N
x = chrom(i, 1);
y = chrom(i, 2);
fitness(i) = sin(x)+cos(y)+0.1*x+0.1*y;
end
FindBest函数寻找出当前种群中的最优染色体,并将其保存在chrom_best。
function chrom_best = FindBest(chrom, fitness, N_chrom)
chrom_best = zeros(1, N_chrom+1);
[maxNum, maxCorr] = max(fitness);
chrom_best(1:N_chrom) =chrom(maxCorr, :);
chrom_best(end) = maxNum;
CalAveFitness函数用于计算当前种群中的平均适应度。
function fitness_ave = CalAveFitness(fitness)
[N ,~] = size(fitness);
fitness_ave = sum(fitness)/N;
迭代开始
初始化完以后就开始迭代,为了保证迭代次数和iter一致,这里我们就直接令t从2开始迭代。
再一次迭代过程中,一个种群执行操作顺序为:染色体变异,染色体交叉,计算适应度,寻找最优染色体,替换当前存储的最优染色体,优胜劣汰。
需要注意的是这里替换当前最优染色体。因为我们将这个种群的个个个体的染色体重新变异、交叉过了,所以最优染色体也会变化。但是这一代的最优染色体不一定比上一次迭代的最优染色体好,所以需要判定是否将最优染色体这个位置给换掉。
因此迭代过程中的代码为for t = 2:iter
chrom = MutChrom(chrom, mut, N, N_chrom, chrom_range, t, iter); %变异
chrom = AcrChrom(chrom, acr, N, N_chrom); %交叉
fitness = CalFitness(chrom, N, N_chrom); %计算适应度
chrom_best_temp = FindBest(chrom, fitness, N_chrom); %寻找最优染色体
if chrom_best_temp(end)>chrom_best(end) %替换掉当前储存的最优
chrom_best = chrom_best_tem
其中MutChrom函数用来对种群进行染色体变异操作。这里面的操作比较多,主要可以分为三步:
判断某节点是否变异;
判断变异是增加还是减少;
判断变异后的值是否越界。
用流程图表示为下图所示。
下面代码表示为
function chrom_new = MutChrom(chrom, mut, N, N_chrom, chrom_range, t, iter)
for i = 1:N
for j = 1:N_chrom
mut_rand = rand; %是否变异
if mut_rand <=mut
mut_pm = rand; %增加还是减少
mut_num = rand*(1-t/iter)^2;
if mut_pm<=0.5
chrom(i, j)= chrom(i, j)*(1-mut_num);
else
chrom(i, j)= chrom(i, j)*(1+mut_num);
end
chrom(i, j) = IfOut(chrom(i, j), chrom_range(:, j)); %检验是否越界
end
end
end
chrom_new = chrom;
越界函数IfOut函数我们看它是左越界还是右越界,如果是左越界,则让节点值等于区间下限;如果是右越界,则让节点值等于区间上限。
function c_new = IfOut(c, range)
if crange(2)
if abs(c-range(1))
c_new = range(1);
else
c_new = range(2);
end
else
c_new = c;
end
AcrChrom函数是染色体交叉函数。逻辑相较染色体变异来说比较简单,大致可以分为以下几点
判断该节点是否交叉;
随机寻找一个与其交叉的节点;
对两个节点进行交叉。function chrom_new = AcrChrom(chrom, acr, N, N_chrom)
for i = 1:N
acr_rand = rand;
if acr_rand
acr_chrom = floor((N-1)*rand+1); %要交叉的染色体
acr_node = floor((N_chrom-1)*rand+1); %要交叉的节点
%交叉开始
temp = chrom(i, acr_node);
chrom(i, acr_node) = chrom(acr_chrom, acr_node);
chrom(acr_chrom, acr_node) = temp;
end
end
chrom_new = chrom;
ReplaceWorse函数则是优胜劣汰这个过程,将种群中的最劣染色体替换掉。这里是直接用最优染色体替换,并且替换掉的是最后几个染色体,目的是加快收敛速度,但可能会陷入局部最优解。
function [chrom_new, fitness_new] = ReplaceWorse(chrom, chrom_best, fitness)
max_num = max(fitness);
min_num = min(fitness);
limit = (max_num-min_num)*0.2+min_num;
replace_corr = fitness
replace_num = sum(replace_corr);
chrom(replace_corr, :) = ones(replace_num, 1)*chrom_best(1:end-1);
fitness(replace_corr) = ones(replace_num, 1)*chrom_best(end);
chrom_new = chrom;
fitness_new = fitness;
end
输出遗传算法迭代图
在这里我们只输出一个标准图为迭代过程中种群的平均适应度与最优适应度。
在之前我们已经得到了每一代的平均适应度fitness_ave与最优适应度fitness_best,所以可以直接输出图像
figure(1)
plot(1:iter, fitness_ave, 'r', 1:iter, fitness_best, 'b')
grid on
legend('平均适应度', '最优适应度')
之后我们还想要看得出的点在实际图像中哪个位置,所以我们可以增加一个用来作图的函数PlotModel
function y = PlotModel(chrom)
x = chrom(1);
y = chrom(2);
z = chrom(3);
figure(2)
scatter3(x, y, z, 'ko')
hold on
[X, Y] = meshgrid(-10:0.1:10);
Z =sin(X)+cos(Y)+0.1*X+0.1*Y;
mesh(X, Y, Z)
y=1;
遗传算法主程序
上面就是所有程序片段,因此把主程序的代码联立起来为
clc, clear, close all
%%基础参数
N = 100; %种群内个体数目
N_chrom = 2; %染色体节点数
iter = 2000; %迭代次数
mut = 0.2; %突变概率
acr = 0.2; %交叉概率
best = 1;
chrom_range = [-10 -10;10 10];%每个节点的值的区间
chrom = zeros(N, N_chrom);%存放染色体的矩阵
fitness = zeros(N, 1);%存放染色体的适应度
fitness_ave = zeros(1, iter);%存放每一代的平均适应度
fitness_best = zeros(1, iter);%存放每一代的最优适应度
chrom_best = zeros(1, N_chrom+1);%存放当前代的最优染色体与适应度
%%初始化
chrom = Initialize(N, N_chrom, chrom_range); %初始化染色体
fitness = CalFitness(chrom, N, N_chrom); %计算适应度
chrom_best = FindBest(chrom, fitness, N_chrom); %寻找最优染色体
fitness_best(1) = chrom_best(end); %将当前最优存入矩阵当中
fitness_ave(1) = CalAveFitness(fitness); %将当前平均适应度存入矩阵当中
for t = 2:iter
chrom = MutChrom(chrom, mut, N, N_chrom, chrom_range, t, iter); %变异
chrom = AcrChrom(chrom, acr, N, N_chrom); %交叉
fitness = CalFitness(chrom, N, N_chrom); %计算适应度
chrom_best_temp = FindBest(chrom, fitness, N_chrom); %寻找最优染色体
if chrom_best_temp(end)>chrom_best(end) %替换掉当前储存的最优
chrom_best = chrom_best_temp;
end
%%替换掉最劣
[chrom, fitness] = ReplaceWorse(chrom, chrom_best, fitness);
fitness_best(t) = chrom_best(end); %将当前最优存入矩阵当中
fitness_ave(t) = CalAveFitness(fitness); %将当前平均适应度存入矩阵当中
end
%%作图
figure(1)
plot(1:iter, fitness_ave, 'r', 1:iter, fitness_best, 'b')
grid on
legend('平均适应度', '最优适应度')
e = PlotModel(chrom_best)
%%输出结果
disp(['最优染色体为', num2str(chrom_best(1:end-1))])
disp(['最优适应度为', num2str(chrom_best(end))])
输出结果
我们运行一下, 可以得到最大点为(7.9541,6.3834)(7.9541,6.3834),最大值为3.4237。
可以做出最大值点在空间中的位置如图所示。证明我们的结论比较正确,起码没有落到周围的极大值的峰上。
读者想要更加详细理解遗传算法可以看看这个:炫云:遗传算法的实现过程炫云:遗传算法(附Python实现)zhuanlan.zhihu.com炫云:遗传算法(附Python实现)zhuanlan.zhihu.com
遗传算法python与matlab_遗传算法简单介绍与MATLAB实现相关推荐
- php枚举属于什么类型,python枚举类型是什么?python枚举类型的简单介绍
本篇文章给大家带来的内容是关于python枚举类型是什么?python枚举类型的简单介绍,有一定的参考价值,有需要的朋友可以参考一下,希望对你有所帮助. 一:枚举类型的定义 二:枚举类和普通类的区别 ...
- [python+nltk] 自然语言处理简单介绍和NLTK坏境配置及入门知识(一)
本文主要是总结最近学习的论文.书籍相关知识,主要是Natural Language Pracessing(自然语言处理,简称NLP)和Python挖掘维基百科Infobox等内容的知识.此篇文章主要参 ...
- python网站设计理念_简单介绍下python Django框架的历史,设计理念及优势_Django讲解2...
简单介绍下python Django框架的历史,设计理念及优势 Django是一个高层次的 Python Web 框架,它是一个鼓励快速开发和干净,实用的框架设计.Django可以更容易地快速构建更好 ...
- 遗传算法 python包_遗传算法 (Genetic Algorithm)
遗传算法( Genetic Algorithm )又叫基因进化算法,或进化算法.属于启发式搜索算法一种,这个算法比较有趣,并且弄明白后很简单,写个 100-200 行代码就可以实现.在某些场合下简单有 ...
- python自动化测试篇一 简单介绍
一.什么是 Python Python 是一门编程语言,关于编程语言我们后面再详细讲.首先我们思考,为什么我们要学习 Python 1.为什么要学习 Python 1. 自动化 很多时候,虽然可以通过 ...
- python中的json_简单介绍Python中的JSON使用
JSON进阶 Python的dict对象可以直接序列化为JSON的{},不过,很多时候,我们更喜欢用class表示对象,比如定义Student类,然后序列化: import json class St ...
- alchemy php,Python下SQLAlchemy的简单介绍
本篇文章给大家带来的内容是关于php协成实现的详解(附代码),有一定的参考价值,有需要的朋友可以参考一下,希望对你有所帮助. SQLAlchemy是Python编程语言下的一款开源软件.提供了SQL工 ...
- 利用Python进行数据分析(1) 简单介绍
一.处理数据的基本内容 数据分析 是指对数据进行控制.处理.整理.分析的过程. 在这里,"数据"是指结构化的数据,例如:记录.多维数组.Excel 里的数据.关系型数据库中的数据. ...
- Python中class的简单介绍
类的定义 class classname[(父类名)]: – 成员函数及成员变量 _ init _ 构造函数:初始化对象 _ del_ 析构函数:销毁对象 定义类的成员函数时,必须默认一个变量代表类定 ...
- python量化常用_简单介绍下量化分析的常用库TA-lib
做python量化交易,尤其是做趋势跟踪的或者是K线指标分析跟踪的,TA-lib库基本都多多少少用到,搜索时候往往搜出来"塔利班",所以玩笑塔利班库.尤其对于从传统K线技术分析转计 ...
最新文章
- Zoom 袁征码农逆袭:8 次申请美国签证被拒,独闯硅谷成亿万富翁
- 新浪博客服务器维护,服务器安全维护
- Android点击Button实现功能的几种方法总结
- Java中TreeMap和TreeSet的底层实现
- ajax工作中使用模板
- vue.js axios实现跨域http请求接口
- java多线程交替打印_java多线程 更优雅的实现线程同步:交替打印A、B LockSupport实现...
- FPGA实现数字相敏检波(DPSD)
- linux定义getch函数
- 韦东山嵌入式学习视频完整目录
- Python - matplotlib 不显示中文 findfont: Font family [‘SimHei‘] not found - IOS
- app小窗口悬浮工具_悬浮窗口大师
- 如何写好一个综述,以一个综述为例
- 【目标跟踪系列】SiamRpn卷积流程以及代码
- Python变量赋值方法
- android自定义起止时间的时间刻度尺,Android 自定义 View 刻度尺
- 使用expect ftp免交互上传文件
- 基于SSM实现的求职招聘系统【附源码】(毕设)
- wins10系统更换固态硬盘经常假死如何解决
- fdtd中时间监视器怎么放_FDTD基本介绍