Python37 智能优化算法之差分进化算法DE

news2024/9/20 8:15:41
发展背景和原理

差分进化算法(Differential Evolution, DE)是一种基于群体的随机优化算法,由Storn和Price于1995年提出。该算法起源于遗传算法(Genetic Algorithm, GA),但其具有更简单的结构和更强的全局搜索能力。差分进化算法主要用于解决全局优化问题,通过变异、交叉和选择操作不断改进解的质量。

数学原理

差分进化算法的基本操作包括变异、交叉和选择。具体步骤如下:

  1. 初始化:初始化一个包含个个体的种群,每个个体是维向量,初始种群通常随机生成。

  2. 变异:对于每个个体,从种群中随机选择三个不同的个体,生成变异向量:

    其中,是变异因子,通常取值在之间。

  3. 交叉:将变异向量与当前个体进行交叉,生成试验向量。交叉操作采用均匀交叉方式:

    其中,是均匀分布的随机数,是交叉概率,是随机选择的一个维度。

  4. 选择:对于每个试验向量,与当前个体比较其适应度,如果试验向量的适应度更优,则选择试验向量进入下一代:

  5. 迭代:重复变异、交叉和选择操作,直到满足停止条件(如达到最大迭代次数或适应度不再显著提升)。

应用场景

差分进化算法具有全局优化能力强、实现简单等优点,广泛应用于以下场景:

  • 参数优化:机器学习模型参数调优、神经网络权重优化等。

  • 函数优化:非线性、多峰、多维函数的全局优化。

  • 工程设计:结构优化、电力系统优化、化学过程优化等。

可视化Python示例

图片

以下是使用差分进化算法优化Rosenbrock函数的Python示例,并进行可视化:

import numpy as np  # 导入NumPy库,用于数值计算
import matplotlib.pyplot as plt  # 导入Matplotlib库,用于绘图
from mpl_toolkits.mplot3d import Axes3D  # 导入3D绘图工具

# 目标函数:Rosenbrock函数
def rosenbrock(x, y):
    return 100.0 * (y - x**2.0)**2.0 + (1 - x)**2.0  # 计算Rosenbrock函数的值

# 创建网格数据
x = np.linspace(-2, 2, 400)  # 在-2到2之间生成400个点
y = np.linspace(-1, 3, 400)  # 在-1到3之间生成400个点
X, Y = np.meshgrid(x, y)  # 创建网格数据
Z = rosenbrock(X, Y)  # 计算网格数据对应的Rosenbrock函数值

plt.switch_backend('Qt5Agg')  # 切换到Qt5Agg后端以在独立窗口中显示图形

# 创建独立窗口进行三维可视化
def visualize_rosenbrock_3d():
    fig = plt.figure(figsize=(10, 8))  # 创建一个10x8英寸的图形
    ax = fig.add_subplot(111, projection='3d')  # 添加一个3D子图

    # 绘制三维曲面
    surf = ax.plot_surface(X, Y, Z, cmap='viridis', edgecolor='none')  # 绘制Rosenbrock函数的三维曲面,使用Viridis配色方案,去除边缘颜色

    # 添加颜色条
    fig.colorbar(surf, shrink=0.5, aspect=5)  # 添加颜色条,设置收缩比例和宽高比

    # 添加坐标轴标签和标题
    ax.set_xlabel('x')  # 设置x轴标签
    ax.set_ylabel('y')  # 设置y轴标签
    ax.set_zlabel('f(x, y)')  # 设置z轴标签
    ax.set_title('3D Visualization of Rosenbrock Function')  # 设置图形标题

    # 显示图形窗口
    plt.show()  # 显示图形

# 目标函数:Rosenbrock函数(差分进化使用)
def rosenbrock_diff(x):
    x = np.array(x)  # 将输入转换为NumPy数组
    return sum(100.0 * (x[1:] - x[:-1]**2.0)**2.0 + (1 - x[:-1])**2.0)  # 计算Rosenbrock函数值的总和

