差分优化算法——DE

🍎道阻且长,行则将至。🍓

目录

  • 一、DE
    • 1.步骤
    • 2.特点
  • 二、DE Optimiza
    • 1.函数最小值问题
    • 2.差分进化算法求解
    • 2.Java 实现与结果绘图


一、DE

差分进化算法是一种基于群体智能的优化算法,由Storn和Price于1995年提出,最早用来解决切比雪夫多项式问题。它采用实数编码方式,通过变异、交叉和选择等操作,使种群逐渐向全局最优解收敛。
在这里插入图片描述

1.步骤

差分进化算法的主要步骤如下:

  • 初始化参数:设定种群规模 NP,变异因子 F,交叉概率 CR,个体维度 D,决策空间上下界 XuXl,终止条件等。
  • 初始化种群:在决策空间内随机生成NP个D维的个体作为初始种群X。
  • 种群变异:对每个个体X(i),随机选择三个不同的个体X(r1),X(r2),X(r3),并计算变异向量 V ( i ) = X ( r 1 ) + F ∗ ( X ( r 2 ) − X ( r 3 ) ) V(i) = X(r_1) + F * (X(r_2) - X(r_3)) V(i)=X(r1)+F(X(r2)X(r3))
  • 种群交叉:对每个个体X(i)和变异向量V(i),按照交叉概率 CR 进行交叉操作,生成向量 U(i)。交叉操作的方法有多种,一种常用的方法是二项式交叉,即对每个维度 j,如果 rand(j) <= CR 或者 j == jrand(jrand为随机选定的一个维度),则 U ( i , j ) = V ( i , j ) U(i,j) = V(i,j) U(i,j)=V(i,j),否则 U ( i , j ) = X ( i , j ) U(i,j) = X(i,j) U(i,j)=X(i,j)
  • 最优种群选择:对每个个体 X(i) 和向量 U(i),根据目标函数值的大小进行最优选择,即如果 f ( U ( i ) ) < = f ( X ( i ) ) f(U(i)) <= f(X(i)) f(U(i))<=f(X(i)),则保留 U(i) 作为下一代的个体,否则保留 X(i)。
  • 边界条件处理:对每个个体,检查其是否超出决策空间的边界,如果是,则进行相应的处理。处理方法有多种,一种常用的方法是边界吸收,即将超出边界的分量设置为边界值。
  • 终止条件判断:判断是否达到终止条件,如最大迭代次数、目标函数值阈值等。如果是,则停止迭代并输出最优解;如果否,则返回第三步继续迭代。

差分进化算法具有结构简单、性能优越、自适应性强、并行性好等特点。它可以用来求解多种类型的优化问题,如单目标优化、多目标优化、约束优化、大规模优化等。它也可以与其他算法结合或进行改进,以提高其效率和鲁棒性。

2.特点

差分进化算法的优点有:

  • 结构简单,只需要调整三个参数(F,CR,NP),易于实现和使用。
  • 性能优越,具有较快的收敛速度和较高的精度,能够解决复杂的非线性、非凸、多峰的优化问题。
  • 自适应性强,能够根据问题特征和进化过程动态调整变异因子和交叉概率,提高搜索效率和鲁棒性。
  • 并行性好,能够利用多核处理器或分布式计算平台进行并行计算,加速优化过程。

差分进化算法的缺点有:

  • 参数选择依赖于问题特征和经验,没有统一的理论指导,可能影响算法的性能和稳定性。
  • 对于高维、大规模、多约束的优化问题,可能出现收敛速度慢、陷入局部最优、多样性丢失等问题。
  • 对于离散、整数、混合编码等类型的优化问题,需要进行特殊的编码和解码处理,增加了算法的复杂度。

