遗传算法(Genetic Algorithms)也是受自然科学的启发。该类算法的运行过程是先随机生成一组解,称之为种群(population)。在优化过程中的每一步,算法会计算整个种群的成本函数,从而得到一个有关题解的有序列表

其三个主要特性在于:

  • selection,crossover,mutation

在对题解进行排序之后,一个新的种群——我们称之为下一代——被创建出来了。首先,我们将当前种群中位于最顶端的题解加入其所在的新种群中。我们称这一过程为精英选拔(elitism)。新种群的余下部分是由修改最优解后形成的全新解所组成的。

有两种修改题解的方法。

  • (1)较为简单的一种称为变异(mutation),其通常的做法是对一个既有解进行微小的、简单的、随机的改变。

  • (2)另一种方法称为交叉(crossover)或配对(breeding)。这种方法是选取最优解中的两个解,然后将它们按照方式结合。

算法设计中可能涉及的参数主要有,

  • (1)popsize:种群大小
  • (2)mutprob:种群的新成员由变异而非交叉得来的概率
  • (3)elite:种群中被认为是最优解且被允许传递到下一代的比例
  • (4)maxiter:需要运行多少代

遗传算法的程序还是比较好写的,因为流程非常固定;

def geneticalgo(domains, costf, popsize=100, mutprob=.2, elite=.2, maxiter=100):def mutable(c):i = random.randint(0, len(domains)-1)if random.random() < 0.5 and c[i] > domains[i][0]:c[i] -= 1elif c[i] < domains[i][1]:c[i] += 1return cdef crossover(r1, r2):i = random.randint(1, len(domains)-2)return r1[:i] + r2[i:]pop = []for i in range(popsize):r = [random.randint(domains[i][0], domains[i][1]) for i range(len(domains))]pop.append(r)topelite = int(popsize*elite)for i in range(maxiter):scores = [(costf(r), r) for r in pop]scores.sort()randked = [v for c, v in scores]pop = ranked[:topelite]while (len(pop) < popsize):if random.random() < mutprob:r = random.randint(0, topelite-1)pop.append(mutable(pop[r]))else:c1 = random.randint(0, topelite-1)c2 = random.randint(0, topelite-1)pop.append(crossover(pop[c1], pop[c2]))print(scores[0][1])return scores[0][0]

机器学习基础(四十六)—— 遗传算法(GA)相关推荐

  1. 机器学习基础(十六)—— bootstrap

    bootstrap:抽出来.记录下来.放回去 bootstrapping:一个统计工具,对同一份数据集,进行不同的重采样(re-sample)以模拟不同的数据集出来,避免了 cross-validat ...

  2. [系统安全] 四十六.Powershell恶意代码检测系列 (1)Powershell基础入门及管道和变量的用法

    您可能之前看到过我写的类似文章,为什么还要重复撰写呢?只是想更好地帮助初学者了解病毒逆向分析和系统安全,更加成体系且不破坏之前的系列.因此,我重新开设了这个专栏,准备系统整理和深入学习系统安全.逆向分 ...

  3. Python编程基础:第四十六节 super函数Super Function

    第四十六节 super函数Super Function 前言 实践 前言 使用super函数可以在子类中直接调用父类的方法.通常情况下,我们会将一些通用的属性或方法定义在父类中,子类可以直接使用父类中 ...

  4. 【零基础学Java】—throw关键字(四十六)

    [零基础学Java]-throw关键字(四十六) 一.throw关键字 public class demo {public static void main(String[] args) {//创建i ...

  5. oracle过滤器基础,Oracle培训(四十六)——Servlet第六章知识点总结——过滤器编程...

    Oracle培训(四十六)--Servlet第六章知识点总结--过滤器编程 目标 编写一个过滤器 部署一个过滤器 了解请求和响应包装器 在请求分发器下的过滤器 知识点预览 过滤器 过滤器 1. 什么是 ...

  6. pdfstamper生成pdf无法显示汉字_正点原子STM32F4/F7水星开发板资料连载第四十六章 汉字显示实验...

    1)实验平台:正点原子水星 STM32F4/F7 开发板 2)摘自<STM32F7 开发指南(HAL 库版)>关注官方微信号公众号,获取更多资料:正点原子 3)全套实验源码+手册+视频下载 ...

  7. Linux性能优化实战学习笔记:第四十六讲=====实战分析

    Linux性能优化实战学习笔记:第四十六讲 一.上节回顾 不知不觉,我们已经学完了整个专栏的四大基础模块,即 CPU.内存.文件系统和磁盘 I/O.以及网络的性能分析和优化.相信你已经掌握了这些基础模 ...

  8. 四十六、Fluent壁面函数的选取依据

    1. Fluent壁面函数 前面介绍了壁面函数的由来及相关的理论,这里我们介绍Fluent中壁面函数的选取依据.牢记:使用壁面函数的前提是y+>15 Fluent在两种湍流模型中需要选择壁面函数 ...

  9. 【正点原子STM32连载】第四十六章 FATFS实验 摘自【正点原子】MiniPro STM32H750 开发指南_V1.1

    1)实验平台:正点原子MiniPro H750开发板 2)平台购买地址:https://detail.tmall.com/item.htm?id=677017430560 3)全套实验源码+手册+视频 ...

  10. 【Visual C++】游戏开发笔记四十六 浅墨DirectX教程十四 模板测试与镜面特效专场

    本系列文章由zhmxy555(毛星云)编写,转载请注明出处.   文章链接: http://blog.csdn.net/zhmxy555/article/details/8632184 作者:毛星云( ...

最新文章

  1. 华为的发展与管理浅析
  2. 一组图诠释CNN及RNN的区别
  3. chrome Native Client 让你可以使用 C 以及 C++ 语言开发 Web 应用
  4. c++模板之函数模板
  5. 插入ASP代码让网站数据库成为ASP木马
  6. jQuery必知要点(一)
  7. BigTable的开源实现:HBase数据库
  8. rabbitmq基于http的认证和授权
  9. Context Menu控件
  10. 联发科四核处理器MT6589详细芯片参数介绍
  11. ftp上传软件,推荐5款好用的ftp上传软件
  12. 计算机开机显示器不亮,电脑开机显示器不亮,小编教你电脑显示器不亮怎么解决...
  13. android 获取画布,Android触摸事件如何实现笔触画布详解
  14. 【压缩感知合集8】MP算法(算法实现、收敛讨论以及问题分析)
  15. orc识别较慢_提高OCR识别效率的诀窍
  16. uni-app动态设置原生标题左侧按钮
  17. 【keepass】每次打开软件总是弹出指定的文件不存在,如何关闭和清除以前打开数据库的文件记录?
  18. 不同鸟的叫声Java编程_飞扬小鸟java版(3种版本一次下载)
  19. 共享内存映射之mmap()函数详解
  20. 任意长度的python列表_任意长度的Python列表、元组和字符串中最后一个元素的索引为...

热门文章

  1. 【每日一题】Leetcode 刷题 二叉树-树的遍历 介绍
  2. mysql备份-a是什么_MySQL主从备份和主主备份配置+Keepalived+MySQL读写分离
  3. redis的发布和订阅模式
  4. ubantu 黑屏_死机黑屏专题上线啦,早鸟只要299,看完薪水翻一番
  5. python门牌制作
  6. Tensorflow——Tensorboard可视化
  7. Gstreamer——搭建RTSP服务器
  8. 将数据集转换为Excel格式的一个实现
  9. ashx实现ajax功能遇到的浏览器缓存问题
  10. 在服务中创建用户进程的方法(C#版)