智能算法系列之遗传算法

这篇具有很好参考价值的文章主要介绍了智能算法系列之遗传算法。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

智能算法系列之遗传算法

  本博客封面由ChatGPT + Midjourney共同创作而成。

前言

  本篇是智能算法(Python复现)专栏的第一篇文章,主要介绍遗传算法(Genetic Algorithm, GA)的思想,python实现及相关应用场景模拟。

  生物在自然界的生存繁衍,经历了一代又一代的更替,新旧物种的淘汰或进化展示了生物在自然界的自适应能力。受此启发,遗传算法模拟生物遗传和进化过程,成为求解极值问题的一类自组织、自适应的人工智能技术。其理论来源包括拉马克进化学说(Lamarckism)、达尔文进化学说和孟德尔遗传学(Mendelian inheritance),主要借鉴的生物学基础是生物的遗传、变异和进化。

1. 算法思想

  遗传算法是进化算法(Evolutionary Algorithms, EA)的一个分支,将达尔文的进化理论引入计算机。具体可以表述为:首先根据某种机制创建初始种群,对初始种群进行适应度(fitness)评估,保留初始种群中最优适应度解作为当前最优解。然后对种群中的个体进行选择(select)、交叉(crossover)和变异(mutation),得到新的种群,若新种群中的最优解优于父代的最优解,则替换。重复上述操作,直到满足算法终止条件。

  种群中的每个个体代表问题的一种解。

智能算法系列之遗传算法

  根据遗传算法的流程图,我们可以梳理出5个问题,对应着遗传算法的5个组成部分:
  (1) 问题的解如何进行编码,即DNA编码?
  (2) 种群的初始化如何进行?超参数如何选择?
  (3) 适应度函数如何设计?
  (4) 如何对DNA编码进行选择、交叉和变异?
  (5) 终止条件是什么?

2. 细节梳理

2.1 DAN编码

  解的遗传表示称为遗传编码,因为遗传算法不能直接处理问题空间的决策变量,必须转换成由基因按一定结构组成的染色体,所以就有了编码操作,反之将编码空间向问题空间的映射称为译码。
  编码的方式有很多种,根据采用的符号,可以分为二进制编码、实数编码和整数编码等;根据编码采用的结构,可以分为一维编码和多维编码;根据编码采用的长度,可以分为固定长度的编码和可变长度的编码。对于不同的优化问题,要选择合适的编码方式,但应该遵循以下约束:
  (1) 不冗余性:从编码到解码的映射是11的;
  (2) 合法性:对编码的任意排列都对应着一个解;
  (2) 完备性:任意解都对应着一个编码。

2.2 种群初始化及超参选择

  产生初始种群的方法通常有两种:一种是由完全随机的方法产生的,它适合于对问题的解无任何先验知识的情况;另一种是根据某些先验知识转变为必须满足的一组要求,然后在满足这些要求的解中再随机地选取样本。就目前工作中所使用的情况来看,都是随机初始种群。
  参数大小的选择对遗传算法执行的结果有很大影响,好的参数设置会加速算法收敛到全局最优解,反之,差的参数选择将会使结果得到局部最优解,甚至会导致结果无法收敛。一般地,需要设置的参数有以下几种:
  (1) 种群规模N影响算法的搜索能力和运行效率,一般设置为20~100N设置较大时,一次所覆盖的模式较多,增大了种群多样性和算法搜索能力,但也增加了计算量,降低了算法运行效率;N设置较小时(群体内个体的多样性减小),容易造成局部收敛;
  (2) DNA长度L影响算法的计算量和交配变异操作的效果。L的设置一般由问题定义的解的形式和选择的编码方式决定;
  (3) 交叉(交配)概率Pc决定了进化过程中种群内参加交配的染色体的平均数目,取值一般为0.4~0.99,也可以使用自适应方法在算法运行过程中调整交配概率;
  (4) 变异概率Pm决定了进化过程中全体发生变异基因的平均个数,取值一般为0.001~0.1。变异操作增加了群体进化的多样性,但Pm值不宜过大,否则会对已找到的较优解有一定的破坏作用,使搜索状态倒退回原来较差的情况。
  (5) 在终止条件中,需要设定的有最大进化代数和收敛误差值。最大进化代数一般可设为100~1000,需要根据实际问题来设定,合理的进化代数可以防止算法因不收敛而一直运行。

