遗传算法原理以及matlab代码

article/2025/10/18 10:59:54

目录

1,算法原理以及形象解释

2,参数编码

3,算法框架

4,代码  MATLAB

1,算法原理以及形象解释

       遗传算法(Genetic Algorithm, GA)是仿生物智能优化算法,是模拟达尔文生物进化论中自然选择,遗传变异,适者生存实现生物进化的优化模型。进化论解释了生物发展过程中,每一代种群在自然选择,遗传变异中不断朝更适应生存的方向发展,这本身就是优化的过程,遗传算法正是基于这一原理。(巴拉巴拉)

        通俗来讲,当我们希望种植花朵很大的玫瑰,希望花朵越大越好(“大”这个特征就是优化目标)。首先种植的第一批玫瑰(1.初始化第一个种群),挑选花朵大的玫瑰(2.选择优秀个体),然后利用这批优秀个体进行杂交得到子代(3.遗传交叉),然后还要考虑变异,因为变异也可能产生更优秀子代(4.变异),最后重复以上过程(for i=1:100;,,,,,)。

        以上这个优化过程,是人为控制选择,遗传交叉,变异。而遗传算法就是通过计算机来完成选择,遗传,变异,产生下一代种群,这些步骤。

2,参数编码

代码实现分析

        你们肯定会疑惑,遗传算法和参数编码有什么关系,不要慌,我们先回顾一下算法实现的核心:

代码实现的核心:

1.能够进行选择,挑选优秀个体

        (这个简单,计算每个个体对应目标值,对目标值设定一个最低标准,确定优秀个体)。

2.能够交叉,变异,得到新的子代。(关键)

        所以问题的关键就是如何实现交叉和变异。 这里就要用到参数编码.

        先分析生物遗传变异的机理,生物遗传杂交的过程就是染色体配对过程。而参数编码就是将参数转换成类染色体的数据,使之能够进行交叉变异。即二进制数据。比如 “01011101” ,八位二进制就表示八条染色体,每条染色体对应的值只有0和1。

二进制数据实现交叉遗传

       

        二进制数据实现交叉遗传:(代码中的一部分注释)

        % 对于下面两个父代,x1,x2。将染色体从中间分为两组,相互交叉遗传得到子代 y1,y2。
        % x1=01001 11010  交   y1=01001 00100
        % x2=10101 00100  叉   y2=10101 11010

 

        二进制数据实现变异:(代码中的一部分注释)

        %子代染色体序列中如果发生变异,将导致染色体 1 变为 0 , 0 变为 1 。例如:

        % x1=01001 1 1010,当发生变异,10个染色体随机一个染色体产生变异,当第五条染色体变异,则变异后的x1'=01001 0 1010。

        当然,变异是需要给定一定概率,变异率pm一般设置为染色体个数的倒数,rand(1)<pm时,发生变异

将参数进行二进制编码

       

        如图所示,为y=-2*x^2+20x,其中x [0,10]。x的值就可以看作我们的方案,y的值就是方案结果。所以参数编码就是对x值进行二进制编码,x的范围是0-10。现在就是思考采用多少个二进制位(根据对精度以及计算量的要求选择),这里选择10个二进制位,,即十个染色体。

        若染色体个数为10,则x=0变为p=00000 00000,x=10变为p=11111 11111。

        p的值共1024个,0-1023。

 x=10*(p/1023)

对参数进行编码后,就可以进行之后的交叉遗传、变异。

 

3,算法框架

以搜索最大值为例:

y=7*sin(1*x)+6*cos(4*x)+1.5*x+1  其中 x [0,10]

找到使y最大的x值

① 实现算法之前的准备

1.参数编码:x的范围是0-10,采用10个染色体,这样二进制共1023,精度u=10/1023=0.01。染色体个数用dim表示:                                       dim=10;

2.种群个数:就是一个种群的总个体数:                                           num=20;

