遗传算法之函数优化

一、遗传算法简介:

遗传算法是模拟生物在自然环境下的遗传和进化过程的一种自适应的全局优化搜索算法,通过借助遗传学的原理,经过自然选择、遗传、变异等作用机制进而筛选出具有适应性更高的个体(适者生存)。遗传算法从20世纪七八十年代的诞生到现在主要集中的适用范围为:NP问题(指存在多项式算法能够解决的非决定性问题)、非线性、多峰函数优化和多目标优化问题等等。同时在机器学习、模式识别和神经网络及社会科学中的应用也显得非常出色。

二、遗传算法的实现与目的:

实现 :在计算机上模拟生物的进化过程和基因的操作(选择、交叉、变异)。

目的 :抽象和严谨地解释自然界的适应过程和将自然生物系统的重要机理运用到人工系统的设计中。

三、遗传算法基本术语:

种群:可行解集,遗传算法的求解过程就是从这个子集开始的。

个体:可行解

染色体:可行解的编码

基因:可行解编码的分量

基因形式:遗传编码

适应度函数:其函数值是遗传算法实现优胜劣汰的主要依据。

选择:选择操作

交叉:编码的交叉操作

变异:可行解编码的变异

注:这里的个体与染色体的关系,可以把个体当做是染色体的组合。换句话说就是染色体决定了个体,染色体上基因的操作(选择、交叉、变异)直接作用于个体的形态。染色体是指对个体进行编码后所得到的编码串。染色体中的每1 位称为基因,染色体上由若干个基因构成的一个有效信息段称为基因组。

四、遗传操作:

遗传操作:就包括优选适应性强的个体的“选择”;个体间交换基因产生新个体的“交叉”;个体间的基因突变而产生新个体的“变异”。其中遗传算法是运用遗传算子来进行遗传操作的。即:选择算子、变异算子、交叉算子。

1.选择算子:根据个体的适应度,按照一定的规则,从第n代群体中选择出一些具有优良性状的个体遗传到下一代(n+1)群体中。在这一选择过程中,个体适应度越大,则被选择到下一代的机会越大。

2.交叉算子:将群体P(n)中选中的各个个体随机搭配,对于每一个个体,以某一特定概率(交叉概率Pc(0.25-1.0取值))交换他们之间的部分染色体(编码位串的部分位置)。交叉算法是的,遗传算法的搜索能力得到更好的延伸。

2.1交叉操作的具体步骤可以表述为:1.在交配池中随机取出要交配的一对个体;2,根据编码位串长度L,对要交配的一对个体,随机选取[1,L-1]中的一个或者多个整数k作为交叉位置处,相互交换各自的部分基因,由此形成新的个体。

3.变异操作:对群体的每个个体,以某一个概率(变异概率Pm(0.01-0.1取值))将某一个或者某些基因座上的基因值改变为其他的等位基因值,根据个体的编码方式不同,可以将变异分为实值变异和二进制变异。

3.1变异的操作步骤为:首先,对种群中的所有个体按事先的设定的变异概率判断是否进行变异操作;然后 对判断需要变异的个体进行随机选择变异位进行变异。

遗传算法的简单步骤可为:

1.评估每条染色体所对应个体的适应度。

2.遵照适应度越高,选择概率越大的原则,从种群中选择两个个体作为父方和母方。

3.抽取父母双方的染色体,进行交叉,产生子代。

4.对子代的染色体进行变异。

5.重复2,3,4步骤,直到新种群的产生。

五、遗传算法特点:

1、遗传算法以决策变量的编码作为运算对象,这种对决策变量的编码处理,使得在优化计算中可以借鉴生物学的染色体和基因概念,模拟自然界的生物遗传和进化机制,方便的应用决策变量的编码成的位串进行遗传算子。

2、遗传算法仅仅使用目标函数值变换来的适应度函数值,就可以确定进一步的搜索方向和范围。而不是使用目标函数的求导来进行。

3、遗传操作是基于概率因子来操作的。

4、遗传算法具有自组织、自适应个自学习的特性。
5、多点搜索能力,即遗传算法是同时对多个解进行处理、评估,并行地爬多个峰。这一特点使遗传算法具有较好的全局搜索能力,减少了陷于局部优解的风险。

六、matlab实例:

2维空间搜索,群体规模为80:

3维空间搜索,群体规模为80:

5维空间搜索,群体规模为80:

8维空间搜索,群体规模为80:

2维空间搜索,群体规模为100:

2维空间搜索,群体规模为200:

5维空间搜索,群体规模为100:

5维空间搜索,群体规模为200:

分析 及结论:个体的适应度值越大,被选中的可能性也越大。群体规模数越大,可行解的集合也就越大。

原文地址:https://www.cnblogs.com/twzh123456/p/11788353.html

时间: 2024-11-11 06:17:55

遗传算法之函数优化的相关文章

poj 2154 Color(polya计数 + 欧拉函数优化)