2.3 适应度函数

  适应度函数(fitness function),也叫评价函数。顾名思义,就是用来评价个体的适应度值,适应度值越大的个体越符合算法对解的要求,所以评价函数至关重要,指引解进化的方向。同时,适应度函数的选择会直接影响遗传算法的收敛速度以及能否找到全局最优解。

2.4 选择、交叉(交配)与变异

  选择操作的原理本质上是基于达尔文的自然选择学说,它的作用是将遗传搜索引导到搜索空间中有前途的区域。通常采用的选择方法有轮盘赌选择(roulette wheel selection)、锦标赛选择(tournament selection)、随机选择(stochastic sampling)、确定性选择(deterministic sampling)和混合选择(mixed sampling)
  所谓交叉是指把两个父代个体的部分结构加以替换生成新个体的操作,这样可以提高搜索力。在交叉运算之前必须对群体中的个体进行配对。目前常用的配对策略是随机配对,即将群体中的个体以随机方式两两配对,交叉操作是在配对个体之间进行的。
  变异就是将染色体编码串中的某些基因用其他的基因来替换。它是遗传算法中不可缺少的部分,目的就是改善遗传算法的局部搜索能力,维持群体的多样性,防止出现早熟现象。设计变异算子需要确定变异点的位置和基因值的替换,最常用的是基本位变异,它只改变编码串中个别位的基因值。从概率上来看,变异发生的概率较小,发挥作用比较慢,效果不明显。
  

2.5 终止条件

  遗传算法终止条件通常有两种:一是设定迭代次数,当算法迭代次数达到设定值时,算法停止;二是当解的变化小于某一设定的较小值时,认为结果收敛,算法停止。使用时可以只使用一种,也可以两种同时使用。

3. 算法实现

3.1 问题场景

  最值问题,求解 f ( x ) = x s i n ( 5 x ) − x c o s ( 2 x ) f(x) = xsin(5x) - xcos(2x) f(x)=xsin(5x)xcos(2x)在定义域[0, 5]上的最大值。我们先手动计算一下:

f ′ ( x ) = 2 x s i n ( 2 x ) + s i n ( 5 x ) − c o s ( 2 x ) + 5 x c o s ( 5 x ) f^\prime (x) = 2 x sin(2 x) + sin(5 x) - cos(2 x) + 5 x cos(5 x) f(x)=2xsin(2x)+sin(5x)cos(2x)+5xcos(5x)  令 f ′ ( x ) = 0 f^\prime (x) = 0 f(x)=0之后,理论上可以求得驻点,但又不太好计算。。。

3.2 从遗传算法角度分析

  从上述的公式可以知道,问题的解,也就是最大值对应的变量x是一个浮点数,这里采用二进制编码的方式,具体示例为:
  假设定义域内的一个解为1.5,基因编码长度为10,则将转为中间值为307(取整),进一步将其转为二进制为0100110011,同理,也可以将二进制转为真实解,1011111011转为中间值为763,进一步转为浮点数(解)为3.7292277614858262。基因编码与解的关系为: x ∗ = i n t ( d n a , 2 ) 2 l e n ( d n a ) − 1 × x r a n g e x^* = \frac {int(dna, 2)} {2^{len(dna)}-1} \times x_{range} x=2len(dna)1int(dna,2)×xrange
  既然是解决最大值问题,那么可以直接将函数 f ( x ) f(x) f(x)直接作为适应度函数,即函数值就表示适应度的值,函数值越大,表示种群个体对环境的适应性越强,就说明种群对应的DNA是最优的(解)。
  物竞天择,适者生存。select操作当然是选择适应度较强的个体了,本篇中的crossover操作和mutation操作都采用随机的方式来产生新的种群个体。

3.3 python实现

 -*- coding:utf-8 -*-
# Author:   xiayouran
# Email:    youran.xia@foxmail.com
# Datetime: 2023/3/10 16:55
# Filename: ga.py
import numpy as np
import matplotlib.pyplot as plt

