差分进化算法DE

此算法是一种基于贪心的并行直接搜索算法。

1.过程

(1)初始化种群

NP个D维的参数向量x_{i,g}(i=1,2,...,NP)作为每一代G种群,种群规模必须>=4

(2)变异

使用种群中两个不同向量来干扰一个现有向量,进行差分操作,实现变异。变异时需要确保变异向量不会超出边界,若超出则需要进行修正。F为变异因子∈[0,2],控制差分变化的放大倍数。

对于每个目标向量x_{i,G}都要根据三个不同向量生成一个变异向量v_{i,G+1}

(3)交叉

每个个体和它生成的子代变异向量进行交叉,每个分量按一定的概率选择子代变异向量来生成试验个体,若没有选择子代变异向量则此分量为原个体的分量。按照上述方法生成试验向量u_{i,j}(g)。CR为交叉概率因子;jrand是[1,...,D]中随机选择的索引,确保u从v获得至少一个分量。

(4)选择

根据贪婪原则,如果试验向量成本函数值<目标向量成本函数值,则下一代的种群个体设置为试验向量,否则保留上一代的目标向量。

2、流程图

3、代码

from random import random
from random import sample
from random import uniform
import matplotlib.pyplot as plt
import matplotlib
matplotlib.use('TkAgg')

# 向量维度的平方求和
def sphere(x):
    total = 0
    for i in range(len(x)):
        total += x[i]**2
    return total

# 确保变异向量不超出边界
def ensure_bounds(vec, bounds):
    vec_new = []
    # 遍历变异向量的每个维度
    for i in range(len(vec)):
        # 变量比边界最小值还小,赋值为边界最小值
        if vec[i] < bounds[i][0]:
            vec_new.append(bounds[i][0])
        # 变量比边界最大值还大,赋值为边界最大值
        if vec[i] > bounds[i][1]:
            vec_new.append(bounds[i][1])
        # 变量满足边界条件,不进行操作
        if bounds[i][0] <= vec[i] <= bounds[i][1]:
            vec_new.append(vec[i])
    return vec_new


# ——————————————————————————DE————————————————————————————————

def minimize(bounds, popsize, mutate, recombination, maxiter):
    # 种群初始化

    population = []     # 空的种群
    gen_avg_record = []     # 适应度平均值
    gen_best_record = []        #适应度最优值
    for i in range(0, popsize):
        indv = []
        for j in range(len(bounds)):    # D=2,所以j取0,1
            indv.append(uniform(bounds[j][0], bounds[j][1]))     # uniform 均匀分布
        population.append(indv)     # append 追加

    # 进行迭代

    for i in range(1, maxiter+1):
        print("generation:", i)     #输出种群
        gen_scores = []

        for j in range(0, popsize):
            # 变异
            candidates = list(range(0, popsize))
            candidates.remove(j)    # 去除目标向量的序号
            random_index = sample(candidates, 3)    # 从candidates中随机抽取除3个元素
            x_1 = population[random_index[0]]   # 抽到2,则选取种群中第二个个体作为x_r1g
            x_2 = population[random_index[1]]
            x_3 = population[random_index[2]]
            x_t = population[j]     # 目标向量

            # x_r2g减x_r3g,生成新向量 x_diff
            # zip(numbers, letters) 生成 (x, y) 形式的元组的迭代器,x取自数字.y取自字母
            x_diff = [x_2_i - x_3_i for x_2_i,x_3_i in zip(x_2, x_3)]

            # 变异向量 v_ig+1 = x_r1g +F * (x_r2g - x_r3g)
            v_donor = [x_1_i + mutate * x_diff_i for x_1_i, x_diff_i in zip(x_1, x_diff)]
            # 确保变异向量在边界内
            v_donor = ensure_bounds(v_donor, bounds)

            # 交叉
            v_trial = []    # 试验向量
            for k in range(len(x_t)):
                crossover = random()    # 生成[0,1]内的随机数
                if crossover <= recombination:
                    v_trial.append(v_donor[k])
                else:
                    v_trial.append(x_t[k])

            # 选择
            score_trial = sphere(v_trial)   # sphere:向量各个维度的平方和
            score_target = sphere(x_t)

            if score_trial < score_target:
                population[j] = v_trial
                gen_scores.append(score_trial)
                print(">", score_trial, v_trial)
            else:
                print(">", score_target, x_t)
                gen_scores.append(score_target)

        gen_avg = sum(gen_scores) / popsize
        gen_best = min(gen_scores)
        gen_avg_record.append(gen_avg)
        gen_best_record.append(gen_best)
        gen_sol = population[gen_scores.index(min(gen_scores))]

        print(",种群平均值:", gen_avg)
        print(",种群最优值:", gen_best)
        print(",最好结果:", gen_sol)

        pass

    # 画图
    plt.plot([i for i in range(len(gen_best_record))], gen_best_record, 'b')
    plt.plot([i for i in range(len(gen_avg_record))], gen_avg_record, 'r')
    plt.ylabel('fitness')
    plt.xlabel('generation')
    plt.yticks([0, 0.1, 0.2, 0.3, 0.4, 0.5, 0.6])  # 设置y轴刻度
    plt.xticks([0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20])  # 设置x轴刻度
    plt.legend(['gen_best', 'gen_avg'])
    plt.show()

