【人工智能系列 - 智能硬件 - 09】趋向型CGA算法

2023-10-20 08:40

本文主要是介绍【人工智能系列 - 智能硬件 - 09】趋向型CGA算法,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

CGA算法使用概率变量表示染色体种群,这一突出的优点使得它能够高效地通过硬件得以实现。

然而,在处理复杂问题时,它的执行效率却往往无法达到实际应用的要求。

针对这一弱点,在对标准CGA进行了深入分析与研究后,提出了一种带有收敛趋势性的CGA算法,称之为TCGA算法(Compact Genetic Algorithm with Tendency)。

所提出的新算法作为标准CGA算法的一种变体,其旨在提高演化算法在解决实际问题时对问题解空间的搜索能力和演化算法的收敛速度。

TCGA算法在保持了标准CGA算法易于硬件实现等优点的同时,有效地提高了演化算法的收敛速度,是一种更为有效,并且适用于更多的实际应用的演化算法。

在研究过程中,通过使用不同类型的测试函数分析TCGA算法的性能,并且将测试结果与标准CGA算法的演化结果进行比较,比较结果表明,TCGA算法的收敛速度和最优解的质量都得到了提高,比标准CGA算法更适合于实际演化硬件的应用。

TCGA算法原理

尽管标准CGA算法有着便于硬件实现的优点,但是它只适用于解决规律性较为明显的简单问题,对于略为复杂的问题其很容易发生早熟收敛现象。

另外,在概率变量收敛之前,标准CGA算法经常会丢失所获得的优秀个体。

最为关键的是,对于演化硬件的实际应用缺少足够的搜索能力。

TCGA算法在标准CGA的基础上,主要进行了两方面的改进。

一方面是,在算法中增加了当前解朝向最优解的趋势性的判断,以促进概率变量的更新能够在每一步都逐渐地接近最优解。

具体做法为,在每一代的演化过程中,对于染色体个体的每一位,首先对其进行反转,然后判断比较每一位反转后的个体与原个体之间的适应度值。当新个体的适应度值更大时,再判断反转位的值,如果该位进行反转后的值为1,则通过增加1/N的步长来更新该位所对应的概率变量值;如果该位进行反转后的值为0,则通过减少1/N的步长来更新该位所对应的概率变量值。

依靠此种对于收敛趋势的判断,可以增加算法的搜索能力使得染色体个体能够更快地收敛到最优解。

另一方面,引入了改进的变异操作。传统的变异操作是随机性的,并且使用一个概率值来控制变异。

TCGA算法在传统的随机变异方法的基础上,增加了新的变异步骤,通过判断染色体个体的每一位的概率变量值决定是否对候选染色体个体的相应位执行变异操作。

判断的标准为,如果概率变量值大于0.5,且当前位为0则反转该位,为1则该位保持不变;否则当前位为1则反转该位,为0则该位保持不变。

通过引入改进的变异操作,能够以更大的机率得到更好的染色体个体,并且保持演化过程中种群的多样性,从而避免了局部收敛状况的发生。

TCGA 算法的伪码如下所示:

Step.1 Initialize the probability vector-L is the number of bits in the genome.for i:=1 to L do  p[i]:=0.5;       ------P为概率变量
Step.2 Generate two initial individuals from the vector.a:=generate(p);b:=generate(p);
Step.3 Let them compete.Here resamp_rate is champion resampling frequency.[winner, loser]:=evaluate(a,b,resamp_rate);    ------增加“冠军重采样”策略
Step.4 Update the probability vector toward the better one. Here we judge each bit of vector using the tendence criterion.for i:=1 to L do          ------L为染色体个体位串长度w:=winner;if winner[i] <> loser[i] thenif winner[i]= =1 then { w[i]:=0;      ------增加收敛趋势性判断fw:=fitness(w);if fw>fwn then p[i]:=p[i]-1/N;     ------1/N为概率值更新步长else p[i]:=p[i]+1/N; }else { w[i]:=1;fw:=fitness(w);if fw>fwn then p[i]:=p[i]+1/N;else p[i]:=p[i]-1/N; }
a) Mutate and substitute.if winner= =a then { c:=mutate(a);        ------引入改进的变异操作
if fitness(c)>fitness(a) then a:=c; }else { c:=mutate(b); 
if fitness(c)>fitness(b) then b:=c; }
b) Generate one individual from the updated vector.if winner= =a then b:=generate(p);        ------增加精英保留策略else a:=generate(p);
Step.5 Check the stopping criterion.for i:=1 to L doif p[i]>0 and p[i]<1 then goto step.3.
Step.6 The final probability vector represents the solution.

TCGA算法仿真分析

为了验证TCGA算法的性能,对算法进行软件仿真,使用四种不同类型的测试函数对算法的收敛性进行测试,同时将所得到的测试结果与使用相同测试函数对标准CGA算法的测试结果相比较。

1) Onemax函数

该测试函数为Onemax函数,其计算公式为:

它在定义域[0,255]内为单调递增函数,其曲面图及剖面图如下图所示,且具有惟一全局极大值130050。

Onemax函数曲面示意图

Onemax函数剖面示意图

对于该测试函数,使用TCGA算法仅需要一代演化运行即可收敛到全局极大值,与之相比,使用标准CGA算法则需要运行4000代。

两种算法的收敛性仿真测试结果如下图所示,图中横坐标为演化代数,纵坐标为每一代最优个体的适应度值。

TCGA收敛性仿真测试图

标准CGA收敛性仿真测试图

2) One-order振荡函数

该测试函数为一元的振荡函数,其计算公式为:

它在定义域[-1,2]内呈现振荡特性,具有多个局部极大值,其曲线图如下图所示。

通过使用对函数进行求导计算极值的方法,可以得出该函数在定义域内的惟一全局极大值略大于3.85。