dna_size = 10           # DNA length
population_size = 100   # population size
crossover_rate = 0.7    # mating probability(DNA crossover)
mutation_rate = 0.003   # mutation probability
max_generations = 1000   # maximum iterations
x_range = [0, 5]        # x upper and lower bounds

seed = 10086
np.random.seed(seed)

def F(x):
    return x*np.sin(5*x) - x*np.cos(2*x)     # to find the maximum of this function

# find non-zero fitness for selection
def get_fitness(pred):
    return pred + 1e-3 - np.min(pred)

# convert binary DNA to decimal and normalize it to a range(0, 5)
def translateDNA(population):
    # 二进制转10进制, 然后归一化, 再乘以x坐标轴
    return population.dot(2 ** np.arange(dna_size)[::-1]) / float(2**dna_size-1) * x_range[1]

def selection(population, fitness):
    # p: 一维数组, 决定了数组中每个元素采样的概率, 默认为None, 即每个元素被采样的概率相同
    # replace=True, 允许元素重复
    idx = np.random.choice(np.arange(population_size), size=population_size, replace=True,
                           p=fitness/fitness.sum())
    return population[idx]

def crossover(parent, population):
    if np.random.rand() < crossover_rate:   # random crossover
        i_ = np.random.randint(0, population_size, size=1)  # select another individual from population
        cross_points = np.random.randint(0, 2, size=dna_size).astype(np.bool)   # choose crossover points
        parent[cross_points] = population[i_, cross_points]     # mating and produce one child
    return parent

def mutation(child):
    for point in range(dna_size):
        if np.random.rand() < mutation_rate:    # random mutate
            child[point] = 1 if child[point] == 0 else 0
    return child

if __name__ == '__main__':
    # Step1: initialize the population DNA
    population = np.random.randint(2, size=(population_size, dna_size))

    fig = plt.figure()
    plt.ion()   # 交互模式
    x = np.linspace(*x_range, 200)
    plt.plot(x, F(x))

    for _ in range(max_generations):
        F_values = F(translateDNA(population))

        # something about plotting
        if 'sca' in globals():
            sca.remove()
        sca = plt.scatter(translateDNA(population), F_values, s=100, lw=0, c='red', alpha=0.5)
        plt.pause(0.01)

        # Step2: compute fitness value
        fitness = get_fitness(F_values)
        best_id = np.argmax(fitness)
        print("Most fitted DNA: {}, x: {}, max_value: {}".format(population[best_id],
                                                                 translateDNA(population[best_id]),
                                                                 F(translateDNA(population[best_id]))))
        # Step3: selection
        population = selection(population, fitness)
        population_copy = population.copy()
        for parent in population:
            # Step4: crossover
            child = crossover(parent, population_copy)
            # Step5: mutation
            child = mutation(child)
            parent[:] = child   # parent is replaced by its child

    plt.ioff()
    plt.show()

  得到的最优解如下:

Most fitted DNA: [1 1 0 1 0 1 0 1 0 1], x: 4.16911045943304, max_value: 5.738744982619388

  模拟过程如下:

智能算法系列之遗传算法

代码仓库:IALib[GitHub]

  本篇代码已同步至【智能算法(Python复现)】专栏专属仓库:IALib
  运行IALib库中的GA算法:文章来源地址https://www.toymoban.com/news/detail-405819.html

git clone git@github.com:xiayouran/IALib.git
cd examples
python main.py -algo ga