# 差分进化算法
def differential_evolution(objective, bounds, n_iter, n_pop, F, CR):
    # 初始化种群
    pop = bounds[:, 0] + (bounds[:, 1] - bounds[:, 0]) * np.random.rand(n_pop, len(bounds))  # 生成初始种群
    best_idx = np.argmin([objective(ind) for ind in pop])  # 找到种群中最好的个体索引
    best = pop[best_idx]  # 最好的个体
    best_score = objective(best)  # 最好的个体的得分
    scores = [best_score]  # 保存每代最好的得分
    
    for gen in range(n_iter):  # 遍历每一代
        for i in range(n_pop):  # 遍历种群中的每一个个体
            idxs = [idx for idx in range(n_pop) if idx != i]  # 获取其他个体的索引
            a, b, c = pop[np.random.choice(idxs, 3, replace=False)]  # 随机选择三个不同的个体
            mutant = np.clip(a + F * (b - c), bounds[:, 0], bounds[:, 1])  # 生成变异个体,并确保其在边界内
            cross_points = np.random.rand(len(bounds)) < CR  # 生成交叉点
            if not np.any(cross_points):  # 确保至少有一个交叉点
                cross_points[np.random.randint(0, len(bounds))] = True
            trial = np.where(cross_points, mutant, pop[i])  # 生成试验个体
            f_trial = objective(trial)  # 计算试验个体的得分
            if f_trial < objective(pop[i]):  # 如果试验个体比当前个体好
                pop[i] = trial  # 替换当前个体
                if f_trial < best_score:  # 如果试验个体比最好的个体还好
                    best, best_score = trial, f_trial  # 更新最好的个体和得分
                    scores.append(best_score)  # 保存最好的得分
        print(f"Generation {gen+1}, Best Score: {best_score}")  # 打印当前代和最好的得分
    
    return best, best_score, scores  # 返回最好的个体,最好的得分和每代的最好的得分

# 参数设置
bounds = np.asarray([[-5.0, 5.0], [-5.0, 5.0]])  # 设置搜索空间边界
n_iter = 100  # 设置迭代次数
n_pop = 50  # 设置种群大小
F = 0.8  # 设置变异因子
CR = 0.7  # 设置交叉概率

# 运行差分进化算法
best, score, scores = differential_evolution(rosenbrock_diff, bounds, n_iter, n_pop, F, CR)  # 调用差分进化算法
print(f"Best Solution: {best}, Best Score: {score}")  # 打印最好的解和最好的得分

# 差分进化算法的二维可视化
plt.figure()  # 创建一个新图形
plt.subplot(2, 1, 1)  # 创建第一个子图
x = np.linspace(bounds[0, 0], bounds[0, 1], 100)  # 生成x轴数据
y = np.linspace(bounds[1, 0], bounds[1, 1], 100)  # 生成y轴数据
X, Y = np.meshgrid(x, y)  # 创建网格数据
Z = np.array([rosenbrock_diff([x, y]) for x, y in zip(np.ravel(X), np.ravel(Y))]).reshape(X.shape)  # 计算每个网格点的Rosenbrock函数值

plt.contourf(X, Y, Z, levels=50, cmap='viridis')  # 绘制等高线图
plt.plot(best[0], best[1], 'ro', label='Best Solution')  # 绘制最好的解
plt.legend()  # 显示图例

plt.subplot(2, 1, 2)  # 创建第二个子图
plt.plot(scores, label='Best Score')  # 绘制每代最好的得分
plt.xlabel('Generation')  # 设置x轴标签
plt.ylabel('Score')  # 设置y轴标签
plt.legend()  # 显示图例

plt.tight_layout()  # 调整子图布局
plt.show()  # 显示图形

# 三维可视化Rosenbrock函数
visualize_rosenbrock_3d()  # 调用三维可视化函数

图片

以上内容总结自网络,如有帮助欢迎转发,我们下次再见!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1929417.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

IDEA字体如何放大调整?快捷键是什么?

