遗传算法编码
遗传算法的基本原理和对生活的启示

遗传算法的基本原理和对生活的启示一、遗传算法的基本原理遗传算法是一种受自然界进化机制启发的优化算法,其基本原理主要包括基因编码、初始种群的产生、适应度函数的确定、选择操作、交叉操作和变异操作等几个方面。
1.基因编码:遗传算法需要对问题进行编码,将问题的解空间映射到基因空间。
常见的编码方式有二进制编码、实数编码等。
2.初始种群的产生:通过随机方式生成一定数量的初始解,构成初始种群。
3.适应度函数的确定:根据问题的目标函数,定义适应度函数,用于评估种群中每个个体的优劣。
4.选择操作:根据适应度函数,选择适应度较高的个体进行遗传操作,生成下一代种群。
5.交叉操作:通过交叉配对和重组,生成新的个体。
6.变异操作:对个体的一定概率发生基因位的变异,增加种群的多样性。
遗传算法通过不断的迭代,不断优化种群中的个体,最终得到满足要求的最优解。
二、对生活的启示遗传算法的原理不仅在计算机科学中有着广泛的应用,而且也能给我们的生活带来很多启示。
以下是一些主要的启示:1.适应环境:在自然界中,生物通过进化适应环境。
同样,在生活中,我们也应该积极适应环境,不断学习和改进自己。
2.多样性思维:遗传算法中的变异操作增加了种群的多样性,使得算法能够更好地搜索解空间。
在解决问题时,我们也应该尝试多种方法,不要局限于一种思路。
3.持续优化:遗传算法通过不断迭代优化种群中的个体,最终得到最优解。
在生活中,我们也应该不断优化自己的行为和思维,提升自己的能力和素质。
4.合作与竞争:遗传算法中的选择和交叉操作体现了竞争和合作的机制。
在竞争中,优秀的个体得以保留;在合作中,新的个体得以产生。
这启示我们在生活中要学会竞争与合作,互相促进,共同成长。
如何选择合适的遗传算法编码方式

如何选择合适的遗传算法编码方式遗传算法是一种模拟自然进化过程的优化算法,广泛应用于解决复杂问题。
在遗传算法中,编码方式是决定问题求解效果的关键因素之一。
选择合适的遗传算法编码方式可以提高算法的效率和准确性。
本文将探讨如何选择合适的遗传算法编码方式。
1. 二进制编码二进制编码是最常见的遗传算法编码方式之一。
它将问题的解表示为一串二进制数,每个二进制位代表问题的一个属性或变量。
二进制编码简单直观,易于实现和理解。
对于离散型问题和某些连续型问题,二进制编码是一个不错的选择。
例如,对于旅行商问题,可以使用二进制编码来表示每个城市的访问顺序。
2. 实数编码实数编码将问题的解表示为一组实数。
每个实数代表问题的一个属性或变量的取值。
实数编码适用于连续型问题,如函数优化问题。
相比于二进制编码,实数编码可以提供更精确的解。
然而,实数编码的缺点是编码长度不确定,导致搜索空间的大小难以确定。
3. 排列编码排列编码适用于需要考虑元素顺序的问题,如旅行商问题中城市的访问顺序。
排列编码将问题的解表示为一组元素的排列。
每个元素代表问题的一个属性或变量。
排列编码可以保证每个元素只出现一次,因此适用于需要排除重复元素的问题。
4. 集合编码集合编码适用于需要考虑元素集合的问题,如集合覆盖问题。
集合编码将问题的解表示为一组元素的集合。
每个集合代表问题的一个属性或变量。
集合编码可以保证每个元素只出现一次,并且可以方便地进行集合操作,如并集、交集和差集。
选择合适的遗传算法编码方式需要考虑问题的特点和求解目标。
以下几点可以作为选择编码方式的参考:1. 问题类型:根据问题的属性和变量类型选择编码方式。
如果问题是离散型问题,二进制编码可能是一个不错的选择。
如果问题是连续型问题,实数编码可能更加适合。
2. 解的表示:考虑问题的解在编码方式下的表示形式。
例如,对于旅行商问题,二进制编码可以表示城市的访问顺序;排列编码可以保证每个城市只出现一次。
3. 搜索空间的大小:考虑编码方式对搜索空间大小的影响。
遗传算法的基本概念