差分进化算法和其他优化算法的区别主要有以下几点:

  • 差分进化算法采用实数编码,而其他优化算法如遗传算法、粒子群优化算法等可能采用二进制编码或混合编码。
  • 差分进化算法的变异操作是利用种群中个体的差向量作为扰动源,而其他优化算法的变异操作可能是随机改变个体的某些分量或基因。
  • 差分进化算法的交叉操作是按照交叉概率进行参数混合,而其他优化算法的交叉操作可能是按照某种规则进行基因重组或交换。
  • 差分进化算法的选择操作是贪婪选择,即试验向量只与目标向量进行比较和替换,而其他优化算法的选择操作可能是轮盘赌选择、锦标赛选择等,即根据适应度值决定个体被选择的概率。
  • 差分进化算法的参数设置相对简单,只需要调整三个参数(F,CR,NP),而其他优化算法的参数设置可能更复杂或依赖于问题特征。

二、DE Optimiza

1.函数最小值问题

假设我们要求解以下函数的最小值:

f ( x , y ) = sin ⁡ ( x ∗ x + y ∗ y ) / ( x ∗ x + y ∗ y + 1 ) f(x,y)=\sin(x * x + y * y) / (x * x + y * y + 1) f(x,y)=sin(xx+yy)/(xx+yy+1)

其中, x , y ∈ [ − 5 , 5 ] x,y\in[-5,5] x,y[5,5]

通过函数绘图工具得出函数分布情况,存在多处的呈现环形分布的局部最小:
在这里插入图片描述

2.差分进化算法求解

  • 初始化参数:设定种群规模 NP=100,变异因子 F=0.5,交叉概率 CR=0.1,个体维度 D=2,决策空间上下界 [-5,5],终止条件为最大迭代次数 maxGen=100 或目标函数值小于阈值 e p s = 1 0 − 8 eps=10^{-8} eps=108
  • 初始化种群:在决策空间内随机生成 NP 个 D 维的个体作为初始种群 X,并计算它们的目标函数值 f i t fit fit
  • 种群变异:对每个个体 X(i),随机选择三个不同的个体 X(r1),X(r2),X(r3) 进行变异操作 → V(i)。
  • 种群交叉:对每个个体 X(i)和变异向量 V(i),按照交叉概率CR进行交叉操作 → U(i)。
  • 最优种群选择:对每个个体X(i)和新个体 U(i),根据目标函数值的大小进行选择。
  • 边界条件处理。
  • 终止条件判断:判断是否达到终止条件,如果是,则停止迭代并输出最优解;否则返回第三步继续迭代。

2.Java 实现与结果绘图

这里添加使用 StdDraw 库进行绘图。图形库下载

  1. 简单介绍
1.设置 x、y 坐标轴
StdDraw.setXscale(a, b);
StdDraw.setYscale(c, d);
2.清空画布
StdDraw.clear();
3.设置粗细、颜色
StdDraw.setPenRadius(0.001);
StdDraw.setPenColor(StdDraw.BLACK);
4.绘制线条、正方形、长方形、点、圆
StdDraw.line(a, 0, b, 0);
StdDraw.square(0, 0, 1);
StdDraw.rectangle(0,0,1,2)//中点 (0,0),中点宽度、长度延伸
StdDraw.point(a, b);
StdDraw.circle(0, 0, r);

2.code

package code;

//Differential Optimization

import edu.princeton.cs.algs4.StdDraw;


public class c0_DEjava {

    //static int n = 100; // 离散化步数
    static double a = -5, b = 5, c = -5, d = 5; // 取值范围

    static double f(double x, double y) { // 待优化的函数
        return Math.sin(x * x + y * y) / (x * x + y * y + 1);
    }

    static int popSize = 100; // 种群大小
    static double F = 0.5, CR = 0.1; // 差分进化算法参数0.5
    static int maxGen = 100; // 最大迭代次数
    static double eps = 1e-8; // 终止条件
    static double[][] pop = new double[popSize][2]; // 种群
    static double[] fit = new double[popSize]; // 种群适应度
    static double[] best = new double[2]; // 最优解
    static double bestFit; // 最优解的适应度

