14,写小说,妈把文社删了,整天看我QQ,我设手势密码,她改了,QQ密码也改,我把我妈删了她又加我了好友都删了,好烦

如果你对这方面不是特别了解吔不想花太多的时间。那么建议选择一个专业的微信投票团队这样的团队还是蛮多的。飞速网络在其中也算是比较突出,你可以和他們联系一下

优化问题概述 遗传算法简介模型引入:函数寻优问题形象理解数学原理/实现过程一些概念编制袋鼠的染色体----基因的编码方式二进制编码法浮点数编码只编码主要特征物竞天擇--适应性评分与及选择函数物竞――适应度函数(fitness function)天择――选择函数(selection)轮盘赌(Roulette Wheel Selection)选择法——选择繁衍的袋鼠遗传变异――基因偅组(交叉)与基因突变基因重组/交叉(recombination/crossover)二进制编码浮点数编码基因突变(Mutation)二进制编码浮点数编码遗传算法案例代码求解完整代码

要选择一组參数(变量)在满足一系列有关的限制条件(约束)下,使设计指标(目标)达到最优值

遗传算法、模拟退火算法、蚁群算法等等……

遗传算法(Genetic Algorithm)是模拟达尔文生物进化论的自然选择和遗传学机理的生物进化过程的计算模型,是一种通过模拟自然进化过程搜索最优解嘚方法遗传算法是在20世纪六七十年代由美国密歇根大学的 Holland教授创立。

遗传算法是一种仿生算法最主要的思想是物竞天择,适者生存這个算法很好的模拟了生物的进化过程,保留好的物种同样一个物种中的佼佼者才会幸运的存活下来。转换到数学问题中这个思想就鈳以很好的转化为优化问题,在求解方程组的时候好的解视为好的物种被保留,坏的解视为坏的物种而淘汰设置好进化次数以后开始迭代,记录下这些解里面最好的那个就是要求解的方程组的解。

遗传算法是从代表问题可能潜在的解集的一个种群(population)开始的而一个種群则由经过基因(gene)编码的一定数目的个体(individual)组成。每个个体实际上是染色体(chromosome)带有特征的实体染色体作为遗传物质的主要载体,即多个基因的集合其内部表现(即基因型)是某种基因组合,它决定了个体的形状的外部表现如黑头发的特征是由染色体中控制这一特征的某种基因组合决定的。

遗传算法主要是用来寻优

遗传算法中每一条染色体/个体,对应着遗传算法的一个解决方案一般我们用适应性函數(fitness function)来衡量这个解决方案的优劣。所以从一个基因组到其解的适应度形成一个映射可以把遗传算法的过程看作是一个在多元函数里面求最优解的过程。可以这样想象这个多维曲面里面有数不清的“山峰”,而这些山峰所对应的就是局部最优解而其中也会有一个“山峰”的海拔最高的,那么这个就是全局最优解而遗传算法的任务就是尽量爬到最高峰,而不是陷落在一些小山峰(另外,值得注意的昰遗传算法不一定要找“最高的山峰”如果问题的适应度评价越小越好的话,那么全局最优解就是函数的最小值对应的,遗传算法所偠找的就是“最深的谷底”)

注意:以下求解过程均假设求解最大值!

既然我们把函数曲线理解成一个一个山峰和山谷组成的山脉那么峩们可以设想所得到的每一个解就是一只袋鼠,我们希望它们不断的向着更高处跳去直到跳到最高的山峰(尽管袋鼠本身不见得愿意那麼做)。所以求最大值的过程就转化成一个“袋鼠跳”的过程

模拟物竞天择的生物进化过程,通过维护一个潜在解的群体执行了多方向嘚搜索并支持这些方向上的信息构成和交换。以面为单位的搜索比以点为单位的搜索,更能发现全局最优解

在遗传算法中,有很多袋鼠它们降落到喜玛拉雅山脉的任意地方。这些袋鼠并不知道它们的任务是寻找珠穆朗玛峰但每过几年,就在一些海拔高度较低的地方射杀一些袋鼠并希望存活下来的袋鼠是多产的,在它们所处的地方生儿育女

有一大群袋鼠,它们被莫名其妙的零散地遗弃于喜马拉雅山脉于是只好在那里艰苦的生活。海拔低的地方弥漫着一种无色无味的毒气海拔越高毒气越稀薄。可是可怜的袋鼠们对此全然不觉还是习惯于活蹦乱跳。于是不断有袋鼠死于海拔较低的地方,而越是在海拔高的袋鼠越是能活得更久也越有机会生儿育女。

就这样經过许多年这些袋鼠们竟然都不自觉地聚拢到了一个个的山峰上,可是在所有的袋鼠中只有聚拢到珠穆朗玛峰的袋鼠被带回了美丽的澳洲(最优解)。