对于该测试函数,使用TCGA算法进行演化,函数收敛到全局极大值所需要的演化代数在500代以内,而使用标准CGA算法需要超过4000代的演化次数函数才能够收敛,并且收敛结果为局部极大值,呈现早熟收敛现象。

两种算法的收敛性仿真测试结果如下图所示,图中横坐标为演化代数,纵坐标为每一代最优个体的适应度值。

TCGA收敛性仿真测试图

标准CGA收敛性仿真测试图

从仿真测试结果中可以看出,由于标准CGA算法并未采用精英保留策略,在每一代的演化开始时,都需要依据当前的概率变量值重新生成两个新个体。

因此,虽然算法曾经在演化过程中搜索得到定义域内的全局极大值,但是最后却仍然按照每一代演化所更新的概率变量值收敛到局部极大值点,以致于出现早熟收敛现象。

3) 固定目标位串的演化

该测试部分对固定的目标位串进行演化,目标位串的长度为44,以候选位串和目标位串的相同位的数目作为适应度评估函数,当适应度值达到最大值时,所得到的位串即为需要演化的目标位串。

测试所选用的目标位串如下:

11000101100001010111110111100101101110011011

对于该测试部分,使用TCGA算法,候选位串仅仅经过几十代的演化即可收敛到目标位串。

而使用标准CGA算法,虽然最终也可令候选位串收敛到目标位串,但是其所耗费的时间远远大于TCGA算法。

两种算法的收敛性仿真测试结果如下图所示,图中横坐标为演化代数,纵坐标为每一代最优个体的适应度值。

TCGA收敛性仿真测试图

标准CGA收敛性仿真测试图

 

这篇关于【人工智能系列 - 智能硬件 - 09】趋向型CGA算法的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/246001

相关文章

基于Python打造一个智能单词管理神器

《基于Python打造一个智能单词管理神器》这篇文章主要为大家详细介绍了如何使用Python打造一个智能单词管理神器,从查询到导出的一站式解决,感兴趣的小伙伴可以跟随小编一起学习一下... 目录1. 项目概述:为什么需要这个工具2. 环境搭建与快速入门2.1 环境要求2.2 首次运行配置3. 核心功能使用指

Linux下如何使用C++获取硬件信息

《Linux下如何使用C++获取硬件信息》这篇文章主要为大家详细介绍了如何使用C++实现获取CPU,主板,磁盘,BIOS信息等硬件信息,文中的示例代码讲解详细,感兴趣的小伙伴可以了解下... 目录方法获取CPU信息:读取"/proc/cpuinfo"文件获取磁盘信息:读取"/proc/diskstats"文

Python实现word文档内容智能提取以及合成

《Python实现word文档内容智能提取以及合成》这篇文章主要为大家详细介绍了如何使用Python实现从10个左右的docx文档中抽取内容,再调整语言风格后生成新的文档,感兴趣的小伙伴可以了解一下... 目录核心思路技术路径实现步骤阶段一:准备工作阶段二:内容提取 (python 脚本)阶段三:语言风格调

openCV中KNN算法的实现

《openCV中KNN算法的实现》KNN算法是一种简单且常用的分类算法,本文主要介绍了openCV中KNN算法的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的... 目录KNN算法流程使用OpenCV实现KNNOpenCV 是一个开源的跨平台计算机视觉库,它提供了各

springboot+dubbo实现时间轮算法

《springboot+dubbo实现时间轮算法》时间轮是一种高效利用线程资源进行批量化调度的算法,本文主要介绍了springboot+dubbo实现时间轮算法,文中通过示例代码介绍的非常详细,对大家... 目录前言一、参数说明二、具体实现1、HashedwheelTimer2、createWheel3、n

SpringBoot实现MD5加盐算法的示例代码

《SpringBoot实现MD5加盐算法的示例代码》加盐算法是一种用于增强密码安全性的技术,本文主要介绍了SpringBoot实现MD5加盐算法的示例代码,文中通过示例代码介绍的非常详细,对大家的学习... 目录一、什么是加盐算法二、如何实现加盐算法2.1 加盐算法代码实现2.2 注册页面中进行密码加盐2.

Java时间轮调度算法的代码实现

《Java时间轮调度算法的代码实现》时间轮是一种高效的定时调度算法,主要用于管理延时任务或周期性任务,它通过一个环形数组(时间轮)和指针来实现,将大量定时任务分摊到固定的时间槽中,极大地降低了时间复杂... 目录1、简述2、时间轮的原理3. 时间轮的实现步骤3.1 定义时间槽3.2 定义时间轮3.3 使用时

如何通过Golang的container/list实现LRU缓存算法

《如何通过Golang的container/list实现LRU缓存算法》文章介绍了Go语言中container/list包实现的双向链表,并探讨了如何使用链表实现LRU缓存,LRU缓存通过维护一个双向... 目录力扣:146. LRU 缓存主要结构 List 和 Element常用方法1. 初始化链表2.

使用Python实现表格字段智能去重

《使用Python实现表格字段智能去重》在数据分析和处理过程中,数据清洗是一个至关重要的步骤,其中字段去重是一个常见且关键的任务,下面我们看看如何使用Python进行表格字段智能去重吧... 目录一、引言二、数据重复问题的常见场景与影响三、python在数据清洗中的优势四、基于Python的表格字段智能去重

Spring AI集成DeepSeek三步搞定Java智能应用的详细过程

《SpringAI集成DeepSeek三步搞定Java智能应用的详细过程》本文介绍了如何使用SpringAI集成DeepSeek,一个国内顶尖的多模态大模型,SpringAI提供了一套统一的接口,简... 目录DeepSeek 介绍Spring AI 是什么?Spring AI 的主要功能包括1、环境准备2