3.迭代次数:根据复杂程度选择,这里10次就够了,一般100-200。 gen=10; 
4.变异率:一般设置为1/dim。                                                            pm=0.1; 
5.交叉率:这里设置的是0.6,60%概率交叉,可以自行尝试。          pc=0.6;   

②算法框架

初始化种群                                           p=init();

迭代开始

for i=a:gen

1.选择优秀个体                                     p_fit=fittest(p);

2,对原种群进行遗传交叉                    son1=crossover(p,pc);,

3。遗传交叉后,进行变异处理             son=mutation(son1,pm);

4.合并子代和父代:                              son=[p_fit;son];

之前没有讲解这里,其实就是进一步的筛选,将优秀父代和产生的子代合并,挑选出优秀的下一代种群。

5.这里的挑选采用的是锦标赛。就是对合并后的所以个体,随机抽搐两个或多个,选最优个体进入新种群。根据种群个数num=20,进行多轮锦标赛,得到新的种群p。

                                                              p=select(son);

end

迭代结束

即可算出最优解。如图所示

4,代码  MATLAB

my_ga.m(主函数)

init.m(初始化函数)

fittest.m(选择优秀父代个体)

crossover.m   (交叉遗传)

mutation.m    (变异)

select.m       (筛选出下一代种群,锦标赛选择法)

plot_ga.m  (画图,显示优化过程)

best.m  (迭代完成后,显示最优解以及最优方案)

my_ga.m(主函数)

clear
clc
dim=10;                 % 表示染色体的长度(即维数,二值数的长度),根据编码的长度决定
num=20;                 % 表示群体的大小,根据问题的复杂程度确定。
gen=10;                 % 迭代次数  该问题简单,这里只采用10次迭代,根据问题的复杂程度确定。
pm=0.1;                 % 变异概率,一般 1/dim
pc=0.6;                 % 交叉概率
p=init(num,dim);        % 初始化种群for i=1:genp_fit=fittest(p);       % 在种群中选择优秀个体 p_fitson1=crossover(p,pc);   % 在种群中进行遗传交叉得到子代 半成品son=mutation(son1,pm);  % 半成品子代还需进行编译才能成为真正子代 sonson=[p_fit;son];        % 将优秀父代和子代合并 ,进行选择p=select(son);          % 采用锦标赛的选择算子,进行适者生存,才生新种群plot_ga(p)              % 画出新种群
end
[p_best,value]=best(p)      % 迭代后最终的最优个体

  init.m(初始化函数)

%init
% init.m是进行群体的初始化,产生初始种群,num表示群体的大小,dim表示染色体的长度(即维数,二值数的长度),function pop=init(num,dim) 
pop=round(rand(num,dim)); 

  fittest.m(选择优秀父代个体)

% fittest.m
% 1,计算目标值,2.计算对应适应值
% 设定优秀阈值h,小于h不能直接进入下一代种群选择,大于h适应值为目标值,和子代一起进入选择。% 1,计算目标值,
function p_fit=fittest(p)
x1=zeros([1,20]);
for i=1:20for j=1:10x1(i)=x1(i)+2^(10-j)*p(i,j);end
end
x=x1*10/1023;                       %2^10-1=1023
p1=7*sin(1*x)+6*cos(4*x)+1.5*x+1;   %计算目标值% 2.计算对应适应值,以及确定优秀个体
h=3;
j=1;
for i=1:20if p1(i)>h                   p_fit(j,:)=p(i,:);    j=j+1;end    
end

   crossover.m   (交叉遗传)

% 交叉
% 对于下面两个父代,x1,x2。染色体被分为两组,相互交叉得到子代 y1,y2。
% x1=01001 11010  交   y1=01001 00100
% x2=10101 00100  叉   y2=10101 11010function son=crossover(p,pc)    
s=size(p);
son=zeros(size(p));
for i=1:round(s(1)/2-0.5)                                            if(rand(1)<pc)cross=round(rand(1)*s(2));son((i-1)*2+1,:)=[p((i-1)*2+1,1:cross),p(i*2,cross+1:s(2))];son(i*2,:)=[p(i*2,1:cross),p((i-1)*2+1,cross+1:s(2))];elseson((i-1)*2+1,:)=p((i-1)*2+1,:);son(i*2,:)=p(i*2,:);end
end

  mutation.m    (变异)