在编程的世界里&#xff0c;IDE&#xff08;集成开发环境&#xff09;是我们探索代码、构建梦想的舞台。IntelliJ IDEA&#xff0c;作为Java开发者乃至多语言开发者的首选工具之一&#xff0c;以其强大的功能、流畅的界面和丰富的插件生态赢得了无数开发者的青睐。然而&#xf…

奇门遁甲起名大师颜廷利:中国最厉害的改名字大师

奇门遁甲起名大师颜廷利&#xff1a;中国最厉害的改名字大师 在中国奇门遁甲的领域里&#xff0c;颜廷利教授以其深厚的学识和卓越的成就&#xff0c;被公认为排名第一的大师。他不仅在南派易学中占据泰斗地位&#xff0c;而且在北派易经的代表人物中也是一位杰出的领军者。作为…

nftables(8)MAPS、VMAPS

MAPS MAPS简介 上篇文章我们介绍了SETS集合相关的内容&#xff0c;本篇文章主要介绍map&#xff0c;在nftables中&#xff0c;Map&#xff08;映射&#xff09;用于存储键值对&#xff0c;类似于许多编程语言中的关联数组/字典/哈希表。在nftables规则中&#xff0c;可以指定…

SVH勒索病毒详解,数据库恢复指南

引言 在数字化时代&#xff0c;网络安全问题日益严峻&#xff0c;其中勒索病毒成为威胁个人、企业及政府机构数据安全的重大隐患。SVH勒索病毒作为一种极具破坏性的恶意软件&#xff0c;通过加密受害者的重要文件并要求支付赎金来解锁&#xff0c;给受害者带来了巨大经济损失和…

【C/C++积累技巧】实现 连续播放文件图片+逐帧文本显示, 同时 可以按任意键退出(基于easyx小游戏编程)

技巧一、使用 IMAGE数组循环&#xff1a;实现【连续播放图片】 &#xff08;1&#xff09;一张图片如何放映在 图形化窗口上&#xff1a;借用两个函数 #include<graphics.h> // 函数的头文件IMAGE imgMy; // 图形变量 loadimage(&imgMy, "写入你想显示的图片路…

【工具】2102- es-toolkit:一个现代 JavaScript 工具包,体积更小,内置 TypeScript 支持...

介绍 es-toolkit 是一款先进且具备高性能的现代化 JavaScript 实用工具库&#xff0c;其拥有较小的捆绑包规模以及强大的类型注解&#xff0c;同时还提供了一系列非常不错的函数&#xff0c;适合日常使用。 相较于 lodash 等替代方案&#xff0c;es-toolkit 所提供的包体积显著…

SourceTree rebase(变基)的使用

参考资料 【Sourcetree】コミットを一つにまとめる【Sourcetree】リベースする 目录 前提0.1 merge与rebase0.2 merge合并分支0.3 rebase合并分支0.4 &#x1f4a5;超级注意事项&#x1f4a5; 一. 代码已提交&#xff0c;未推送&#xff0c;交互式变基1.1 通过SourceTree操作1…

初识C++|类与对象(上)

&#x1f36c; mooridy-CSDN博客 &#x1f9c1;C专栏&#xff08;更新中&#xff01;&#xff09; 1. 类的定义 1.1 类定义格式 • class为定义类的关键字&#xff0c;Stack为类的名字&#xff0c;{}中为类的主体&#xff0c;注意类定义结束时后⾯分号不能省略。 类体中内容…

如何进行闭包求解

参考资料&#xff1a; 离散数学

根据日志绘制障碍物轮廓点和中心点

绘制log中的障碍物凸包点&#xff0c;首先给出log日志中的障碍物的凸包点 [Info]-[PointCloudHandle:88]:[2024-07-14,09:55:41.052]-back obj size 6 [Info]-[PointCloudHandle:92]:[2024-07-14,09:55:41.052]-back obj size 6 cur idx 1 [Info]-[PointCloudHandle:93]:[2024…