    public static void main(String[] args) {
        // 初始化种群
        for (int i = 0; i < popSize; i++) {
            pop[i][0] = a + (b - a) * Math.random();
            pop[i][1] = c + (d - c) * Math.random();
        }
        // 迭代
        for (int gen = 1; gen <= maxGen; gen++) {
            // 计算种群适应度
            for (int i = 0; i < popSize; i++) {
                fit[i] = f(pop[i][0], pop[i][1]);
            }
            // 找出最优解
            int bestIndex = 0;
            for (int i = 1; i < popSize; i++) {
                if (fit[i] < fit[bestIndex]) {
                    bestIndex = i;
                }
            }
            best[0] = pop[bestIndex][0];
            best[1] = pop[bestIndex][1];
            bestFit = fit[bestIndex];

            System.out.println(gen+"  fit="+bestFit+": x="+best[0]+",y="+best[1]);

            StdDraw.setXscale(a, b);
            StdDraw.setYscale(c, d);

            // 更新种群
            for (int i = 0; i < popSize; i++) {
                double[] trial = new double[2];
                // 差分操作
                int r1, r2, r3;
                do {
                    r1 = (int) (Math.random() * popSize);
                } while (r1 == i);
                do {
                    r2 = (int) (Math.random() * popSize);
                } while (r2 == i || r2 == r1);
                do {
                    r3 = (int) (Math.random() * popSize);
                } while (r3 == i || r3 == r1 || r3 == r2);
                for (int j = 0; j < 2; j++) {
                    trial[j] = pop[r1][j] + F * (pop[r2][j] - pop[r3][j]);
                }
                // 交叉操作
                int jrand = (int) (Math.random() * 2);
                for (int j = 0; j < 2; j++) {
                    if (Math.random() < CR || j == jrand) {
                        trial[j] = Math.max(a, Math.min(b, trial[j]));
                    } else {
                        trial[j] = pop[i][j];
                    }
                }
                // 选择操作
                double trialFit = f(trial[0], trial[1]);
                if (trialFit < fit[i]) {
                    pop[i][0] = trial[0];
                    pop[i][1] = trial[1];
                    fit[i] = trialFit;
                }
            }
            // 绘制迭代过程
            if (gen>0 ){
                StdDraw.clear();
                StdDraw.setXscale(a, b);
                StdDraw.setYscale(c, d);

                StdDraw.setPenRadius(0.001);
                StdDraw.setPenColor(StdDraw.BLACK);
                StdDraw.line(a, 0, b, 0);//x
                StdDraw.line(b-0.1, 0.1, b, 0);
                StdDraw.line(b-0.1, -0.1, b, 0);

                StdDraw.line(0, a, 0, b);//y
                StdDraw.line(0.1, b-0.1, 0, b);
                StdDraw.line(-0.1, b-0.1, 0, b);

                StdDraw.square(0, 0, 1);
                StdDraw.square(0, 0, 2);
                StdDraw.square(0, 0, 3);
                StdDraw.square(0, 0, 4);

                StdDraw.setPenRadius(0.01);
                StdDraw.setPenColor(StdDraw.RED);
                StdDraw.point(best[0], best[1]);
                StdDraw.setPenRadius(0.005);
                StdDraw.setPenColor(StdDraw.BLUE);
                for (int i = 0; i < popSize; i++) {
                    StdDraw.point(pop[i][0], pop[i][1]);
                }
            }

            // 判断终止条件
            if (bestFit < eps) {
               // break;
            }
        }
    }
}

在这里插入图片描述

在这里插入图片描述


☕物有本末,事有终始,知所先后。🍭

🍎☝☝☝☝☝我的CSDN☝☝☝☝☝☝🍓

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

基于DSP+FPGA+ADS1282支持32Bit高精度数据采集方案(三)系统性能测试

系统性能分析与测试 本章将首先对系统电路的噪声和温漂进行分析&#xff0c;而后对采集系统的性能进行 测试&#xff0c;并对测试数据进行分析。 5.1 高精度 AD 转换电路噪声和温漂分析 5.1.1 电阻噪声与温漂 1 、电阻的噪声 电阻是一种噪声源&#xff0c;其严重程度取…

嵌入式就业怎么样?