到了这里,关于智能算法系列之遗传算法的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 【人工智能】—局部搜索算法、爬山法、模拟退火、局部剪枝、遗传算法

    在某些规模太大的问题状态空间内,A*往往不够用 问题空间太大了 无法访问 f 小于最优的所有状态 通常,甚至无法储存整个边缘队列 解决方案 设计选择更好的启发式函数 Greedy hill-climbing (fringe size = 1) Beam search (limited fringe size) 瓶颈:内存不足,无法存储整个边缘队列 爬山搜

    2023年04月22日
    浏览(53)
  • 人工智能导论——遗传算法求解TSP问题实验

    一、实验目的: 熟悉和掌握遗传算法的原理、流程和编码策略,并利用遗传算法求解组合优化问题,理解求解TSP问题的流程并测试主要参数对结果的影响。 二、实验原理: 旅行商问题,即TSP问题(Traveling Salesman Problem)是数学领域中著名问题之一。假设有一个旅行商人要拜

    2023年04月13日
    浏览(45)
  • (转载)MATLAB智能算法30个案例分析(1)——遗传算法工具箱

            以下内容大部分来源于《MATLAB智能算法30个案例分析》,仅为学习交流所用。         遗传算法(genetic algorithm,GA)是一种进化算法,其基本原理是仿效生物界中的“物竞天择、适者生存”的演化法则。遗传算法是把问题参数编码为染色体,再利用迭代的方式进行选

    2024年02月05日
    浏览(64)
  • 人工智能原理实验4(1)——遗传算法、蚁群算法求解TSP问题

    TSP问题是组合数学中一个古老而又困难的问题,也是一个典型的组合优化问题,现已归入NP完备问题类。NP问题用穷举法不能在有效时间内求解,所以只能使用启发式搜索。遗传算法是求解此类问题比较实用、有效的方法之一。下面给出30个城市的位置信息: 应用遗传算法和蚁

    2024年01月24日
    浏览(58)
  • ChatGPT助力ModStartBlog,博客写作更智能

    ModStartBlog v7.1.0,ChatGPT 支持、界面全新优化 在数字化时代,博客已经成为人们分享知识、表达观点和建立个人品牌的重要工具。ModStartBlog是一款流行的博客平台,其最新的版本v7.1.0不仅增加了ChatGPT支持,还对界面进行了全新优化,为用户提供更加便捷、流畅的博客写作和阅

    2024年02月12日
    浏览(38)
  • 基于遗传算法的智能家居安全系统:如何检测和响应恶意攻击?

    作者:禅与计算机程序设计艺术 1.1. 背景介绍 随着物联网技术的发展,智能家居安全问题日益凸显。智能家居系统由多个模块组成,包括传感器、控制中心、执行器等。这些模块的协同工作使得人们生活更加便捷,但也为攻击者提供了可乘之机。为了提高智能家居系统的安全

    2024年02月07日
    浏览(49)
  • 读十堂极简人工智能课笔记03_遗传算法与进化

    1.1.3.1. 创造一批能游泳、走路、跳跃,甚至互相竞争的虚拟动物震惊了整个科学界 1.1.3.2. 它们的人工大脑却是个极其复杂的网络,信息经由传感器的输入,经过大量的数学函数计算和操作,才能产生那些看起来很聪明的动作和表现 1.1.4.1. 他并没有设计这些动物 1.1.4.2. 他并

    2024年02月19日
    浏览(49)
  • 【人工智能】实验四:遗传算法求函数最大值实验与基础知识

    实验目的 熟悉和掌握遗传算法的原理、流程和编码策略,并利用遗传算法求解函数优化问题,理解求解流程并测试主要参数对结果的影响。 实验内容 采用遗传算法求解函数最大值。 实验要求 1. 用遗传算法求解下列函数的最大值,设定求解精度到15位小数。 (1)给出适应度

    2024年02月03日
    浏览(72)
  • Daftart.ai:人工智能专辑封面生成器

    前言          Daft Art AI是一款使用人工智能技术来帮助您制作专辑封面的软件,它可以让您在几分钟内,用简单的编辑器和精选的美学风格,为您的专辑或歌曲创建出惊艳的高质量的艺术品。Daft Art AI有以下几个特点:简单易用:您只需要输入您的专辑或歌曲的名称,就

    2024年02月04日
    浏览(57)
  • ChatGPT探索系列之五:讨论人工智能伦理问题及ChatGPT的责任

    ChatGPT发展到目前,其实网上已经有大量资料了,博主做个收口,会出一个ChatGPT探索系列的文章,帮助大家深入了解ChatGPT的。整个系列文章会按照一下目标来完成: 理解ChatGPT的背景和应用领域; 学习GPT模型系列的发展历程和原理; 探究ChatGPT的训练、优化和应用方法; 分析

    2024年02月03日
    浏览(59)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包