遗传算法基本概念遗传算法是一种基于生物进化原理的优化搜索算法。
它通过模拟自然界的遗传机制,如遗传编码、适应度函数、选择、交叉和变异等过程,寻找最优解。
下面将详细介绍遗传算法的各个组成部分。
1. **遗传编码**遗传编码是遗传算法中表示解的一种方式,它将问题的解空间映射到基因空间。
常见的编码方式有二进制编码、实数编码和排列编码等。
二进制编码使用0和1表示基因,实数编码使用连续实数表示基因,排列编码则使用解的排列顺序表示基因。
2. **适应度函数**适应度函数用于评估个体的适应度,即解的质量。
适应度函数值越大,解的质量越好。
根据问题的不同,适应度函数的设计也有所不同。
在设计适应度函数时,需要确保其能够反映问题的实际需求,并且能够指导算法向更好的解进化。
3. **选择操作**选择操作是根据个体的适应度值来决定其在下一代中的存活概率。
常用的选择策略有轮盘赌选择、锦标赛选择和排序选择等。
选择操作的目标是保持算法的多样性,并逐渐向更好的解靠近。
4. **交叉操作**交叉操作是将两个个体的部分基因进行交换,以产生新的个体。
常见的交叉方式有单点交叉、多点交叉和均匀交叉等。
通过交叉操作,遗传算法能够继承父代个体的优良基因,并尝试探索新的解空间。
5. **变异操作**变异操作是对个体的基因进行随机改变,以增加种群的多样性。
变异操作可以避免算法陷入局部最优解,并扩大搜索空间。
常见的变异方式有位反转、倒位和点突变等。
6. **终止条件**终止条件用于确定算法何时结束运行。
常见的终止条件有达到预设的最大迭代次数、连续多代个体适应度值无明显改进等。
遗传算法中常见的编码方式

遗传算法中常见的编码方式
遗传算法是一种基于进化原理的优化算法,其中最重要的一步是对问题进行编码。
编码方式的选择会直接影响算法的效率和求解质量。
在遗传算法中,常见的编码方式有以下几种:
1. 二进制编码
二进制编码是最常见的编码方式,将每个个体表示为一串由0和1组成的二进制字符串。
这种编码方式简单易懂,容易实现,但是当问题的解空间较大时可能会导致编码长度过长。
2. 编码浮点数
编码浮点数是将问题中的实数变量编码成二进制数。
这种编码方式的优点是可以直接映射到问题的实际值,但是也因此可能导致精度问题。
3. 排列编码
排列编码是将问题中的离散变量编码成一个排列。
这种编码方式适用于需要考虑变量之间相对位置的问题,如旅行商问题。
4. 树形编码
树形编码是将问题转换成树形结构进行编码,这种编码方式适用于需要考虑变量之间的依赖关系的问题。
5. 重组编码
重组编码是将问题中的变量按照一定的规则进行编码。
这种编码方式适用于具有局部结构的问题,如图着色问题和社区发现问题。
以上是遗传算法中常见的编码方式,不同的问题需要选择适合的
编码方式才能获得最优的求解结果。
遗传算法(浮点数编码)