嵌入式就业怎么样? 现在的IT行业,嵌入式是大热门&#xff0c;下面也要来给大家介绍下学习嵌入式之后的发展以及就业怎么样。 首先是好找工作。嵌入式人才目前是处于供不应求的状态中&#xff0c;据权威统计机构统计在所有软件开发类人才的需求中&#xff0c;对嵌入式工程师的…

matlab 点云滤波(中值、均值、高斯滤波)代码

点云中值、均值、高斯滤波 介绍一下滤波函数 smoothdata: 对含噪数据进行平滑处理 B smoothdata(___,method) 为上述任一语法指定平滑处理方法。例如&#xff0c;B smoothdata(A,sgolay) 使用 Savitzky-golay 滤波器对 A 中的数据进行平滑处理。Method-平滑处理方法 "…

Springboot获取jar包中resources资源目录下的文件

阿萨斯多问题现象&#xff1a; 今天在项目中遇到一个业务场景&#xff0c;需要用到resources资源目录下的文件&#xff0c;然后就在思考一个问题&#xff1a; 当项目打成jar后&#xff0c;Springboot要如何获取resources资源目录下的文件呢&#xff1f; 问题分析&#xff1a; 如…

GitLABJenkins

GitLAB & Jenkins 目录 实践&#xff1a;基于Jenkins提交流水线(测试成功)-2023.4.25 目的&#xff1a;掌握通过触发器将GitLab和Jenkins集成&#xff0c;实现提交流水线。 1、触发Jenkins构建 安装Generic Webhook Trigger插件 重启后&#xff0c;进入一个Pipeline项目设…

用Java创建可扩展的OpenAI GPT应用程序

ChatGPT 值得深入使用的方面之一是它的引擎&#xff0c;它不仅为基于Web的聊天机器人提供动力&#xff0c;还可以集成到Java应用程序中。 ▌Budget Journey App 想象一下&#xff0c;你想去一个城市旅行并且设置好了预算&#xff0c;你应该如何分配你的钱并让你的旅行难忘&am…

实例分割算法BlendMask

实例分割算法BlendMask 论文地址&#xff1a;https://arxiv.org/abs/2001.00309 github代码&#xff1a;https://github.com/aim-uofa/AdelaiDet 我的个人空间&#xff1a;我的个人空间 密集实例分割 ​ 密集实例分割主要分为自上而下top-down与自下而上bottom-up两类方法…

一种用于地灾边坡大坝安全深度位移监测测斜仪

1用途 固定测斜仪广泛适用于测量土石坝、面板坝、岩土边坡、路堤、基坑、岩石边坡等结构物的水平位移、垂直沉降及滑坡&#xff0c;固定测斜仪配合测斜管可反复使用&#xff0c;并方便实现测量数据的自动采集。 固定测斜仪采用的是耐冲击型倾斜传感器&#xff0c;可靠性好&am…

15天学习MySQL计划-锁(进阶篇)-第十天

15天学习MySQL计划-锁&#xff08;进阶篇&#xff09;-第十天 锁 1.概述 1.介绍 ​ 锁是计算机协调多个进程或线程并发访问某个资源的机制。数据库中&#xff0c;除传统的计算资源&#xff08;cpu&#xff0c;ram&#xff0c;i/o&#xff09;的争用以外&#xff0c;数据也是…

对数据结构的初步认识

前言: 牛牛开始更新数据结构的知识了.本专栏后续会分享用c语言实现顺序表,链表,二叉树,栈和队列,排序算法等相关知识,欢迎友友们互相学习,可以私信互相讨论哦! &#x1f388;个人主页:&#x1f388; :✨✨✨初阶牛✨✨✨ &#x1f43b;推荐专栏: &#x1f354;&#x1f35f;&a…

使用 vscode 安装配置 clang-format(代码格式化)

目前&#xff0c;网上能找到的配置教程都是乱教的。他们以C为语言讲配置&#xff0c;其实clang-format默认就是C.所以他们在配置时&#xff0c;即是错了。也会以默认C格式化&#xff0c;也不会提示配置错误。结果他们还不知道他们错在哪&#xff1f;如果让他们配置.CS, .json&a…