#设置参数
bounds = [(-1,1),(-1,1)]    # 维度D=2,搜索空间范围也叫约束边界
popsize = 10    # 种群规模NP
mutate = 0.5    # 变异因子 F
recombination = 0.7    # 交叉概率 CR [0,1]
maxiter = 20    # 最大迭代次数
# DE/rand/1/bin
minimize(bounds, popsize, mutate, recombination, maxiter)

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

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

相关文章

穿梭时光的Java魔法:轻松掌握Date类,揭示当前时间的神秘面纱!

一、实现目标 获取当前时间&#xff01; 二、上代码 import java.text.SimpleDateFormat; import java.util.Date; public class Date_ { // 输出当前的时间 public static void main(String[] arg…

集群监控Zabbix和Prometheus

文章目录 一、Zabbix入门概述1、Zabbix概述2、Zabbix 基础架构3、Zabbix部署3.1 前提环境准备3.2 安装Zabbix3.3 配置Zabbix3.4 启动停止Zabbix 二、Zabbix的使用与集成1、Zabbix常用术语2、Zabbix实战2.1 创建Host2.2 创建监控项&#xff08;Items&#xff09;2.3 创建触发器&…

Dueling DQN 跑 Pendulum-v1

gym-0.26.1 Pendulum-v1 Dueling DQN 因为还是DQN,所以我们沿用double DQN,然后把 Qnet 换成 VAnet。 其他的不变&#xff0c;详情参考前一篇文章。 class VA(nn.Module):"""只有一层隐藏层的A网络和V网络"""def __init__(self, state_dim, hidd…

二百一十五、Flume——Flume拓扑结构之复制和多路复用的开发案例(亲测,附截图)

一、目的 对于Flume的复制和多路复用拓扑结构&#xff0c;进行一个小的开发测试 二、复制和多路复用拓扑结构 &#xff08;一&#xff09;结构含义 Flume 支持将事件流向一个或者多个目的地。 &#xff08;二&#xff09;结构特征 这种模式可以将相同数据复制到多个channe…

【UML】组件图中的供接口和需接口与面向对象中的接口

UML&#xff08;统一建模语言&#xff09;组件图中的“供接口”&#xff08;Provided Interface&#xff09;和“需接口”&#xff08;Required Interface&#xff09;与面向对象编程中的接口概念有关联&#xff0c;但它们在应用上有所区别。 下面解释两者的关系&#xff1a; …

使用kubeadm部署一套Kubernetes v1.23.0集群

使用kubeadm部署一套Kubernetes v1.23.0集群 1、前置知识点 1.1 生产环境可部署Kubernetes集群的两种方式 目前生产部署Kubernetes集群主要有两种方式&#xff1a; • kubeadm Kubeadm是一个K8s部署工具&#xff0c;提供kubeadm init和kubeadm join&#xff0c;用于快速部…

14光线追踪(加速结构)

1.Uniform Spatial Partitions(Grids)—均匀空间划分 1.1场景预处理 Find bounding boxCreate gridStore each object in overlapping cells判断哪些网格可能有物体&#xff0c;有物体的格子做上特殊标记 1.2开始光线追踪 开始做光追→ 光线到有物体的格子 → 判断是否有交点…

day03、关系模型之基本概念

关系模型之基本概念 1.关系模型概述1.1 关系模型三要素基本结构&#xff1a;relation/Table基本操作:relation operator 2.什么是关系3.关系模型中的完整性约束 本视频来源于B站&#xff0c;战德臣老师 1.关系模型概述 1.1 关系模型三要素 基本结构&#xff1a;relation/Table…

【Kubernetes】四层代理Service

Service四层代理 一、Service概念原理1.1、为什么要有Service1.2、Service概述1.3、工作原理1.4、三类IP地址【1】Node Network&#xff08;节点网络&#xff09;【2】Pod network&#xff08;pod 网络&#xff09;【3】Cluster Network&#xff08;服务网络&#xff09; 二、S…