浮点数编码实现遗传算法遗传算法主要包括三个主要操作,选择、交叉和变异。
用浮点数编码进行运算,三种操作方法如下:选择:1. 计算i f 和n i S f =∑2. 计算ii nf P S =3. 累计概率1ii j j g P ==∑4. 产生均匀分布0~1的随机数r5. 将r 与i g 比较,如果1i i g r g -≤≤,则选择个体i 进入到下一代新群体6. 反复执行4和5,直至新群体的个体数目等于父代群体规模交叉:11(1)(1)t tt A B A t t t B A Bx x x x x x αααα++=+-=+- 其中,1t A x +和1t B x +是交叉之后的个体,t A x 和tB x 是随机选择的两个个体,α是交叉的一个常数, 取值为(0,1]。
变异:1max min()()%20()()%21t t t A A A tt A A x k x x r rand x x k x x r rand +⎧+⋅-⋅==⎨-⋅-⋅=⎩,,1t A x +是变异之后的个体,tA x 是变异之前的个体,k 是变异的一个常数,取值为(0,1],max x 是个体的上限,min x 是个体的下限,r 是产生的随机数。
适应度线性变换:F aF b '=+其中F 是原适应度,F '是变换之后的适应度,a,b 是变换的系数。
适应度线性变换要满足下面两个条件:条件一:avgavg F F '= 条件二:maxavg F C F '=⋅C=1.2~2缩放时参数a,b 的计算方法可以用如下方法: 如果满足:maxmin 1avg C F F F C ⋅->-就令:max (1)avg avg C a F F F -=-max max avg avg avgF C F b F F F -⋅=-否则:min avgavg F a F F =- min min avgavg F F b F F ⋅=- 实现代码如下:#include<stdio.h>#include<stdlib.h>#include<math.h>#include<time.h>#define M 80 //种群数量#define XMIN -1 //下限#define XMAX 2 //上限#define PI 3.1415926#define PC 0.8 //交叉概率#define PM 0.18 //变异概率#define PA 0.01 //交叉因子struct Node{double Pmember;double Myfitness; //Myfitness是适应度double Myfitsum; //Myfitsum是适应度占总体适应度的百分比,然后从第一个个体往后累加,主要用于选择操作}Nownode[M],Nextnode[M]; //本代群体和下一代群体int nodeindex[M]; //交叉时随机配对,存放配对的群体下标int T=0;double fx(double x) //根据x计算fx{double y;y=x*sin(10*PI*x)+2;//y=100-(x-5)*(x-5);return y;}int calfitness() //计算适应度值{int i;double minfitness,maxfitness,avefitness=0;double C=1.7,a,b;double temp;minfitness=Nownode[0].Myfitness=fx(Nownode[0].Pmember);maxfitness=minfitness;avefitness=maxfitness;for(i=1;i<M;i++){Nownode[i].Myfitness=fx(Nownode[i].Pmember);avefitness+=Nownode[i].Myfitness;if(minfitness>Nownode[i].Myfitness){minfitness=Nownode[i].Myfitness;}if(maxfitness<Nownode[i].Myfitness){maxfitness=Nownode[i].Myfitness;}}if(minfitness<0)//如果有负的适应度值,就把所以的适应度都加上一个数,使适应度全都为正数{temp=minfitness;Nownode[0].Myfitness+=-temp;avefitness=Nownode[0].Myfitness;maxfitness=Nownode[0].Myfitness;minfitness=Nownode[0].Myfitness;for(i=1;i<M;i++){Nownode[i].Myfitness+=-temp;avefitness+=Nownode[i].Myfitness;if(minfitness>Nownode[i].Myfitness){minfitness=Nownode[i].Myfitness;}if(maxfitness<Nownode[i].Myfitness){maxfitness=Nownode[i].Myfitness;}}}//适应度线性变换avefitness=avefitness/M;//计算平均适应度if(minfitness>(C*avefitness-maxfitness)/(C-1)){a=(C-1)*avefitness/(maxfitness-avefitness);b=(maxfitness-C*avefitness)*avefitness/(maxfitness-avefitness);}else{a=avefitness/(avefitness-minfitness);b=minfitness*avefitness/(avefitness-minfitness);}for(i=0;i<M;i++){Nownode[i].Myfitness=a*Nownode[i].Myfitness+b;}Nownode[0].Myfitsum=Nownode[0].Myfitness;for(i=1;i<M;i++){Nownode[i].Myfitsum=Nownode[i].Myfitness+Nownode[i-1].Myfitsum;//每一个Myfitsum都是自己的适应度加上前一个的Myfitsum}for(i=0;i<M;i++){Nownode[i].Myfitsum=Nownode[i].Myfitsum/Nownode[M-1].Myfitsum;//每一个Myfitsum除以所有适应度之和,使Myfitsum为0~1之间}return 0;}double randn() //产生XMIN到XMAX之间的随机数{return XMIN+1.0*rand()/RAND_MAX*(XMAX-XMIN);}int initpopulation() //初始化种群{int i;for(i=0;i<M;i++){Nownode[i].Pmember=randn();}calfitness(); //计算适应度return 0;}int assignment(struct Node *node1,struct Node *node2)//把node2的值赋值给node1{node1->Pmember=node2->Pmember;node1->Myfitness=node2->Myfitness;node1->Myfitsum=node2->Myfitsum;return 0;}int copypopulation() //复制操作{int i,num=0;double temp;while(num<M){temp=1.0*rand()/RAND_MAX;for(i=1;i<M;i++){if(temp<=Nownode[0].Myfitsum){assignment(&Nextnode[num++],&Nownode[0]);//把第一个个体复制到下一代break;}if(temp>=Nownode[i-1].Myfitsum&&temp<=Nownode[i].Myfitsum)//把第i个个体复制到下一代{assignment(&Nextnode[num++],&Nownode[i]);break;}}}for(i=0;i<M;i++){assignment(&Nownode[i],&Nextnode[i]); //更新本代个体}calfitness(); //计算适应度return 0;}int isrepeat(int temp,int n) //产生随机下标判断是否重复{int i;for(i=0;i<n;i++){if(nodeindex[i]==temp)return 1;}return 0;}int crossover(){int i,temp;double temp_pc;for(i=0;i<M;i++) //产生交叉点的下标{do {temp=rand()%M;} while(isrepeat(temp,i));nodeindex[i]=temp;}for(i=0;i<M;i=i+2){temp_pc=1.0*rand()/RAND_MAX; //如果满足交叉的条件,就开始交叉if(temp_pc<=PC){Nownode[nodeindex[i]].Pmember=PA*Nownode[nodeindex[i+1]].Pmember+(1-PA)*Nowno de[nodeindex[i]].Pmember;Nownode[nodeindex[i+1]].Pmember=PA*Nownode[nodeindex[i]].Pmember+(1-PA)*Nowno de[nodeindex[i+1]].Pmember;}}calfitness(); //计算适应度return 0;}int mutation() //变异操作{int i,temp;double k=0.8,temp_pm;for(i=0;i<M;i++){temp_pm=1.0*rand()/RAND_MAX;if(temp_pm<=PM) //如果满足变异条件,就开始变异{temp=rand()%2;if(temp==0){Nownode[i].Pmember=Nownode[i].Pmember+k*(XMAX-Nownode[i].Pmember)*1.0*rand( )/RAND_MAX;}else{Nownode[i].Pmember=Nownode[i].Pmember-k*(Nownode[i].Pmember-XMIN)*1.0*rand()/ RAND_MAX;}}}calfitness(); //计算适应度return 0;}int findmaxfit()//找到适应度最大的个体{int i,index=0;double temp=0;for(i=0;i<M;i++){if(temp<Nownode[i].Myfitness){index=i;temp=Nownode[i].Myfitness;}}return index;}int main(){int i=0,index;int num=0,num1=0,num2=0;srand(time(NULL));while(num++<1000){T=0;initpopulation();while(T++<200){copypopulation();crossover();mutation();}index=findmaxfit();if(fabs(Nownode[index].Pmember-1.85)<=0.1){num1++;}else{num2++;}}printf("正确的次数有%d次\n",num1);printf("错误的次数有%d次\n",num2);return 0;}。
遗传算法的基本原理和方法