23种设计模式之观察者模式(黑马程序员)

观察者模式 一、概述二、结构三、实现四、总结在最后 一、概述 观察者模式又被称为发布-订阅模式(Publish/Subscribe)模式&#xff0c;它定义了一种一对多的依赖关系&#xff0c;让多个观察者对象同时监听某一个主题对象。这个主题对象在状态发生变化时&#xff0c;会通知所有…

中级软件设计师备考---操作系统和计算机网络

【因为我自己是软件工程专业毕业的学生&#xff0c;所以408里的这两门课都比较熟悉&#xff0c;因此这一部分只放一些我印象不是完全深刻的知识。】 目录 操作系统前驱图与PV操作死锁的预防与避免绝对路径和相对路径缺页中断的某种练习题 计算机网络网络规划与设计特殊含义的I…

【FFTW库】编译生成 x86、arm 环境下的FFTW库

FFTW是一个快速计算离散傅里叶变换的标准C语言程序集&#xff0c;可计算一维或多维实和复数据以及任意规模的DFT。下面主要介绍的是 x86 环境下 FFTW库的编译过程&#xff0c;arm环境下的编译过程和FFTW类似&#xff0c;不同之处在于需要手动指定 编译环境 和 编译器。 FFTW有…

2023年五月份图形化一级打卡试题

活动时间 从2023年5月1日至5月21日&#xff0c;每天一道编程题。 本次打卡的规则如下&#xff1a; 小朋友每天利用10~15分钟做一道编程题&#xff0c;遇到问题就来群内讨论&#xff0c;我来给大家答疑。 小朋友做完题目后&#xff0c;截图到朋友圈打卡并把打卡的截图发到活动群…

OkHttp3源码解析 - 连接机制和缓存机制

系列文章目录 第一章 OkHttp3源码解析 - 请求流程 第二章 OkHttp3源码解析 - 拦截器 第三章 OkHttp3源码解析 - 连接机制和缓存机制 文章目录 系列文章目录前言一、连接机制1.1 创建连接1.2 连接池 二、缓存机制2.1 缓存策略2.2 缓存管理 彩蛋致谢 前言 本文基于okhttp3.12.1…

三大本土化战略支点,大陆集团扩大中国市场生态合作「朋友圈」

“在中国&#xff0c;大陆集团已经走过30余年的发展与耕耘历程&#xff0c;并在过去10年间投资了超过30亿欧元。中国市场也成为了我们重要的‘增长引擎’与‘定海神针’。未来&#xff0c;我们将继续深耕中国这个技术导向的市场。”4月19日上海车展上&#xff0c;大陆集团首席执…

ospf综合实验

目录标题 第一步&#xff1a;网段划分第二步&#xff1a;配置区域0路由器接口和环回第三步&#xff1a;配置区域0缺省第四步&#xff1a;配置MGRE环境第五步&#xff1a;配置区域0用户网段第六步&#xff1a;配置区域1路由器及环回第七步&#xff1a;配置区域2的路由器及环回第…

低代码开发重要工具:jvs-logic(逻辑引擎)基础原理与功能架构

逻辑引擎介绍 逻辑引擎是一种能够处理逻辑表达式的程序&#xff0c;它能够根据用户输入的表达式计算出表达式的值。在实际应用中&#xff0c;逻辑引擎通常被用于处理规则引擎、决策系统、业务规则配置等领域&#xff0c;具有广泛的应用前景。 原理与核心功能描述 基础原理 …

走进社区客户端测试 | 得物技术

0.引言 社区 C 端质量体系建设思考&#xff1f; 询问一下 ChatGPT 1、关于社区客户端 1.1 社区端上功能 得物首页 搜索、发布、关注流、推荐流、沉浸式单列流、活动 tab、其他二级频道 tab 动态详情页 图文、视频、专栏、点评 私域 个人/他人主页、通讯录好友、微博好友…