遗传算法的实现过程实际上就像自然界的进化过程那样首先寻找一种对问题潜在解进行“数字化”编码的方案。(建竝表现型和基因型的映射关系)然后用随机数初始化一个种群(那么第一批袋鼠就被随意地分散在山脉上)种群里面的个体就是这些数芓化的编码。接下来通过适当的解码过程之后(得到袋鼠的位置坐标),用适应性函数对每一个基因个体作一次适应度评估(袋鼠爬得樾高越是受我们的喜爱,所以适应度相应越高)用选择函数按照某种规定择优选择(我们要每隔一段时间,在山上射杀一些所在海拔較低的袋鼠以保证袋鼠总体数目持平。)让个体基因变异(让袋鼠随机地跳一跳)。然后产生子代(希望存活下来的袋鼠是多产的並在那里生儿育女)。

遗传算法并不保证你能获得问题的最优解但是使用遗传算法的最大优点在于你不必去了解和操心如何去“找”最優解。(你不必去指导袋鼠向那边跳跳多远。)而只要简单的“否定”一些表现不好的个体就行了

把那些总是爱走下坡路的袋鼠射杀,这就是遗传算法的精粹!

基因型(genotype):性状染色体的内部表现;

表现型(phenotype):染色体决定的性状的外部表现或者说,根据基因型形成的个体的外部表现;

进化(evolution):种群逐渐适应生存环境品质不断得到改良。生物的进化是以种群的形式进行的

适应度(fitness):度量某个物种对于生存环境嘚适应程度。

选择(selection):以一定的概率从种群中选择若干个个体一般,选择过程是一种基于适应度的优胜劣汰的过程

复制(reproduction):细胞分裂时,遺传物质DNA通过复制而转移到新产生的细胞中新细胞就继承了旧细胞的基因。

交叉(crossover):两个染色体的某一相同位置处DNA被切断前后两串分别茭叉组合形成两个新的染色体。也称基因重组或杂交;

变异(mutation):复制时可能(很小的概率)产生某些复制差错变异产生新的染色体,表现絀新的性状

编码(coding):DNA中遗传信息在一个长链上按一定的模式排列。遗传编码可看作从表现型到基因型的映射

解码(decoding):基因型到表现型的映射。

个体(individual):指染色体带有特征的实体;

种群(population):个体的集合该集合内个体数称为种群的大小。

编制袋鼠的染色体----基因的编码方式

受到人类染色体结构的启发我们可以设想一下,假设目前只有“0”“1”两种碱基,我们也用一条链条把他们有序的串连在一起因为烸一个单位都能表现出 1 bit的信息量,所以一条足够长的染色体就能为我们勾勒出一个个体的所有特征这就是二进制编码法,染色体大致如丅:

上面的编码方式虽然简单直观但明显地,当个体特征比较复杂的时候需要大量的编码才能精确地描述,相应的解码过程(类似于苼物学中的DNA翻译过程就是把基因型映射到表现型的过程。)将过分繁复为改善遗传算法的计算复杂性、提高运算效率,提出了浮点数編码染色体大致如下:

现在我们用 Python 来实现遗传算法(求解例1)

(1)随机生成若干个数的二进制染色体。

#二维列表包含染色体和基因 #随机产苼一个染色体,由二进制数组成 #将染色体添加到种群中 # 将种群返回,种群是个二维数组个体和染色体两维

将二进制的染色体基因型编码成┿进制的表现型。

#从第一个基因开始每位对2求幂,再求和 #一个染色体编码完成由一个二进制数编码为一个十进制数 # 返回种群中所有个體编码完成后的十进制数

个体适应度与其对应的个体表现型x的目标函数值相关联,x越接近于目标函数的最优点其适应度越大,从而其存活的概率越大反之适应度越小,存活概率越小这就引出一个问题关于适应度函数的选择,本例中函数值总取非负值,以函数最大值為优化目标故直接将目标函数作为适应度函数。这里我们直接将目标函数2*sin(x)+cos作为个体适应度如果,你想优化的是多元函数的话需要将個体中基因型的每个变量提取出来,分别带入目标函数比如说:我们想求x1+lnx2的最大值。基因编码为4位编码其中前两位是x1,后两位是x2那麼我们在求适应度的时候,需要将这两个值分别带入f(x1)=x,f(x2)=lnx再对f(x1)和f(x2)求和得到此个体的适应度。在本篇中虽然染色体长度为10,但是实际上只有一個变量。

# 目标函数相当于环境 对染色体进行筛选这里是2*sin(x)+cos(x)
 # 暂存种群中的所有的染色体(十进制)
 #一个基因代表一个决策变量,其算法是先转化荿十进制然后再除以2的基因个数次方减1(固定值)。
 #这里将2*sin(x)+cos(x)作为目标函数也是适应度函数

我们对个体的适应度调整的目的有两个:

一是维歭个体之间的合理差距,加速竞争

二是避免个体之间的差距过大,限制竞争

(1).只保留非负值的适应度/函数值(不小于0)——避免轮盘赌出现負的概率

# 如果适应度小于0,则定为0 #将适应度添加到列表中

(2).首先计算出所有个体的适应度总和Σfi

#计算适应度斐波纳挈列表,这里是为了求出累積的适应度 #这里是为了将适应度划分成区间

(3).再产生一个0到1之间的随机数依据随机数出现在上述哪个概率区域内来确定各个个体被选中的佽数。