SMTP服务器地址与端口号有哪些关系与区别?

SMTP服务器地址如何正确配置&#xff1f;怎么验证服务器的地址&#xff1f; 了解SMTP服务器地址与端口号的关系与区别对于确保邮件系统的正常运作至关重要。AokSend将详细探讨这两者之间的关系和区别&#xff0c;并解释它们在邮件传输过程中的重要性。 SMTP服务器地址&#x…

Figma 中文版指南:获取和安装汉化插件

Figma是一种主流的在线团队合作设计工具&#xff0c;也是一种基于 Web 端的设计工具。在当今的设计时代&#xff0c;Figma 的使用满足了每个人的设计需求&#xff0c;不仅可以实现在线编辑&#xff0c;还可以方便日常管理&#xff0c;有效提高工作效率。然而&#xff0c;相信很…

小试牛刀-Telebot区块链游戏机器人

目录 1.编写目的 2.实现功能 2.1 Wallet功能 2.2 游戏功能 2.3 提出功能 2.4 辅助功能 3.功能实现详解 3.1 wallet功能 3.2 游戏功能 3.3 提出功能 3.4 辅助功能 4.测试视频 Welcome to Code Blocks blog 本篇文章主要介绍了 [Telebot区块链游戏机器人] ❤博主…

css 屏幕四周报警提示

屏幕四周出现律动的红色边框&#xff0c;产生报警提示的效果。 <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><title>Screen Edge Warning</title><style>body, html {margin: 0;padding: 0;he…

【软件测试】编写测试用例篇

前面部分主要是编写测试用例的方法和方向&#xff0c;后面一部分是编写出具体的测试用例 目录 什么是测试用例 1.设计测试用例的万能公式 1.1.从思维出发 1.2.万能公式 1.3.弱网测试 1.4.安装与卸载测试 2.设计测试用例的方法 2.1.基于需求的设计方法 2.2.等价类 2.3…

python-矩阵加法(赛氪OJ)

[题目描述] 输入两个 n 行 m 列的矩阵 A 和 B &#xff0c;输出它们的和 AB。矩阵加法的规则是两个矩阵中对应位置的值进行加和&#xff0c;具体参照样例。输入&#xff1a; 输入共 2⋅n1 行&#xff0c;第一行包含两个整数 n 和 m&#xff0c;表示矩阵的行数和列数 (1≤n,m≤1…

原来,BI数据分析也是有模板的

在当今数据驱动的时代&#xff0c;商业智能&#xff08;BI&#xff09;数据分析已经成为企业决策的重要工具。然而&#xff0c;很多人可能并不了解&#xff0c;BI数据分析并非从零开始&#xff0c;而是可以依托现成的模板和解决方案来快速搭建和实施的。以奥威BI方案为例&#…

Vue3 前置知识

1. Vue3 简介 2020年9月18日&#xff0c;Vue.js发布版3.8版本&#xff0c;代号&#xff1a;one Piece(海贼王)经历了&#xff1a;4800次提交、40个RFC、600次PR、300贡献者官方发版地址&#xff1a;Release v3.0.0 One Piecevuejs/,core截止2023年10月&#xff0c;最新的公开版…

数学建模·层次分析法

层次分析法 LAF 定义 评价体系的优劣影响&#xff0c;计算评价指标的权重的一种方法 主观性较强&#xff0c;现在一般不用 主要步骤 关键在于一致性检验和求权值 权重的计算 注意权重之和为1&#xff0c;需要归一化 算数平均法 特征值法 矩阵的一致性检验 为什么要检验…

如何应对AI发展下的伦理挑战

目录 1.概述 2.构建可靠的AI隐私保护机制 2.1. 最小化数据收集 2.2. 数据去标识化 2.3. 加密技术 2.4. 分布式学习和边缘计算 2.5. 强化用户控制权 2.6. 独立审计和合规性检查 2.7. 持续教育和培训 2.8.小结 3.确保AI算法的公正性和透明度 3.1.增强AI决策透明度的方…