优化算法 | 遗传算法(附Python代码)
发布网友
发布时间:2024-09-29 08:16
我来回答
共1个回答
热心网友
时间:2024-10-20 10:07
遗传算法(GA)是今天要讲述的主题,相信大家对它并不陌生。过去我们已经发布过多篇关于GA的教程:
过去的教程主要是使用GA来解决离散优化问题,而很少涉及到连续优化问题。因此,今天我们将重点讲解如何使用GA来解决连续优化问题。
首先,我们需要确定要解决的问题,即求解以下函数的最小值:
(公式)
以下是遗传算法求解步骤的详细说明:
01 | 种群初始化:由于求解问题的变量数量为5,因此染色体的长度为5。假设种群数量为npop,则随机生成npop个长度为5的个体,且每个个体在每个维度上的取值范围应在-100至100之间。种群初始化的代码如下:
假设npop=5,则初始化种群的结果如下,其中position表示个体位置,cost表示个体目标函数值:
02 | 适应度值计算:这里的适应度值即是目标函数值,具体代码如下:
03 | 选择操作:选择操作就是从当前种群中选择出若干个个体,本例中使用的是轮盘赌选择策略,即适应度值高的个体有更大的概率被选中,具体代码如下:
假设输入参数p=[1,2,3,4,5],下面我们来分析每一行代码的含义。
cumsum函数是累加函数,因此c=[1,3,6,10,15]。sum函数是求和函数,sum(p)=15,np.random.rand()函数返回一个[0,1)之间的随机数,不包括1,因此r的取值范围为[0,15)之间的一个数,不包括15,假设此时r=5。
np.argwhere(a)函数返回非0元素的索引,其中a是要索引数组的条件,并且该函数输出的是一列元素。因此,np.argwhere(r <= c)返回的是r <= c的索引,输出结果为:
最终返回ind[0][0]=2,说明r=5落在3~6之间,即落在p=3所属的区间,轮盘赌示意图如下。
04 | 交叉操作:交叉操作是对选择出的两个个体进行处理,使它们能够互相继承彼此良好的基因片段,具体代码如下:
np.random.uniform(low,high,size)函数返回size相同维度且取值范围在[low,high)之间的随机数,如返回4个[0,1)之间的随机数,具体返回结果如下。
下面这两行代码实际上表示产生两个新个体的计算公式。
05 | 变异操作:变异操作是对某一个个体进行处理,更新该个体的位置,具体代码如下,其中mu是变异概率:
flag = np.random.rand(*x.position.shape) <= mu这行代码的含义是判断随机生成的与个体长度相等的数字中是否小于等于变异概率mu,返回结果示例为[False True False False False]。
ind = np.argwhere(flag)表示找出flag为True的索引,即找出待变异的基因位,返回结果为ind=[[1]]。
y.position[ind] += sigma*np.random.randn(*ind.shape)表示更新待变异的基因位。
以下是遗传算法流程图的展示:
以下是遗传算法实例验证的代码及结果:
(公式)
ga.py代码如下:
app.py代码如下:
求解结果如下:
参考资料:
[1]Mostapha Kalami Heris, Practical Genetic Algorithms in Python and MATLAB – Video Tutorial (URL: yarpiz.com/632/ypga1912...), Yarpiz, 2020.
下期再见。