总起

文章中的源码可以在 GitHub - anguangzhihen/PythonTest 中的EvoGATest.py找到。

进化算法(EA)是从达尔文的自然选择理论和现代分子遗传学获得灵感而发展出来的算法。

使用进化算法的动机之一是它能提供一套具有鲁棒问题求解的算法,它已在大学课程编排、卫星天线吊杆设计、银行贷款建模、股票的交易模型取得一定的成果。

所有进化算法都基于同一基本理念:由个体组成的种群在有限资源环境中,对资源的竞争导致自然选择现象的产生。

特点:

1.基于种群运行的;

2.多数进化算法采用重组操作算子;

3.进化算法是随机的。

组成:

1.问题表示;

2.评估函数;

3.种群;

4.父代选择机制;

5.变异操作算子,包括重组和突变;

6.生存选择机制。

进化算法的主要种类:

1.遗传算法(GA),应用最为广泛,被视为一种函数优化方法,SGA是进化算法的果蝇:采用二进制进行表示、适应度比例机制的选择操作算子、较低概率的突变操作算子、强调以生物遗传机制启发机理的重组操作算子;

2.进化策略(ES),采用实数进行表示,选择压力通常会非常高,最新的CMA算法是优化复杂实值函数的主要流行算法之一;

3.进化规划(EP),无重组操作,经典的EP算法采用状态机表示个体,现在多使用实数;

4.遗传规划(GP),以树为染色体,可定位为通过自然选择进行计算机编程,低或零突变概率;

5.学习分类器系统(LCS),通过基于规则集方式对知识表征;

6.差分进化(DE),对进化算法中常见的复制操作算子进行了“扭曲”,即得到所谓的差分突变;

7.粒子群优化(PSO),使用向量加法进行定义的突变操作算子;

8.分布估计算法(EDA),通过3步过程采用“标准”变异操作替代新子代创建。

在游戏内容的生成上,这类基于搜索方法(进化算法是其中最重要的算法之一)具有广泛的适用性,缺点是速度非常慢,然后在设计具体的搜索算法、表示以及评估函数的时候,各个成功的方法需要依靠明智的设计选择。

遗传算法实现

在上一节中,我们大概介绍了一下进化算法,本节我们将实现一下进化算法中一个简单的遗传算法。

首先我们描述一下问题:有函数y = x^2,从5位二进制编码中寻找使y最大。当然我们一眼就能看出来问题的答案是 x = 0b11111,即31,通过这个简单问题,我们能大概理解进化算法的原理。

接着我们来看一下整个算法的基本循环:

# 初始化种群,从[0, MAX_X]中随机选出
pop = np.random.randint(1, size = POP_SIZE)
for i in range(N_GENERATIONS):# 获取适应度fitness = getFitness(pop)# 父代选择pop = select(pop, fitness)popCopy = pop.copy()for popIndex in range(len(pop)):parent = pop[popIndex]# 重组,使用单点交叉child = crossover(parent, popCopy)# 突变,使用位翻转child = mutate(child)# 生存选择,使用基于年龄的替代策略,但父代和子代数量相同,所以将所有子代替换成父代pop[popIndex] = child

最后实现具体的函数即可:

# 获取适应度
def getFitness(pred):return pred + 1e-3# 选择父代,使用适合比例选择(FPS)机制
def select(pop, fitness):return np.random.choice(pop, size = POP_SIZE, replace = True, p = fitness / fitness.sum())# 重组
def crossover(parent, pop):# 选择一个交叉的个体other = np.random.choice(pop)# 选择交叉点point = np.random.randint(1, DNA_SIZE - 1)cross = [fillBits(point), fillBits(point) ^ MAX_X]np.random.shuffle(cross)return (parent & cross[0]) + (other & cross[1])# 突变(本问题中可以使用格雷码以保证连续整数在二进制变化中的汉明距离也为1)
def mutate(child):for i in range(DNA_SIZE):# 获得突变位置point = 1 << iif np.random.rand() < MUTATION_RATE:child = child ^ pointreturn child

运行看一下效果:

虽然选到了最高的点,不过整个算法看起来像是在随机运行。

这里存在两个问题:

1.突变概率太大造成了对优良解的破坏;

2.选择父代时,使用FPS机制导致个体合适度彼此接近时几乎没有选择压力;

处理方式:

1.我们可以将突变概率设置为1%(原为10%);

2.我们在计算适应度时可以减去当前最小的适应度扩大选择压力;

最终效果:

参考

【莫烦Python】进化算法 Evolutionary Algorithms_哔哩哔哩_bilibili

《进化计算导论》

《人工智能与游戏》