Leetcode 139.单词拆分

OJ链接 &#xff1a;139.单词拆分 代码&#xff1a; class Solution {public boolean wordBreak(String s, List<String> wordDict) {Set<String> set new HashSet<String>(wordDict);int n s.length();boolean[] dp new boolean[n1];dp[0] true;//初始…

现代雷达车载应用——第2章 汽车雷达系统原理 2.5节 检测基础

经典著作&#xff0c;值得一读&#xff0c;英文原版下载链接【免费】ModernRadarforAutomotiveApplications资源-CSDN文库。 2.5 检测基础 对于要测试目标是否存在的雷达测量&#xff0c;可以假定下列两个假设之一为真&#xff1a; •H0:—测量结果仅为噪声。 •H1:—测量是噪…

leaflet使用热力图报L找不到的问题ReferenceError: L is not defined at leaflet-heat.js:11:3

1.在main.js中直接引入会显示找不到L 2.解决办法 直接在组件中单独引入使用 可以直接显示出来。 至于为什么main中不能引入为全局&#xff0c;我是没找到&#xff0c;我的另外一个项目可以&#xff0c;新项目不行&#xff0c;不知哪里设置的问题

LangChain 25: SQL Agent通过自然语言查询数据库sqlite

LangChain系列文章 LangChain 实现给动物取名字&#xff0c;LangChain 2模块化prompt template并用streamlit生成网站 实现给动物取名字LangChain 3使用Agent访问Wikipedia和llm-math计算狗的平均年龄LangChain 4用向量数据库Faiss存储&#xff0c;读取YouTube的视频文本搜索I…

多模态AI:技术深掘与应用实景解析

多模态AI&#xff1a;技术深掘与应用实景解析 在当今人工智能技术的快速发展中&#xff0c;多模态AI凭借其独特的数据处理能力&#xff0c;成为了科技创新的前沿。这项技术结合了视觉、听觉、文本等多种感知模式&#xff0c;开辟了人工智能处理和理解复杂信息的新纪元。本文旨…

NOIP2017提高组day2 - T2:宝藏

题目链接 [NOIP2017 提高组] 宝藏 题目描述 参与考古挖掘的小明得到了一份藏宝图&#xff0c;藏宝图上标出了 n n n 个深埋在地下的宝藏屋&#xff0c; 也给出了这 n n n 个宝藏屋之间可供开发的 m m m 条道路和它们的长度。 小明决心亲自前往挖掘所有宝藏屋中的宝藏。但…

HarmonyOS开发入门HelloWorld及工具安装

下载与安装DevEco Studio 在HarmonyOS应用开发学习之前&#xff0c;需要进行一些准备工作&#xff0c;首先需要完成开发工具DevEco Studio的下载与安装以及环境配置。 进入DevEco Studio下载官网&#xff0c;单击“立即下载”进入下载页面。 DevEco Studio提供了Windows版本和…

DeCap DECODING CLIP LATENTS FOR ZERO-SHOT CAPTIONING VIA TEXT-ONLY TRAINING

DeCap: DECODING CLIP LATENTS FOR ZERO-SHOT CAPTIONING VIA TEXT-ONLY TRAINING 论文&#xff1a;https://arxiv.org/abs/2303.03032 代码&#xff1a;https://github.com/dhg-wei/DeCap OpenReview&#xff1a;https://openreview.net/forum?idLt8bMlhiwx2 TL; DR&#xff…

新版Spring Security6.2案例 - Basic HTTP Authentication

前言&#xff1a; 书接上文&#xff0c;翻译官网Authentication的Username/Password这页&#xff0c;接下来继续翻译basic的这页&#xff0c;因为官网说的都是原理性的&#xff0c;这边一个小案例关于basic http authentication。 Basic Authentication 本节介绍 HTTP 基本身…

项目总结-自主HTTP实现

终于是写完了&#xff0c;花费了2周时间&#xff0c;一点一点看&#xff0c;还没有扩展&#xff0c;但是基本功能是已经实现了。利用的是Tcp为网络链接&#xff0c;在其上面又写了http的壳。没有使用epoll&#xff0c;多路转接难度比较高&#xff0c;以后有机会再写&#xff0c…

【程序人生】还记得当初自己为什么选择计算机?

✏️ 初识计算机&#xff1a; 还记得人生中第一次接触计算机编程是在高中&#xff0c;第一门编程语言是Python&#xff08;很可惜由于条件限制的原因&#xff0c;当时没能坚持学下去......现在想来有点后悔&#xff0c;没能坚持&#xff0c;唉......&#xff09;。但是&#xf…