http://poj.org/problem?id=2154 大致题意:由n个珠子,n种颜色,组成一个项链.要求不同的项链数目,旋转后一样的属于同一种,结果模p. n个珠子应该有n种旋转置换,每种置换的循环个数为gcd(i,n).如果直接枚举i,显然不行.但是我们可以缩小枚举的数目.改为枚举每个循环节的长度L,那么相应的循环节数是n/L.所以我们只需求出每个L有多少个i满足gcd(i,n)= n/L,就得到了循环节数为n/L的个数.重点就是求出这样的i的个数. 令cnt = gcd(i,n) =

poj2409 & 2154 polya计数+欧拉函数优化

这两个题都是项链珠子的染色问题 也是polya定理的最基本和最经典的应用之一 题目大意: 用m种颜色染n个珠子构成的项链,问最终形成的等价类有多少种 项链是一个环.通过旋转或者镜像对称都可以得到置换 旋转可以旋转 i=[1,n]次..画图可以看出循环节有gcd(n,i)个 镜像对称的置换画个图也是很容易找的 然后通过polya定理就可以容易的求出等价类的种数了 2409就是这样一个裸题,以下为ac代码 #include <iostream> #include <stdio.h> #

poj 2154 Color 欧拉函数优化的ploya计数

枚举位移肯定超时,对于一个位移i,我们需要的是它的循环个数,也就是gcd(i,n),gcd(i,n)个数肯定不会很多,因为等价于n的约数的个数. 所以我们枚举n的约数,对于一个约数k,也就是循环个数为n/k这样的个数有phi[k]种,证明网上有很多.所以答案就是 phi[k]*(pow(n,n/k)) (k是n的所有约数) 由于约数会很大所以不能打表,只能单个算. 再由于最后要除以n,如果做除法就不能直接取模,所以我们在算每一次pow(n,n/k)的时候,都少乘一个n,这样就相当于除法了. #i

Python3 (函数优化版)简单实现下载某个网站轮播图片

昨日刚刚学习到函数篇,想把函数应用起来,就把前几日写的简单使用函数优化了一下,思路更清晰 import urllib.request import re import os import urllib def getHtml(url): headers = {'User-Agent': 'Mozilla/5.0 (Windows NT 6.1; WOW64; rv:23.0) Gecko/20100101 Firefox/23.0'} redown = urllib.request.Reques

SA:T1编写主函数法和T2Matlab自带的SA工具箱GUI法,两种方法实现对二元函数优化求解——Jason niu

%SA:T1法利用Matlab编写主函数实现对定义域[-5,5]上的二元函数求最优解-Jason niu [x,y] = meshgrid(-5:0.1:5,-5:0.1:5); z = x.^2 + y.^2 - 10*cos(2*pi*x) - 10*cos(2*pi*y) + 20; figure mesh(x,y,z) hold on xlabel('x') ylabel('y') zlabel('z') title('SA:利用SA最优化,定义域[-5,5]上的二元函数z = x^2

汉字转全拼音函数优化方案(SQLServer),值得你看看

函数要求实现功能 select 函数名 ('你好,我是追索') 返回的结果(ni hao , wo shi zhui suo) 解决方案一: 解决方案一 /* 根据汉字获取全拼 1.生成所有读音临时表 2.根据Chinese_PRC_CS_AS_KS_WS 排序获取读音 */ create function dbo.fn_Getquanpin1(@str varchar(100)) returns varchar(8000) as begin declare @re varchar(8000)

poj2054Color polya定理+欧拉函数优化

没想到贱贱的数据居然是错的..搞得我调了一中午+晚上一小时(哦不d飞LJH掉RP毕竟他是BUFF)结果重判就对了五次.. 回归正题,这题傻子都看得出是polya定理(如果你不是傻子就看这里),还没有翻转,就一个旋转,结果我就欢快的打完交上去了.傻子都知道会TLE,n<=1e9啊,O(n)都原地爆炸,那怎么办...一脸懵逼(然后就膜题解了) 可以发现,这题公式就是sigma(gcd(k,n))(k=1~n),然后该怎么优化呢,我(??)发现gcd(k,n)里面肯定有一些k和n的gcd是相同的,那我

iposdb数据库 date函数优化

如下4条SQL,明显是2类SQL语句.2017年5月19号 问题:走了两次全表.select count(*) 活跃商户数量  from (select merchant_code,COUNT(DISTINCT concat(merchant_code,DATE(create_date))) merchantCodeCreateDate from pos_order where DATE(create_date)>='2017-05-12' and DATE(create_date)<='20

嵌入式C函数优化

0. 引言 这是一个简单函数的优化,但却体现了代码易读性和效率的综合考虑. 如果问我如何写出优秀的代码,答曰:再写一版. 1. 版本1 从环形buffer中取出数据,然后放到一个结构体中.buffer中的数据是按字节存储,但是结构体的每个单元数据是int16. void GetDataFromMeas(int8_t *rawDataBuf, fftStruct *fftBufVx) { int8_t *src_ptr = rawDataBuf; // pointer to raw data bu