% mu1tation--变异
%子代染色体序列中,可能变异导致 1 变为 0 、 0 变为 1 。function son=mutation(son1,pm)s=size(son1);son=zeros(s);for i=1:s(1)son(i,:)=son1(i,:);if(rand(1)<pm)multa=round(rand(1)*s(2)+0.5);     %产生的变异点在1-10之间if son(i,multa)==0son(i,multa)=1;elseson(i,multa)=0;endendend
end


   select.m       (筛选出下一代种群,锦标赛选择法)

function p=select(son) 
p=zeros([20,10]);
s=size(son);
x1=zeros([1,s(1)]);
for i=1:s(1)for j=1:10x1(i)=x1(i)+2^(10-j)*son(i,j);end
end
x=x1*10/1023;                       %2^10-1=1023
p_obj1=7*sin(1*x)+6*cos(4*x)+1.5*x+1;   %计算目标函数值
p_obj1=p_obj1';
%第一赛季
randidx=randperm(s(1));            %打乱顺序进行锦标赛
son_s1=son(randidx,:);                        %第一赛季数据
p_s1=p_obj1(randidx,:); 
p_obj2=[];
son2=[];
for i=1:round(s(1)/2-0.5)if p_s1(2*i)>p_s1(2*i-1)p(i,:)=son_s1(2*i,:);p_obj2=[p_obj2;p_s1(2*i-1)];son2=[son2;son_s1(2*i-1,:)];elsep(i,:)=son_s1(2*i-1,:);p_obj2=[p_obj2;p_s1(2*i)];son2=[son2;son_s1(2*i,:)];end
endnum_x=20-round(s(1)/2-0.5);
s_s2=size(son2);
randidx_s2=randperm(s_s2(1));            %打乱顺序进行锦标赛
son_s2=son2(randidx_s2,:);                        %第一赛季数据
p_s2=p_obj2(randidx_s2,:); 
if num_x>0d=round(s_s2(1)/num_x-0.5);for i=1:num_x[s2_max,s2_x]=max(p_obj2(d*(i-1)+1:d*i));p(round(s(1)/2-0.5)+i,:)=son_s2(d*(i-1)+s2_x,:);end
end


   plot_ga.m  (画图,显示优化过程)

function plot_ga(p)
clf(figure(1))
figure(1)
fplot(@(x)7.*sin(1.*x)+6.*cos(4.*x)+1.5.*x+1,[0 10])
x1=zeros([1,20]);
for i=1:20for j=1:10x1(i)=x1(i)+2^(10-j)*p(i,j);end
end
x=x1*10/1023;                       %2^10-1=1023
p1=7*sin(1*x)+6*cos(4*x)+1.5*x+1;   %计算目标值hold on
plot(x,p1,'r*')pause(0.5)  
% delete(plot(x,p1,'r*'))

  best.m  (迭代完成后,显示最优解以及最优方案)

function [p_best,value]=best(p)
x1=zeros([1,20]);
for i=1:20for j=1:10x1(i)=x1(i)+2^(10-j)*p(i,j);end
end
x=x1*10/1023;                       %2^10-1=1023
p1=7*sin(1*x)+6*cos(4*x)+1.5*x+1;   %计算目标值[value,b]=max(p1);
p_best=p(b,:);



http://chatgpt.dhexx.cn/article/5V6JuEh7.shtml

相关文章

遗传算法的基本原理

1、简介 遗传算法是一种基于自然选择和群体遗传机理的搜索算法,它模拟了自然选择和自然遗传过程中的繁殖、杂交和突变现象.再利用遗传算法求解问题时,问题的每一个可能解都被编码成一个“染色体”,即个体,若干个个体构成了群体(所有可能解).在遗传算法开始时,总是随机的产生一些…