遗传算法的基本原理和⽅法遗传算法的基本原理和⽅法⼀、编码编码:把⼀个问题的可⾏解从其解空间转换到遗传算法的搜索空间的转换⽅法。
解码(译码):遗传算法解空间向问题空间的转换。
⼆进制编码的缺点是汉明悬崖(Hamming Cliff),就是在某些相邻整数的⼆进制代码之间有很⼤的汉明距离,使得遗传算法的交叉和突变都难以跨越。
格雷码(Gray Code):在相邻整数之间汉明距离都为1。
(较好)有意义的积⽊块编码规则:所定编码应当易于⽣成与所求问题相关的短距和低阶的积⽊块;最⼩字符集编码规则,所定编码应采⽤最⼩字符集以使问题得到⾃然的表⽰或描述。
⼆进制编码⽐⼗进制编码搜索能⼒强,但不能保持群体稳定性。
动态参数编码(Dynamic Paremeter Coding):为了得到很⾼的精度,让遗传算法从很粗糙的精度开始收敛,当遗传算法找到⼀个区域后,就将搜索现在在这个区域,重新编码,重新启动,重复这⼀过程,直到达到要求的精度为⽌。
编码⽅法:1、⼆进制编码⽅法缺点:存在着连续函数离散化时的映射误差。
不能直接反映出所求问题的本⾝结构特征,不便于开发针对问题的专门知识的遗传运算算⼦,很难满⾜积⽊块编码原则2、格雷码编码:连续的两个整数所对应的编码之间仅仅只有⼀个码位是不同的,其余码位都相同。
3、浮点数编码⽅法:个体的每个基因值⽤某⼀范围内的某个浮点数来表⽰,个体的编码长度等于其决策变量的位数。
4、各参数级联编码:对含有多个变量的个体进⾏编码的⽅法。
通常将各个参数分别以某种编码⽅法进⾏编码,然后再将他们的编码按照⼀定顺序连接在⼀起就组成了表⽰全部参数的个体编码。
5、多参数交叉编码:将各个参数中起主要作⽤的码位集中在⼀起,这样它们就不易于被遗传算⼦破坏掉。
评估编码的三个规范:完备性、健全性、⾮冗余性。
⼆、选择遗传算法中的选择操作就是⽤来确定如何从⽗代群体中按某种⽅法选取那些个体遗传到下⼀代群体中的⼀种遗传运算,⽤来确定重组或交叉个体,以及被选个体将产⽣多少个⼦代个体。
遗传算法双层编码

