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元组打包和解包过程详解

    python元组打包和解包过程详解

    在本篇文章里,我们给大家整理了关于python元组打包和解包过程的知识点内容,有兴趣点的朋友们可以跟着学习下。
    2021-08-08
  • 使用python生成定制化词云的代码示例

    使用python生成定制化词云的代码示例

    词云,作为一种流行的数据可视化形式,能够将大量文本数据中的关键词以视觉化的方式呈现,让我们迅速捕捉到文本的核心,本文将通过Python编程语言,使用jieba和wordcloud库,生成一个具有特定形状的词云,需要的朋友可以参考下
    2024-09-09
  • Python图像的增强处理操作示例【基于ImageEnhance类】

    Python图像的增强处理操作示例【基于ImageEnhance类】

    这篇文章主要介绍了Python图像的增强处理操作,结合实例形式分析了使用ImageEnhance类处理图片的亮度、对比度、色度以及锐度等相关操作技巧,需要的朋友可以参考下
    2019-01-01
  • tensorflow学习笔记之简单的神经网络训练和测试

    tensorflow学习笔记之简单的神经网络训练和测试

    这篇文章主要为大家详细介绍了tensorflow学习笔记,用简单的神经网络来训练和测试,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2018-04-04
  • Python股票开源库akshare的具体使用

    Python股票开源库akshare的具体使用

    AKShare是一个开源财经数据接口库,本文主要介绍了Python股票开源库akshare的具体使用,具有一定的参考价值,感兴趣的可以了解一下
    2024-04-04
  • python实现删除列表中某个元素的3种方法

    python实现删除列表中某个元素的3种方法

    这篇文章主要介绍了python实现删除列表中某个元素的3种方法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-01-01
  • python上selenium的弹框操作实现

    python上selenium的弹框操作实现

    这篇文章主要介绍了python上selenium的弹框操作实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-07-07
  • 浅析python中的del用法

    浅析python中的del用法

    python中的del用法比较特殊,新手学习往往产生误解,弄清del的用法,可以帮助深入理解python的内存方面的问题。这篇文章主要介绍了python中的del用法,需要的朋友可以参考下
    2020-09-09
  • 利用Python实现批量打包程序的工具

    利用Python实现批量打包程序的工具

    auto-py-to-exe与pyinstaller都无法直接一次性打包多个程序,想打包多个程序需要重新操作一遍。所以本文将用Python实现批量打包程序的工具,感兴趣的可以了解一下
    2022-07-07
  • 如何实现一个python函数装饰器(Decorator)

    如何实现一个python函数装饰器(Decorator)

    这篇文章主要介绍了如何实现一个python函数装饰器(Decorator),帮助大家更好的理解和学习python,感兴趣的朋友可以了解下
    2020-10-10

最新评论