遗传算法Python实现

  • 一、GA算法介绍
  • 二、GA算法流程
  • 三、Python实现
  • 四、优缺点及应用
    • 1、不足之处
    • 2、特点
    • 3、应用

一、GA算法介绍

  遗传算法(Genetic Algorithm,GA)最早是由美国的 John holland于20世纪70年代提出,该算法是根据大自然中生物体进化规律而设计提出的。是模拟达尔文生物进化论的自然选择和遗传学机理的生物进化过程的计算模型,是一种通过模拟自然进化过程搜索最优解的方法。该算法通过数学的方式,利用计算机仿真运算,将问题的求解过程转换成类似生物进化中的染色体基因的交叉、变异等过程。在求解较为复杂的组合优化问题时,相对一些常规的优化算法,通常能够较快地获得较好的优化结果。遗传算法已被人们广泛地应用于组合优化、机器学习、信号处理、自适应控制和人工生命等领域。

二、GA算法流程

  遗传算法的基本运算过程如下:

  1. 初始化:设置进化代数计数器t=0,设置最大进化代数T,随机生成M个个体作为初始群体P(0)。
  2. 个体评价:计算群体P(t)中各个个体的适应度。
  3. 选择运算:将选择算子作用于群体。选择的目的是把优化的个体直接遗传到下一代或通过配对交叉产生新的个体再遗传到下一代。选择操作是建立在群体中个体的适应度评估基础上的。
  4. 交叉运算:将交叉算子作用于群体。遗传算法中起核心作用的就是交叉算子
  5. 变异运算:将变异算子作用于群体。即是对群体中的个体串的某些基因座上的基因值作变动。群体P(t)经过选择、交叉、变异运算之后得到下一代群体P(t+1)。
  6. 终止条件判断:若t=T,则以进化过程中所得到的具有最大适应度个体作为最优解输出,终止计算。

  遗传操作包括以下三个基本遗传算子(genetic operator):选择(selection);交叉(crossover);变异(mutation)。

三、Python实现

import random
import numpy as npdef log(i, a, b):print("epoch --> ",str(i + 1).rjust(5, " "), " max:",str(round(a, 4)).rjust(8, " "), "mean:",str(round(b, 4)).rjust(8, " "), "alpha:",str(round(a / b, 4)).rjust(8, " "))class GeneSolve:
## 初始定义,后续引用GeneSolve类方法为(初始种群数,最大迭代数,交叉概率,变异概率,最大适应度/平均适应度(扰动率趋于平稳则越接近1越好))def __init__(self, pop_size, epoch, cross_prob, mutate_prob, alpha, print_batch=10):self.pop_size = pop_sizeself.epoch = epochself.cross_prob = cross_probself.mutate_prob = mutate_probself.print_batch = print_batchself.alpha = alphaself.width = 11self.best = None# 产生初始种群self.genes = np.array([''.join([random.choice(['0', '1']) for i in range(self.width)]) for j in range(self.pop_size)])def inter_cross(self):"""对染色体进行交叉操作"""ready_index = list(range(self.pop_size))while len(ready_index) >= 2:d1 = random.choice(ready_index)ready_index.remove(d1)d2 = random.choice(ready_index)ready_index.remove(d2)if np.random.uniform(0, 1) <= self.cross_prob:loc = random.choice(range(1, self.width - 1))d1_a, d1_b = self.genes[d1][0:loc], self.genes[d1][loc:]d2_a, d2_b = self.genes[d2][0:loc], self.genes[d2][loc:]self.genes[d1] = d1_a + d2_bself.genes[d2] = d2_a + d1_bdef mutate(self):"""基因突变"""ready_index = list(range(self.pop_size))for i in ready_index:if np.random.uniform(0, 1) <= self.mutate_prob:loc = random.choice(range(0, self.width))t0 = list(self.genes[i])t0[loc] = str(1 - int(self.genes[i][loc]))self.genes[i] = ''.join(t0)def get_adjust(self):"""计算适应度(只有在计算适应度的时候要反函数,其余过程全都是随机的二进制编码)"""x = self.get_decode()return x * np.sin(x) + 12def get_decode(self):"""编码,从表现型到基因型的映射"""# 编码其中int(x,2)表示讲x换为二进制编码,12.55则为区间[0,12.55]的delta,2**11则为2^11 这里的11则是编码长度(也就是转换的精度)# 求解精度为10^-2,即将一个单位长度(这里是12.55划分成1255份)进行划分,由于2^10 = 1024 < 2^11 = 2048,于是编码长度选取为11return np.array([int(x,2) * 12.55 / (2 ** 12 - 1) for x in self.genes])def cycle_select(self):"""通过轮盘赌来进行选择"""adjusts = self.get_adjust()if self.best is None or np.max(adjusts) > self.best[1]:self.best = self.genes[np.argmax(adjusts)], np.max(adjusts)p = adjusts / np.sum(adjusts)cu_p = []for i in range(self.pop_size):cu_p.append(np.sum(p[0:i]))cu_p = np.array(cu_p)r0 = np.random.uniform(0, 1, self.pop_size)sel = [max(list(np.where(r > cu_p)[0]) + [0]) for r in r0]# 保留最优的个体if np.max(adjusts[sel]) < self.best[1]:self.genes[sel[np.argmin(adjusts[sel])]] = self.best[0]self.genes = self.genes[sel]def evolve(self):"""逐代演化"""for i in range(self.epoch):self.cycle_select()  #种群选取self.inter_cross()   #染色体交叉self.mutate()        #计算适应度a, b = np.max(gs.get_adjust()), np.mean(gs.get_adjust())if i % self.print_batch == self.print_batch - 1 or i == 0:log(i, a, b)if a / b < self.alpha:log(i, a, b)print("进化终止,算法已收敛!共进化 ", i + 1, " 代!")break

  代码流程图:

四、优缺点及应用

1、不足之处

  1. 编码不规范及编码存在表示的不准确性。
  2. 单一的遗传算法编码不能全面地将优化问题的约束表示出来。考虑约束的一个方法就是对不可行解采用阈值,这样,计算的时间必然增加。
  3. 遗传算法通常的效率比其他传统的优化方法低。
  4. 遗传算法容易过早收敛。
  5. 遗传算法对算法的精度、可行度、计算复杂性等方面,还没有有效的定量分析方法。

2、特点

  1. 算法从问题解的串集开始搜索,而不是从单个解开始。这是遗传算法与传统优化算法的极大区别。传统优化算法是从单个初始值迭代求最优解的;容易误入局部最优解。遗传算法从串集开始搜索,覆盖面大,利于全局择优。
  2. 遗传算法同时处理群体中的多个个体,即对搜索空间中的多个解进行评估,减少了陷入局部最优解的风险,同时算法本身易于实现并行化。
  3. 遗传算法基本上不用搜索空间的知识或其它辅助信息,而仅用适应度函数值来评估个体,在此基础上进行遗传操作。适应度函数不仅不受连续可微的约束,而且其定义域可以任意设定。这一特点使得遗传算法的应用范围大大扩展。
  4. 遗传算法不是采用确定性规则,而是采用概率的变迁规则来指导他的搜索方向。
  5. 具有自组织、自适应和自学习性。遗传算法利用进化过程获得的信息自行组织搜索时,适应度大的个体具有较高的生存概率,并获得更适应环境的基因结构。
  6. 此外,算法本身也可以采用动态自适应技术,在进化过程中自动调整算法控制参数和编码精度,比如使用模糊自适应法。

3、应用

1. 函数优化
  函数优化是遗传算法的经典应用领域,也是遗传算法进行性能评价的常用算例,许多人构造出了各种各样复杂形式的测试函数:连续函数和离散函数、凸函数和凹函数、低维函数和高维函数、单峰函数和多峰函数等。对于一些非线性、多模型、多目标的函数优化问题,用其它优化方法较难求解,而遗传算法可以方便的得到较好的结果。

2. 组合优化
  随着问题规模的增大,组合优化问题的搜索空间也急剧增大,有时在计算上用枚举法很难求出最优解。对这类复杂的问题,人们已经意识到应把主要精力放在寻求满意解上,而遗传算法是寻求这种满意解的最佳工具之一。实践证明,遗传算法对于组合优化中的NP问题非常有效。例如遗传算法已经在求解旅行商问题、 背包问题、装箱问题、图形划分问题等方面得到成功的应用
此外,GA也在生产调度问题、自动控制、机器人学、图象处理、人工生命、遗传编码和机器学习等方面获得了广泛的运用。

3. 车间调度
  车间调度问题是一个典型的NP-Hard问题,遗传算法作为一种经典的智能算法广泛用于车间调度中,很多学者都致力于用遗传算法解决车间调度问题,现今也取得了十分丰硕的成果。从最初的传统车间调度(JSP)问题到柔性作业车间调度问题(FJSP),遗传算法都有优异的表现,在很多算例中都得到了最优或近优解。