遗传算法的双层编码(Two-layer Encoding)是一种在解决特定复杂优化问题时采用的编码策略,特别适用于具有层次结构或多个决策级别的问题。
在双层编码中,个体的表示被划分为两个或多个相互关联的部分,每一部分分别对应问题的不同层面。
例如,在处理一些复杂的组合优化问题如多级物流配送问题、任务调度问题或者多层次的决策结构设计问题时,可能需要将问题分解为上层和下层结构,每个层级都有其对应的决策变量:
1. 第一层编码:通常用于表达高层级的决策变量,如区域分配、主路径选择等。
2. 第二层编码:用于描述低层级的具体操作细节,比如在给定区域内的具体路线规划、任务在某个阶段的具体安排等。
在进化过程中,遗传算法不仅对整体结构进行变异和交叉,同时对每层编码也独立进行这些操作。
这样可以确保在保持整体结构合理的同时,也能细化到局部最优解的搜索。
例如,在求解MDARP(Multi-Dimensional Assignment Problem with Routing Paths)这类问题时,可能会首先通过第一层编码确定车辆与客户之间的大致分配关系,然后通过第二层编码详细指定每辆车的行驶路径。
在每次迭代中,双层编码都会同时更新两层编码的信息,以适应不断优化的过程。
遗传算法编码