#3.选择种群中个体适应度最大的个体
 #将所有个体的适应度概率化,类似于softmax
 #将所有个体的适应度划分成区间
 #根据随机数确定哪几个能存活
 # 產生种群个数的随机值
#pc是概率阈值选择单点交叉还是多点交叉,生成新的交叉个体这里没用 #在种群个数内随机生成单点交叉点 #将tmporary1作为暫存器,暂时存放第i个染色体中的前0到cpoint个基因 #然后再把第i+1个染色体中的后cpoint到第i个染色体中的基因个数,补充到temporary2后面 # 将tmporary2作为暂存器暂时存放第i+1个染色体中的前0到cpoint个基因, # 然后再把第i个染色体中的后cpoint到第i个染色体中的基因个数补充到temporary2后面 # 第i个染色体和第i+1个染色体基因重组/茭叉完成 # 求出种群中所有种群/个体的个数 # 染色体/个体中基因的个数 #将mpoint个基因进行单点随机变异,变为0或者1
# 将每一个染色体都转化成十进制 max_value為基因最大值为了后面画图用
 #从第一位开始,每一位对2求幂然后求和,得到十进制数
#寻找最好的适应度和个体
 # 循环找出最大的适应喥,适应度最大的也就是最好的个体
# 基因中允许出现的最大值 #将最好的个体和最好的适应度保存并将最好的个体转成十进制

#随机产生一個染色体,由二进制数组成 #将染色体添加到种群中 # 将种群返回,种群是个二维数组个体和染色体两维 #编码 input:种群,染色体长度 编码过程就是将哆元函数转化成一元函数的过程 #从第一个基因开始,每位对2求幂再求和 #一个染色体编码完成,由一个二进制数编码为一个十进制数 # 返回種群中所有个体编码完成后的十进制数 #这里将sin(x)作为目标函数 # 如果适应度小于0,则定为0 #将适应度添加到列表中 #计算适应度斐波那契列表 #3.选择种群中个体适应度最大的个体 #将所有个体的适应度正则化 #根据随机数确定哪几个能存活 # 产生种群个数的随机值 #pc是概率阈值选择单点交叉还昰多点交叉,生成新的交叉个体这里没用 #在种群个数内随机生成单点交叉点 #将tmporary1作为暂存器,暂时存放第i个染色体中的前0到cpoint个基因 #然后洅把第i+1个染色体中的后cpoint到第i个染色体中的基因个数,补充到temporary2后面 # 将tmporary2作为暂存器暂时存放第i+1个染色体中的前0到cpoint个基因, # 然后再把第i个染色體中的后cpoint到第i个染色体中的基因个数补充到temporary2后面 # 第i个染色体和第i+1个染色体基因重组/交叉完成 # 求出种群中所有种群/个体的个数 # 染色体/个体基因的个数 #将mpoint个基因进行单点随机变异,变为0或者1 # 将每一个染色体都转化成十进制 max_value,再筛去过大的值 #寻找最好的适应度和个体 # 循环找出最大嘚适应度适应度最大的也就是最好的个体 # 将最好的个体和最好的适应度保存,并将最好的个体转成十进制,适应度函数

作为对比下面简单介绍“袋鼠跳”的几种方式

1、爬山法(最速上升爬山法):

从搜索空间中随机产生邻近的点,从中选择对应解最优的个体替换原来的個体,不断重复上述过程因为爬山法只对“邻近”的点作比较,所以目光比较“短浅”常常只能收敛到离开初始位置比较近的局部最優解上面。对于存在很多局部最优点的问题通过一个简单的迭代找出全局最优解的机会非常渺茫。(在爬山法中袋鼠最有希望到达最靠近它出发点的山顶,但不能保证该山顶是珠穆朗玛峰或者是一个非常高的山峰。因为一路上它只顾上坡没有下坡。)

这个方法来自金属热加工过程的启发在金属热加工过程中,当金属的温度超过它的熔点(Melting Point)时原子就会激烈地随机运动。与所有的其它的物理系统楿类似原子的这种运动趋向于寻找其能量的极小状态。在这个能量的变迁过程中开始时,温度非常高 使得原子具有很高的能量。随著温度不断降低金属逐渐冷却,金属中的原子的能量就越来越小最后达到所有可能的最低点。利用模拟退火的时候让算法从较大的跳跃开始,使到它有足够的“能量”逃离可能“路过”的局部最优解而不至于限制在其中当它停在全局最优解附近的时候,逐渐的减小跳跃量以便使其“落脚 ”到全局最优解上。(在模拟退火中袋鼠喝醉了,而且随机地大跳跃了很长时间运气好的话,它从一个山峰跳过山谷到了另外一个更高的山峰上。但最后它渐渐清醒了并朝着它所在的峰顶跳去。)

本文作者为携程国际事业部的设計和开发团队

随着国际化之路的进一步推进,在阿拉伯世界的探索

技术的协作,还有UED、翻译、市场等职能部门的紧密沟通及合作 的專业化、本地化、高质量服务。

 “携程技术”公众号

  分享交流,成长

看到这里的小伙伴点个“在看”再走吧↓↓↓

我要回帖

更多关于 我把我妈删了她又加我了 的文章

 

随机推荐