python人工智能算法之差分进化算法的实现

 更新时间:2023年08月11日 09:30:23   作者:微小冷  
DE基于GA,正如进化基于遗传,和遗传算法相比,差分进化引入了差分变异模式,相当于开辟了一条崭新的进化路径,下面就来看看差分优化算法是如何实现的吧

遗传算法: 纯Python实现遗传算法

DE基于GA,正如进化基于遗传。和遗传算法相比,差分进化引入了差分变异模式,相当于开辟了一条崭新的进化路径。

初始化

首先,初始种群随机产生解空间(L,R)范围的向量

(0)表示第0代。

变异

初始化后,进行变异操作,其第t tt代变异向量为

vi​(t)=xr1​​(t)+rand⋅(xr2​​(t)−xr3​​(t))

其中r1​,r2​,r3​为随机挑选出的与i ii互不相同的序号,相当于随机抽选三个值进行基因突变。

交叉

接下来,开始种群繁衍,即种群交叉

其中,r为随机数,cr是预设的交叉概率因子;rj​为随机生成的某个整数,代表第rj​个分量必为突变分量。

选择

最后,进行下一代的选择,就是在目标个体和实验个体中,选择最优秀的那个。

xi​(t+1)=argmin(ui​(t),xi​(t))

Python实现

首先,做一个DE算法的迭代函数

import numpy as np
from random import sample, randint, random
def evolve(xs,cr,func):
    # 变异
    vs = []
    N = len(xs[0])
    for _ in range(len(xs)):
        x = xs.pop(0)
        r1, r2, r3 = sample(xs, 3)
        xs.append(x)
        vs.append(r1 + random()*(r2-r3))
    # 交叉
    us = []
    for i in range(len(xs)):
        us.append(vs[i] if random() < cr else xs[i])
        j = randint(0, N-1)
        us[i][j] = vs[i][j]
    # 选择
    xNext = []
    for x,u in zip(xs, us):
        xNext.append(x if func(x)<func(u) else u)
    return xNext

其中,变异过程要求随机则取三个不同的个体,并且这个个体不能是当前个体,所以采取的方案是先弹出当前个体,再从里面随机挑选三个,最后再将当前个体放回去。

交叉过程通过两个随机数,来决定下一代的成分。首先是通过浮点型随机数来决定是用原有的解还是用新解;然后用一个整型随机数,来判定采取变异解的元素序号。

然后写出主循环

# N为个体数;nDim为解维度;nIter为迭代次数
def de(N, nDim, xRange, cr, func, nIter):
    xs = [uniRand(*xRange, nDim) for _ in range(N)]
    for _ in range(nIter):
        xs = evolve(xs, cr, func)
    fs = [func(x) for x in xs]
    xBest = xs[np.argmin(fs)]
    msg = f"当前最优结果为{np.min(fs)},参数为"
    msg += ", ".join([f"{x:.4f}" for x in xBest])
    print(msg)

测试

最后写个函数测试一下

def test(xs):
    _sum = 0.0
    for i in range(len(xs)):
        _sum = _sum + np.cos((xs[i]*i)/5)*(i+1)
    return _sum
​​​​​​​if __name__ == "__main__":
    de(20, 5, (-5,5), 0.5, test, 100)

最终效果为

>python de.py
当前最优结果为-12.864706361994342,参数为6.2566, 15.7407, 148.7103, 193.4160, 3.9136

到此这篇关于python人工智能算法之差分进化算法的实现的文章就介绍到这了,更多相关python差分进化内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • python requests实现上传excel数据流

    python requests实现上传excel数据流

    这篇文章主要介绍了python requests实现上传excel数据流,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-02-02
  • Python中unittest模块做UT(单元测试)使用实例

    Python中unittest模块做UT(单元测试)使用实例

    这篇文章主要介绍了Python中unittest模块做UT(单元测试)使用实例,本文直接给出待测试的类、测试类和测试结果以及测试总结,需要的朋友可以参考下
    2015-06-06
  • NumPy数组复制与视图详解

    NumPy数组复制与视图详解

    NumPy 数组的复制和视图是两种不同的方式来创建新数组,它们之间存在着重要的区别,本文将给大家详细介绍一下NumPy数组复制与视图,并通过代码示例讲解的非常详细,需要的朋友可以参考下
    2024-05-05
  • Python3.9环境搭建RobotFramework的详细过程

    Python3.9环境搭建RobotFramework的详细过程

    Robot Framework是一个基于Python的,可扩展的关键字驱动的测试自动化框架,用于端到端验收测试和验收测试驱动开发(ATDD),这篇文章主要介绍了Python3.9环境搭建RobotFramework的详细过程,需要的朋友可以参考下
    2023-01-01
  • Python实现计算两个时间之间相差天数的方法

    Python实现计算两个时间之间相差天数的方法

    这篇文章主要介绍了Python实现计算两个时间之间相差天数的方法,涉及Python针对日期时间的相关运算操作技巧,需要的朋友可以参考下
    2017-05-05
  • Python实现的个人所得税计算器示例

    Python实现的个人所得税计算器示例

    这篇文章主要介绍了Python实现的个人所得税计算器,涉及Python条件判断与数值运算相关操作技巧,需要的朋友可以参考下
    2018-06-06
  • Python转换时间的图文方法

    Python转换时间的图文方法

    在本篇文章里小编给大家整理的是关于Python转换时间的方法以及具体步骤流程,需要的朋友们参考下。
    2019-07-07
  • 解决python打开https出现certificate verify failed的问题

    解决python打开https出现certificate verify failed的问题

    这篇文章主要介绍了解决python打开https出现certificate verify failed的问题,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2020-09-09
  • Python3中zip()函数知识点小结

    Python3中zip()函数知识点小结

    本文主要介绍了Python3中zip()函数知识点小结,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2023-02-02
  • Python 比较两个 CSV 文件的三种方法并打印出差异

    Python 比较两个 CSV 文件的三种方法并打印出差异

    这篇文章主要介绍了Python 比较两个 CSV 文件并打印出差异,本文将讨论比较两个 CSV 文件的各种方法,我们将包括执行此操作的最“Pythonic”方式和可帮助简化此任务的外部 Python 模块,需要的朋友可以参考下
    2023-06-06

最新评论