遗传算法编码1. 引言遗传算法编码是遗传算法的重要组成部分,它决定了问题的解空间以及遗传算法的搜索能力。
本文将深入探讨遗传算法编码的原理、常用编码方式以及编码的优化方法。
2. 遗传算法概述遗传算法是一种模拟自然选择和遗传机制的搜索算法,它通过模拟生物进化的过程来寻找最优解。
遗传算法包含三个基本操作:选择、交叉和变异。
而编码是其中非常重要的一步,它将问题的解空间映射到遗传算法的搜索空间。
3. 二进制编码二进制编码是遗传算法中最常用的编码方式之一。
它将问题的解表示为一个二进制串,每个基因位上的0或1代表了一种取值。
例如,对于一个长度为10的二进制串,可以表示从0到1023的整数。
二进制编码的优点是简单、易于实现,但对于连续型问题的表示能力较弱。
3.1 基本二进制编码基本二进制编码将问题的解空间均匀划分为若干个区间,每个区间对应一个二进制码。
通过二进制码的变换和操作,可以实现选择、交叉和变异等基本操作。
但基本二进制编码的缺点是解空间的粒度较大,可能导致搜索效率低下。
3.2 Gray编码Gray编码是一种改进的二进制编码方式,它通过保证相邻两个码之间只有一个位的变化,减小了解空间的粒度。
Gray编码在交叉和变异操作中具有更好的性质,能够减小搜索空间的距离。
因此,Gray编码常用于需要高精度的遗传算法问题中。
4. 实数编码实数编码是另一种常用的遗传算法编码方式,它将问题的解表示为一个实数。
实数编码的优点是对连续型问题的表示能力较强,可以更精确地描述解空间。
但相比于二进制编码,实数编码的实现较为复杂。
4.1 浮点数编码浮点数编码是实数编码的一种常见形式。
它将问题的解表示为一个浮点数,通过确定小数点位置和精度来描述解的取值范围。
浮点数编码适用于解空间较大且精度要求一般的问题。
4.2 实数编码实数编码是一种更为灵活的编码方式,它将问题的解表示为一个实数,可以包含任意精度的小数部分。
实数编码适用于解空间较小且精度要求较高的问题。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
遗传算法编码
读万卷书不如行万里路,今天下决心写一个SGA(Simple Genetic Alogrithms)程序,是求解非约束优化问题。
max f(x1,x2) = 21.5 + x1*sin(4 * PI *x1) + x2*sin(20 * PI * x2)
-3.0 <= x1 <= 12.1
4.1 <= x2 <=
5.8
这可是遗传算法中最容易的,可是结果却令人失望,在整个求解过程中都收敛在局部最优,只有通过加大变异率才能求得全局最优,但问题可想而知:全局最优解不稳定,就好像是昙花一现。
查了一下资料才发现是编码设计的问题。
我用的是二进制编码。
编码是应用遗传算法时要解决的首要问题,也是设计遗传算法时的一个关键步骤。
编码方法影响到交叉算子、变异算子等遗传算子的运算方法,大很大程度上决定了遗传进化的效率。
迄今为止人们已经提出了许多种不同的编码方法。
总的来说,这些编码方法可以分为三大类:二进制编码法、浮点编码法、符号编码法。
下面我们从具体实现角度出发介绍其中的几种主要编码方法。
1.二进制编码方法:
它由二进制符号0和1所组成的二值符号集。
它有以下一些优点:
1) 编码、解码操作简单易行
2) 交叉、变异等遗传操作便于实现
3) 符合最小字符集编码原则
4) 利用模式定理对算法进行理论分析。
二进制编码的缺点是:对于一些连续函数的优化问题,由于其随机性使得其局部搜索能力较差,如对于一些高精度的问题(如上题),当解迫近于最优解后,由于其变异后表现型变化很大,不连续,所以会远离最优解,达不到稳定。
而格雷码能有效地防止这类现象
2.格雷码方法:
格雷码方法是这样的一种编码方法,其连续两个整数所对应的编码值之间仅仅只有一个码位是不同的。
如下表
m m-121m m-121
由二进制编码转格雷码的转换公式为:
g m = b m
g i = b i+1⊕b i ,i=m-1,m-2,…2,1(真异或假的结果是真,假异或真的结果也是真,真异或真的结果是假,假异或假的结果是假)
由格雷码转二进制的转换公式为:
b m = g m
b i = b i+1⊕g i, i=m-1,m-2,…2,1
从以上表格可以看出,当一个染色体变异后,它原来的表现现和现在的表现型是连续的。
格雷码编码的主要优点是:
1) 便于提高遗传算法的局部搜索能力
2) 交叉、变异等遗传操作便于实现
3) 符合最小字符集编码原则
4) 便于利用模式定理对算法进行理论分析
3.浮点编码法
对于一些多维、高精度要求的连续函数优化问题,使用二进制编码来表示个体时将会有一些不利之处。
二进制编码存在着连续函数离散化时的映射误差。
个体长度较知时,可能达不到精度要求,而个体编码长度较长时,虽然能提高精度,但却使遗传算法的搜索空间急剧扩大。
所谓浮点法,是指个体的每个基因值用某一范围内的一个浮点数来表示。
在浮点数编码方法中,必须保证基因值在给定的区间限制范围内,遗传算法中所使用的交叉、变异等遗传算子也必须保证其运算结果所产生的新个体的基因值也在这个区间限制范围内。
浮点数编码方法有下面几个优点:
1) 适用于在遗传算法中表示范围较大的数
2) 适用于精度要求较高的遗传算法
3) 便于较大空间的遗传搜索
4) 改善了遗传算法的计算复杂性,提高了运算交率
5) 便于遗传算法与经典优化方法的混合使用
6) 便于设计针对问题的专门知识的知识型遗传算子
7) 便于处理复杂的决策变量约束条件
4.符号编码法
符号编码法是指个体染色体编码串中的基因值取自一个无数值含义、而只有代码含义的符号集如{A,B,C…}。
符号编码的主要优点是:
1) 符合有意义积术块编码原则
2) 便于在遗传算法中利用所求解问题的专门知识
3) 便于遗传算法与相关近似算法之间的混合使用。
但对于使用符号编码方法的遗传算法,一般需要认真设计交叉、变异等遗传运算的操作方法,以满足问题的各种约束村求,这样才能提高算法的搜索性能。