遗传算法Python实现(Genetic Algorithm,GA)相关推荐

  1. 遗传算法(Genetic Algorithm,GA)实现数据排序,python

    遗传算法(Genetic Algorithm,GA)实现数据排序,python 遗传算法是一种比较广泛.通用的算法体系,为了说明遗传算法的原理和实现,现在用GA解决一个计算机科学最基本.最古老的问题: ...

  2. uniform crossover(均匀交叉),遗传算法(Genetic Algorithm,GA),python

    uniform crossover(均匀交叉),遗传算法(Genetic Algorithm,GA),python 假设有双亲p1和p2的二进制基因染色体表达,子代的基因以等概率(50%)来自双亲中之 ...

  3. 遗传算法 python 简书_遗传算法(Genetic Algorithm ,GA)学习笔记

    1 遗传算法的概念 1.1 遗传算法的科学定义 遗传算法(Genetic Algorithm, GA) 是模拟达尔文生物进化论的自然选择和遗传学机理的生物进化过程的计算模型,是一种通过模拟自然进化过程 ...

  4. 优化算法之遗传算法(Genetic Algorithm, GA)

    目录 概述 相关术语 遗传算法的实现过程 遗传算法的一般步骤 代码描述 解码 相关问题 适应度函数 选择函数 小问题: 交叉.变异 相关问题 完整代码 疑惑点(感谢大佬解答) 个人修改代码(类形式) ...

  5. 路径算法:遗传算法 (Genetic Algorithm, GA)

    遗传算法简介 遗传算法是受自然进化理论启发的一系列搜索算法.通过模仿自然选择和繁殖的过程,遗传算法可以为涉及搜索,优化和学习的各种问题提供高质量的解决方案.同时,它们类似于自然进化,因此可以克服传统搜 ...

  6. (二)遗传算法(Genetic Algorithm, GA)流程

    (二)遗传算法(Genetic Algorithm, GA)流程 1. 遗传算法流程 2. 关键参数说明 1. 遗传算法流程   一点说明:   在遗传算法中,将nnn维决策向量X\bf{X}X=[x ...

  7. 第九课 遗传算法( Genetic Algorithm, GA)

    遗传算法概述 遗传算法( Genetic Algorithm, GA) 是一种进化算法, 其基本原理是仿效生物界中的"物竞天择. 适者生存" 的演化法则, 它最初由美国Michig ...

  8. 遗传算法(Genetic Algorithm,GA)-基于MATLAB环境实现

    1.GA简介 genetic algorithm,美国Holland教授创立,基于达尔文进化论和孟德尔的遗传学说.遗传算法类比了生物界中自然选择.交叉.变异等自然进化方式,利用数码串类比染色体,通过选 ...

  9. 智能优化算法之遗传算法python实现细节,GA库函数调用方法

    1.基本概念 遗传算法(GA)是最早由美国Holland教授提出的一种基于自然界的"适者生存,优胜劣汰"基本法则的智能搜索算法.该法则很好地诠释了生物进化的自然选择过程.遗传算法也 ...

最新文章

  1. mysql实现pr曲线_ROC 曲线与 PR 曲线
  2. 宏基因组合种树,2-4天领证
  3. AQS理解之七——AQS中的条件队列
  4. 主键与聚集索引的区别
  5. 路透社2017年度最佳图片,向你展示地球过去的一年
  6. 阿里云黄海宇:窄带高清2.0——让直播更惊艳的魔术
  7. 目标检测之Mtcnn网络详解(人脸检测)
  8. mysql优化教程_Mysql优化一
  9. Android SharedPreferences数据库
  10. 怎么判断间隙过渡过盈配合_圆柱销有2个标准,选型注意材料和热处理,特别是销孔的配合关系...
  11. idea 新建的java项目没发run_IntelliJ IDEA 如何创建一个普通的java项目,及创建java文件并运行...
  12. Learning Modality-Specific Representation with Self-Supervised Mulit-Task Learning for MSA
  13. php 调用mp3,使用PHP合并MP3文件的类,兼容php4、php5(2)
  14. int 和 Integer 有什么区别
  15. 墨者靶场:SQL手工注入漏洞测试(MySQL数据库)
  16. 云服务器-异地部署集群服务-Kubernetes(K8S)-网络篇
  17. 直播平台录播系统架构
  18. 用GIF图片来告诉大家程序猿的真实生活 ————“你熬了一整夜、耗了一整天,开始调试代码时:” 那张最有感觉了,你们感受一下。。。
  19. Unity+Vuforia+Hololens2 AR开发
  20. 《西线无战事》我们才刚开始热爱生活,却不得不对一切开炮

热门文章

  1. 甜甜圈(树状数组)(线段树)
  2. Android RecyclerView TV-滑动选中态背景
  3. 学半年编程才知道 “面向对象” 可以这样理解
  4. JQuery实现复制数据到剪贴板之各种麻花与右键点击弹出选择菜单
  5. 深圳索尼激光工程投影机案例
  6. CISCO认证考试科目集合
  7. ubuntu 的firefox 下载速度慢
  8. 人员离职it检查_it员工辞职申请书
  9. 如何操作才能使照片拉伸不变形
  10. Palo Alto FW nat 配置