遗传算法原理介绍

前言 遗传算法( genetic algorithm,GA)是模拟自然界生物进化机制的一种算法,即遵循适者生存、优胜劣汰的法则&#xff0c;也就是寻优过程中有用的保留无用的则去除。在科学和生产实践中表现为在所有可能的解决方法中找出最符合该问题所要求的条件的解决方法,即找出一个最优解。…

遗传算法原理及其matlab程序实现

遗传算法原理及其matlab实现 一、遗传算法背景二、遗传算法原理及其数学模型2.1 编码方式2.1.1 二进制编码2.1.2 浮点数编码 2.2 种群初始化2.3 计算初始种群的适应度函数值2.4 对初始种群个体进行筛选—天泽&#xff08;以轮盘赌方式进行选择&#xff09;2.5 个体染色体交叉及…

遗传算法原理及其python实现

遗传算法原理 基本思想&#xff1a; 遗传算法&#xff08;Genetic Algorithm&#xff0c;GA&#xff09;是一种进化算法&#xff0c;其基本原理是仿效生物界中的“物竞天择、适者生存”的演化法则&#xff0c;它最初由美国Michigan大学的J. Holland教授于1967年提出。遗传算法…

智能算法——遗传算法原理、应用汇总

一、遗传算法原理 遗传算法&#xff08;GA&#xff09;是一种基于生物界规律和自然遗传机制的并行搜索算法。1975 年&#xff0c;J. Holland 教授首次在书中提出“自然组合人工智能系统的适应性”。它是一种多参数&#xff0c;多组合同时优化方法&#xff0c;模拟自然进化过程中…

遗传算法原理

一、遗传算法简介 遗传算法是进化算法的一个分支. 它将达尔文的进化理论搬进了计算机. 科学定义如下&#xff1a; **遗传算法&#xff08;Genetic Algorithm, GA&#xff09;**起源于对生物系统所进行的计算机模拟研究。它是模仿自然界生物进化机制发展起来的随机全局搜索和优…

遗传算法

目录 一、算法原理 二、代码实现 三、结果分析 优化目标函数为Rastrigin(x) 目标函数为Schaffer(x) 目标函数为Griewank(x) 总结 一、算法原理 1、基本原理 遗传算法是一种典型的启发式算法&#xff0c;属于非数值算法范畴。其目的是抽象和严谨地解释自然界的适应过程以…

遗传算法(GA)详解

遗传算法&#xff08;GA&#xff09;详解 遗传算法主要作用是求解最优解&#xff0c;例如求函数极值&#xff0c;或是飞机巡航问题中的最短巡航路线的求解等&#xff0c;其作用与模拟退火算法的作用较为相似。本文将从GA算法的原理&#xff0c;结构与两个实践应用进行比较详细…

html中热区如何设置,Dreamweaver中如何设置热区?DW设置热区方法图解

Dreamweaver中如何设置热区?下面小编就为大家详细介绍一下&#xff0c;一起来看看吧&#xff01; 方法/步骤 向平时一样&#xff0c;这里我们在设置Dreamweaver热区的时候。同样这里是需要建立一个新的HTML界面的。 建立完毕&#xff0c;如下图中所示的一个新的文档(HTML) 按照…

用html编写或在dw中完成,Dreamweaver教程-在 Dreamweaver 中编写 HTML 代码

Dreamweaver教程-在 Dreamweaver 中编写 HTML 代码,代码,教程,标签,光标,文本 Dreamweaver教程-在 Dreamweaver 中编写 HTML 代码 易采站长站&#xff0c;站长之家为您整理了Dreamweaver教程-在 Dreamweaver 中编写 HTML 代码的相关内容。 1.启动 Dreamweaver CS5 2.点击左上角…

dw写HTML怎么设置背景颜色,dreamweaver cs6设置div背景颜色的具体操作教程