Python 进化算法的简单介绍和实现相关推荐

  1. 教学优化算法的简单介绍

    目录 摘要 背景 算法 学生初始化 教学阶段 学习阶段 流程总结 优缺点 优点 缺点 一些改进 总结 参考文献 摘要 教学优化算法(Teaching-learning-based optimizati ...

  2. php枚举属于什么类型,python枚举类型是什么?python枚举类型的简单介绍

    本篇文章给大家带来的内容是关于python枚举类型是什么?python枚举类型的简单介绍,有一定的参考价值,有需要的朋友可以参考一下,希望对你有所帮助. 一:枚举类型的定义 二:枚举类和普通类的区别 ...

  3. Python 快速排序算法【简单易懂,代码直接运行】

    Python 快速排序算法[简单易懂,代码直接运行] 给定你一个长度为 n 的整数数列. 请你使用快速排序对这个数列按照从小到大进行排序. 并将排好序的数列按顺序输出. 输入格式 输入共两行,第一行包 ...

  4. 遗传算法 python 简书_基于DEAP库的Python进化算法从入门到入土—(二)简单遗传算法实现...

    前言 在上一篇中,我们已经介绍了如何在DEAP中实现进化算法的基本操作,在这一篇中我们试图将各个操作组装起来,用进化算法解决一个简单的一元函数寻优问题. 进化算法实例 - 一元函数寻优 问题描述与分析 ...

  5. Python A*算法的简单实现

    总起 A*算法常用于游戏的寻路中,用于求解静态路网中的最短路径,是最有效的直接搜索方法. 这次正好花了几天时间学习了一下Python,便拿这个算法做了一下练习.这篇文章也会对其思路做一个简单介绍. 文 ...

  6. 进化算法框架的介绍及Matlab实现(遗传算法)

    进化算法介绍及实现(遗传算法) 进化算法也可以称为遗传算法.进化算法的求解过程是模拟大自然生物进化的过程,通过"适者生存,劣者 淘汰"的规则不断进化,直到找到最优解或者达到终止条件 ...

  7. [python+nltk] 自然语言处理简单介绍和NLTK坏境配置及入门知识(一)

    本文主要是总结最近学习的论文.书籍相关知识,主要是Natural Language Pracessing(自然语言处理,简称NLP)和Python挖掘维基百科Infobox等内容的知识.此篇文章主要参 ...

  8. python网站设计理念_简单介绍下python Django框架的历史,设计理念及优势_Django讲解2...

    简单介绍下python Django框架的历史,设计理念及优势 Django是一个高层次的 Python Web 框架,它是一个鼓励快速开发和干净,实用的框架设计.Django可以更容易地快速构建更好 ...

  9. python路线寻优_基于DEAP库的Python进化算法从入门到入土 --(四)遗传算法的改进...

    前言 前面一节我们尝试了用GA求解TSP问题,简单遗传算法总是不能很好收敛到一个较优的解,在用时和求解精度上都被贪心算法吊打.在末尾我们总结了三个可能的改进方向,这次我们想要沿着这三个方向试着改进简单 ...

  10. 利用Python进行数据分析(1) 简单介绍

    一.处理数据的基本内容 数据分析 是指对数据进行控制.处理.整理.分析的过程. 在这里,"数据"是指结构化的数据,例如:记录.多维数组.Excel 里的数据.关系型数据库中的数据. ...

最新文章

  1. Load和Initialize往死了问是一种怎样的体验?
  2. Paypal IPN
  3. LA3989女士的选择
  4. 新DNS木马可感染整个局域网内计算机
  5. rs.Open SQL,Conn,adOpenStatic,adLockOptimistic
  6. 152. Leetcode 剑指 Offer 14- II. 剪绳子 II (贪心算法-基础题目)
  7. flink 异步io使用
  8. selenium启动firefox时加载扩展
  9. 学平面设计,你必须知道这些提供素材和灵感的地方!
  10. MS SQL开发经典
  11. mysql explain ref const_MySQL EXPLAIN 详解
  12. python中pip有啥用_python的pip有什么用
  13. JavaWeb(二)框架搭建篇
  14. 首批企业入驻“一县一店”:多元化方式助力农产外销
  15. Pipeline流水线及分布式流水线发布PHP项目及JAVA项目
  16. 苹果发布黄色版 iPhone 14,定价 5999 元起;大神李沐被曝离职投身大模型创业;Atlassian 裁员 |极客头条
  17. 坚果云 我的电脑图标_如何删除我的电脑里的坚果云文件夹
  18. 局域网 git服务器 虚拟机,centos71虚拟机搭建git服务器
  19. HTML初识:网页结构、标签、特殊符号、列表
  20. dowhile实现求水仙花数

热门文章

  1. 会议安排(经典贪心算法例题)
  2. 【操作系统原理-陈渝老师】第十二章 文件系统
  3. MRI T1加权结构
  4. linux直接点击iso安装win10,iso安装win10,win10iso直接解压安装
  5. gatk过滤_「简化基因组」如何过滤用GATK分析得到的SNP
  6. 计算机应用基础南丁格尔,关于单元基础训练的习题
  7. 牛客练习赛41:球的体积并【球缺】
  8. 利用ACC控制酷狗音乐
  9. 学C语言的大佬们帮帮小弟吧小弟感激不尽
  10. itext合并两个PDF流