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-pip配置国内镜像源的安装方式

    Python-pip配置国内镜像源的安装方式

    本文给大家分享Python-pip配置国内镜像源的安装方式,分为windows平台安装方式和linux平台安装方式,本文给大家介绍的非常详细,需要的朋友参考下吧
    2021-11-11
  • python里反向传播算法详解

    python里反向传播算法详解

    在本篇文章了小编给大家整理的是一篇关于python里反向传播算法详解内容,有兴趣的朋友们可以学习下。
    2020-11-11
  • 解决Python3中的中文字符编码的问题

    解决Python3中的中文字符编码的问题

    Unicode是一32位编码格式,不适合用来传输和存储,所以必须转换成utf-8,gbk等等。这篇文章主要介绍了Python3中的解决中文字符编码的问题,需要的朋友可以参考下
    2018-07-07
  • 利用python打印出菱形、三角形以及矩形的方法实例

    利用python打印出菱形、三角形以及矩形的方法实例

    最近在开发中遇到一个问题,需要利用python实现菱形、三角形以及矩形等形状,发现网上这方面的资料较少,所以总结分享下,这篇文章主要给大家介绍了关于利用python打印出菱形、三角形以及矩形的相关资料,需要的朋友可以参考借鉴,下面来一起看看吧。
    2017-08-08
  • [项目布局配置]Nosql与PythonWeb-Flask框架组合

    [项目布局配置]Nosql与PythonWeb-Flask框架组合

    本文主要描述了怎样使用轻量级NoSQL数据库与PythonWeb-Flask框架组合来进行项目布局及应用配置,需要的同学可以参考下,希望可以对大家有所进益
    2021-08-08
  • Flask登录注册项目的简单实现

    Flask登录注册项目的简单实现

    一个简单的用户注册和登录的页面,涉及到验证,数据库存储等等,本文主要介绍了Flask登录注册项目的简单实现,从目录结构开始,感兴趣的可以了解一下
    2021-05-05
  • Python安装第三方库的3种方法

    Python安装第三方库的3种方法

    这篇文章主要介绍了Python安装第三方库的3种方法,本文讲解了通过setuptools来安装python模块、通过pip来安装python模块、直接从网上下载下可执行文件来安装三种方法,需要的朋友可以参考下
    2015-06-06
  • python中for in的用法详解

    python中for in的用法详解

    这篇文章主要介绍了python中for in的用法详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-04-04
  • Python OpenCV 使用滑动条来调整函数参数的方法

    Python OpenCV 使用滑动条来调整函数参数的方法

    这篇文章主要介绍了Python OpenCV 使用滑动条来调整函数参数的方法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2019-07-07
  • 一文总结学习Python的14张思维导图

    一文总结学习Python的14张思维导图

    一文总结学习Python的14张思维导图,本文涵盖了Python编程的核心知识,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2017-10-10

最新评论