最近有不少刚刚接触dreamweaver cs6的伙伴们&#xff0c;并不是很熟悉其中是怎么设置div背景颜色?本期为你们分享的文章就讲述dreamweaver cs6设置div背景颜色的具体流程介绍。 dreamweaver cs6设置div背景颜色的具体操作教程 首先需要打开dreamweaver cs6软件&#xff0c;添加…

dw html转为css,DIV+CSS辅助软件Dreamweaver介绍

DIVCSS开发软件之Adobe Dreamweaver介绍 接下来我们(www.divcss5.com)给大家介绍是大家最熟悉不过的软件Adobe Dreamweaver&#xff0c;他被称为网页三剑客之一主要成员。 Dreamweaver我们常称他为DW,是开发DIVCSS比较好的工具。 Dreamweaver特点 1、开发css具体完善快捷简便提…

html中水平线颜色代码,网页设计水平线代码 怎么在dw中修改水平线的颜色

在Dreamweaver里有以下办法&#xff1a; 设计视图&#xff0c;点插入菜单-HTML-水平线&#xff0c;或者在代码视图&#xff0c;直接输入即可&#xff1b; 插入一个高度为1px的表格或div&#xff0c;一定要删除空格符 &#xff0c;div的话还要设置超出隐藏&#xff1b; 可以用CS…

html基础dw,HTML基础DW使用教程

1、打开文件拓展名&#xff1a; 方法一.打开计算机→组→文件夹和搜索选项→查看&#xff0c;把隐藏拓展名的勾取掉。 方法二.打开计算机→文件夹选项→查看&#xff0c;把隐藏拓展名的勾取掉。 2.桌面新建一个记事本&#xff0c;把.txt后缀改成HTML。 3.右键打开方式&#xff…

前端基础--DW的使用

前端基础–DW 开发工具与关键技术&#xff1a;DW/浏览器 &#xff1b; DW的使用。 作者&#xff1a;刘佳明 撰写时间&#xff1a;2019年1月 28 日 在学习前端的第一步首先便是学会正确的使用DW这一个编程app&#xff1b;下面便由我自己编写关于DW的使用过程 第一步&#xff…

dw怎么让html使用css样式,dw怎么用css样式?

dw怎么用css样式&#xff1f; 首先介绍一下CSS样式的属性&#xff1a; CSS样式属性被分为八大类&#xff1a;类型&#xff0c;背景&#xff0c;区块&#xff0c;方框&#xff0c;边框&#xff0c;列表&#xff0c;定位&#xff0c;扩展。 类型主要定义文本的字体&#xff0c;大…

Dwr 实例教程

原创作品&#xff0c;允许转载&#xff0c;转载时请务必以超链接形式标明文章 原始出处 、作者信息和本人声明。否则将追究法律责任。 作者&#xff1a; 永恒の_☆ 地址&#xff1a; http://blog.csdn.net/chenghui0317/article/details/9842873 一、Dwr的介绍 Dwr 简称 Direct…

Dreamweaver css盒模型

CSS盒模型概述&#xff1a;CSS盒模型(Box Model)规定了元素处理元素内容&#xff08;content&#xff09;、内边距&#xff08;padding&#xff09;、边框&#xff08;border&#xff09;、外边距&#xff08;margin&#xff09;的方式。 下图为盒模型模型图 盒模型各部分说明…

Dreamweaver css定位

规定元素的定位类型。 说明&#xff1a;这个属性定义建立元素布局所用的定位机制。任何元素都可以定位&#xff0c;不过绝对定位或固定元素会生成一个块级框&#xff0c;而不论该元素本身是什么类型。相对定位元素会相对于它在正常流中的默认位置偏移。 通过设置top bottom l…

DWR(2):DWR配置详情

下面我们通过一个简单的入门项目来讲解DWR的配置。 首先新建一个maven项目&#xff0c;结构如下&#xff1a; 1 引入依赖 <dependency><groupId>org.directwebremoting</groupId><artifactId>dwr</artifactId><version>3.0.0-RELEASE<…