遗传算法解决函数优化问题

遗传算法解决函数优化问题

  • 作者: Cukor丘克
  • 环境: MatlabR2020a + vscode

为什么要学习遗传算法

为什么要学习遗传算法,或者说遗传算法有什么厉害的地方。例如求解以下函数优化问题: m i n f ( x 1 , x 2 ) = x 1 2 + x 1 2 + 25 ∗ ( s i n 2 x 1 + s i n 2 x 2 ) , − 10 ≤ x 1 ≤ 10 , − 10 ≤ x 2 ≤ 10. min f(x_1, x_2)=x^2_1+x^2_1+25*(sin^2x_1+sin^2x_2), -10 \le x_1 \le 10, -10 \le x_2 \le 10 . minf(x1,x2)=x12+x12+25(sin2x1+sin2x2),10x110,10x210.

方法一:

这个时候你可能想从设一个变量 i i i从-10到10,一个变量 j j j从-10到10,每个涉及到的点都遍历,然后比较前后数值取最大的那个,当遍历完成了就确定了最大值。

方法二:

对函数求导,然后令导为零,取最小值。

两种方法在一般理论上都可行。但是有各自的缺点。

方法一的缺点:

每次都从头开始遍历,直到把所有的都遍历完才能确定最值,太耗时间,而且大多数做的都是没有意义的比较。而且计算机对浮点数的比较有精度的要求,有时候两个数只差一点点,计算机就会将它们当作是相等的。

方法二的缺点:

不是所有函数的导函数都是容易求解的,而且当出现很多个峰值或谷值的时候也是比较麻烦,就展现不出求导的优势了。

这个时候就需要像遗传算法这样的智能优化算法来求解。

目标函数的图像

在这里插入图片描述

遗传算法的基本认识

演化计算

生物进化是指一个种群经过漫长的时间所发生的累积变化,这些变化是由于生物体的基因变异或在繁殖期间以不同方式重组基因所产生的,而且这些变化可以被遗传到生物体的后代。

生物的进化可以看成是一个优化过程,而优化的结果是产生能够很好地适应环境的生物体。现在地球上的种类繁多‘结构复杂的生物都是通过漫长的由简单到复杂、由低级到高级的进化过程而得到的优化结果。生物的进化过程也可以看成是在众多可能性中搜索“解”的一种方法

演化算法

演化计算所涉及的算法称为演化算法。所有的演化算法都有一个共同点:求解问题的过程也就是模拟大自然生物进化的过程

演化算法模仿自然进化过程,在求解问题的过程中,保持一个个体的种群,每个个体表示问题的一个可能解。个体适应环境的程度用一个适应函数判断,每个个体安装适应函数来度量该个体作为问题解的好坏程度。

遗传算法是应用最为广泛的一种演化算法。遗传算法是美国密歇根大学的J.H.Holland教授在研究自然界自适应现象的过程中提出来的。

算法流程图

在这里插入图片描述

参数初始化

主要影响遗传算法的四个参数

  1. 种群大小(20~200)
  2. 交叉概率(0.7~0.9)
  3. 变异概率(0.02~0.2)
  4. 迭代次数(20~500)

次要的参数

  1. 下限
  2. 上限
  3. 保留小数点后t位
  4. 编码长度数组
  5. 个体编码长度

个体编码

设计演化算法的第一步是对问题的可能解进行编码,其目的是为了能够有效地执行遗传操作。

演化算法不是直接作用在问题的解空间上的,而是交替地作用在编码空间和解空间上。

编码是一个从问题的解空间到编码空间的映射

编码可以是二进制编码也可以是Gray码编码,一般就使用二进制编码。

一个编码就对应着一个实数解,一个实数解对应一个编码。这就需要编码的长度一定要足够大,这样才能把所有的可能解都使用编码表示 。

实例:

a j ≤ x j ≤ b j a_j \le x_j \le b_j ajxjbj所要求的精度为小数点后t位,这要求将区间 [ a j , b j ] [a_j, b_j] [aj,bj]划分为至少 ( b j − a j ) 1 0 t (b_j-a_j)10^t (bjaj)10t份。假设表示变量 x j x_j xj的位串长度用 l j l_j lj表示,则 l j l_j lj可取为满足下列不等式的最小正整数 m m m: ( b j − a j ) 1 0 t ≤ 2 m − 1 , (b_j-a_j)10^t \le 2^m-1, (bjaj)10t2m1,

x j x_j xj的二进制表示转换为十进制表示可按下式计算: x j = a j + d e c i m a l ( s u b s t r i n g j ) ∗ ( b j − a j ) / ( 2 k − 1 ) , k = l j , x_j=a_j+decimal(substring_j)*(b_j-a_j)/(2^k-1), k=l_j, xj=a

  • 5
    点赞
  • 38
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值