《基于Java实现的遗传算法》笔记(7 / 7):个人总结

文章目录

  • 为何采用遗传算法
  • 哪些问题适合用遗传算法解决
  • 遗传算法基本术语
  • 一般遗传算法的过程
  • 基本遗传算法的伪代码

为何采用遗传算法

遗传算法是机器学习的子集。在实践中,遗传算法通常不是用来解决单一的、特定问题的最好算法。对任何一个问题,几乎总有更好的、更有针对性的解决方案!那么何必麻烦呢?

遗传算法是一个极好的多用途工具,可以应用于许多不同类型的问题。这是瑞士军刀与合适的螺丝刀之间的差异。如果任务是拧紧300颗螺丝,你会跳起来找螺丝刀。但如果任务是拧几颗螺丝、割开一些布、在皮革上打一个孔,然后打开一瓶冰苏打水奖励自己的努力工作,那么瑞士军刀是更好的选择。

此外,遗传算法是整体研究机器学习的不错入门。如果机器学习是一座冰山,遗传算法就是尖端的一部分。遗传算法有趣、令人兴奋且充满创新。遗传算法的模型基于自然生物过程,建立了计算世界和自然世界之间的连接。编写第一个遗传算法,观看从混乱和随机中出现的惊人结果,让人叹为观止。

机器学习冰山顶端的其他研究领域也同样令人兴奋,但它们往往关注的问题更狭窄,更难以理解。遗传算法则不然,它很容易理解,是有趣的实现,它们引入了所有机器学习技术都会使用的许多概念。

哪些问题适合用遗传算法解决

下面是一个问题特征列表,这类问题是采用遗传算法的良好候选者:

  • 如果问题足够困难,难以写代码来解决;
  • 如果人不知道如何解决这个问题;
  • 如果问题是不断变化的;
  • 如果搜索每个可能解是不可行的;
  • 如果可以接受“足够好”的解。

遗传算法基本术语

遗传算法建立在生物进化的概念上的。

  • 种群:这就是一个候选解(个体)集合,可以有变异和交叉这样的遗传操作应用于它们。
  • 候选解(个体):给定问题的一个可能的解。
  • 基因:组成染色体的不可分割的构建块。经典的基因包含0或1。
  • 染色体:染色体是一串基因。染色体定义了一个特定的候选解(个体)。用二进制编码一个典型的染色体可能包含“01101011”这样的内容。
  • 变异:一个过程,其中候选解中的基因被随机改变,以创建新的性状。
  • 交叉:其中染色体被组合以创建新的候选解决方案的方法。这有时称为重组。
  • 选择:这是选择的候选解,繁殖下一代解的技术。
  • 适应度:一个评分,衡量候选解适合给定问题的程度。

一般遗传算法的过程

在这里插入图片描述

  1. 遗传算法开始,初始化候选解(个体)的种群。这通常是随机提供整个搜索空间的均匀覆盖。涉及参数有种群规模。
  2. 接下来,通过为种群中的每个个体分配一个适应度值,对种群进行评估。在这个阶段,常常要注意当前最优解,以及种群的平均适应度。
  3. 评估后,根据终止条件集,该算法决定它是否应该终止搜索。通常这是因为该算法已达到指定的世代数量,或已经找到适当的解。
    1. 如果终止条件最终满足,算法会跳出循环,通常向用户返回最后的搜索结果。
    2. 一些典型的终止条件是:
      • 到达世代的最大数目;
      • 超过分配给它的时间;
      • 发现一个满足所需条件的解;
      • 该算法已经达到了一个稳定阶段。
  4. 如果终止条件不满足,种群经过一个选择阶段,基于适应度评分,从种群中选择个体。适应度越高,个体就更有机会被选择。选择目的为下一步“交叉和变异”作准备。选择方法有:
    • 轮盘赌选择(也称为适应度比例选择)。个体的适应度越高,在轮盘上占据的空间就越多,也就是选中的概率越大。(参考第2章)
    • 锦标赛选择。随机从种群中选择一些个体,进入锦标赛。以通过比较这些个体的适应度值来竞争,然后选择适应度最高的个体作为亲代。(参考第3章)
  5. 下一阶段对选择的个体应用交叉和变异。这个阶段为下一代创建新个体。如果是种群中的精英(种群中适应度最靠前的一小部分个体),直接跳过进入下一代。涉及参数有交叉率、变异率。交叉和变异后,确保仍然得到一个有效解(合格的个体)。
    1. 交叉方法有:
      • 均匀交叉(uniform crossover)。后代的每个基因都有50%的机会来自第一个亲代或其第二个亲代。(参考第2章)
      • 单点交叉。随机选择基因组中的一个位置,确定哪些基因来自于哪个亲代。交叉位置之前的遗传信息来自于亲代1,之后的遗传信息来自于亲代2。(参考第3章)
      • 排序交叉。在这种交叉方法中,第一个亲代染色体的一个子集被选中。然后该子集被添加到后代染色体的相同位置。下一步是将第二个亲代的遗传信息添加到后代的染色体中。通常从所选子集的结束位置开始,然后包括亲代2的每个基因,只要后代染色体中还没有该基因。(参考第4章)
  6. 此时新种群返回到评估步骤(步骤2),过程重新开始。我们称这种循环的每一圈为一个世代。

基本遗传算法的伪代码

generation = 0;
population[generation] = initializePopulation(populationSize);
evaluatePopulation(population[generation]);
while isTerminationConditionMet() == false doparents = selectParents(population[generation]);population[generation+1] = crossover(parents);population[generation+1] = mutate(population[generation+1]);evaluatePopulation(population[generation]);generation++;
End loop;

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/445583.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

单链表不带头标准c语言实现

链表是一种物理存储单元上非连续、非顺序的存储结构,数据元素的逻辑顺序是通过链表中的指针链接次序实现的。链表由一系列结点(链表中每一个元素称为结点)组成,结点可以在运行时动态生成。每个结点包括两个部分:一个是…

Java设计模式(4 / 23):单例模式

文章目录单例模式的应用场景饿汉式单例模式懒汉式单例模式改进:synchronized改进:双重检查锁改进:静态内部类破坏单例用反射破坏单例用序列化破坏单例解密注册式单例模式枚举式单例模式解密容器式单例线程单例实现ThreadLocal单例模式小结参考…

约瑟夫环-(数组、循环链表、数学)

约瑟夫环(约瑟夫问题)是一个数学的应用问题:已知n个人(以编号1,2,3...n分别表示)围坐在一张圆桌周围。从编号为k的人开始报数,数到m的那个人出列;他的下一个人又从1开始报…

Ubuntu麒麟下搭建FTP服务

一.怎么搭建FTP服务: 第一步>>更新库 linuxidclinuxidc:~$ sudo apt-get update 第二步>>采用如下命令安装VSFTPD的包 linuxidclinuxidc:~$ sudo apt-get install vsftpd 第三步>>安装完成后打开 /etc/vsftpd.conf 文件,按如下所述…

《数据结构上机实验(C语言实现)》笔记(1 / 12):绪论

文章目录验证性实验求1~n的连续整数和说明放码结果常见算法时间函数的增长趋势分析说明放码结果设计性实验求素数个数说明放码结果求连续整数阶乘的和说明放码结果验证性实验 求1~n的连续整数和 说明 对于给定的正整数n,求12…n12…n12…n,采用逐个累…

线性表实现一元多项式操作

数组存放: 不需要记录幂,下标就是。 比如1,2,3,5表示12x3x^25x^3 有了思路,我们很容易定义结构 typedef struct node{float * coef;//系数数组int maxSize;//最大容量int order;//最高阶数 }Polynomial…

ubuntu下解压缩zip,tar,tar.gz和tar.bz2文件

在Linux下面如何去压缩文件或者目录呢? 在这里我们将学习zip, tar, tar.gz和tar.bz2等压缩格式的基本用法。 首先了解下Linux里面常用的压缩格式。 在我们探究这些用法之前,我想先跟大家分享一下使用不同压缩格式的经验。当然,我这里讲到的只…

《数据结构上机实验(C语言实现)》笔记(2 / 12):线性表

文章目录验证性实验实现顺序表各种基本运算的算法放码sqlist.hsqlist.cppexp2-1.cpp结果实现单链表各种基本运算的算法放码linklist.hlinklist.cppexp2-2.cpp结果实现双链表各种基本运算的算法放码dlinklist.hdlinklist.cppexp2-3.cpp结果实现循环单链表各种基本运算的算法放码…

链表排序-归并

链表排序,可以插入排序,我就不写了。 实现归并排序 归并排序(MERGE-SORT)是建立在归并操作上的一种有效的排序算法,该算法是采用分治法(Divide and Conquer)的一个非常典型的应用。将已有序的子序列合并&…

ubuntu麒麟下安装并启用搜狗输入法

1.首先打开UK软件,输入搜狗寻找搜狗拼音软件 然后下载搜狗拼音软件 接着点击启动该软件 2.点击搜狗拼音的图标,进入搜狗拼音的设置窗口 点击高级,并打开FCITX设置 加入英语输入法 3.这样就可以进行中英文切换了

线性表表示集合

集合我们高中都学过吧? 最重要的几个特点:元素不能重复、各个元素之间没有关系、没有顺序 集合内的元素可以是单元素或者是集合。 对集合的操作:交集并集差集等,还有对自身的加减等。 需要频繁的加减元素,所以顺序…

家用无线路由器购买入门指南

视频一:「白问」普通大众 买路由器关注这几个点就够了 来源 例如商品名:AC 1200M 双频 AX前缀wifi6IEEE 802.11 AX AC前缀wifi5IEEE 802.11 AC AX比AC好 1200M 理论峰值 和网速无关 商家噱头 MIMO SU-MIMO 单用户多进多出(早期&#xff…

ubuntu linux下执行.sh文件

ubuntu linux下执行.sh文件 首先,要确保这个文件的类型是可执行的。 有两种办法把文件设置为可执行文件。 1) 直接在文件属性标签中选中 "可执行",--b 如果用的是图形界面,这个方法最简单直接。 2) 使用命令 chmod x file.sh。将可…

链表相交问题

本来想自己写,写了一半发现一篇文章,解释写得简单易懂,我就直接拿过来了。 这个问题值得反复地写,锻炼链表coding能力的好题。 //如果两个链表都不带环 int NotCycleCheckCross(pLinkNode head1,pLinkNode head2) {pLinkNode lis…

用JS写了一个模拟串行加法器

在重温《编码:隐匿在计算机软硬件背后的语言》第12章——二进制加法器时,心血来潮用JS写了一个模拟串行加法器。 测试断言工具TestUtils.js function assertTrue(actual){if(!actual)throw "Error actual: " actual " is not true.&q…

Android学习路线总结

title: Android学习路线总结,绝对干货 tags: Android学习路线,Android学习资料,怎么学习android grammar_cjkRuby: true --- 一、前言 不知不觉自己已经做了几年开发了,由记得刚出来工作的时候感觉自己能牛X,现在回想起来感觉好无知。懂的越…

双栈

利用栈底位置相对不变的特性,可以让两个顺序栈共享一个空间。 具体实现方法大概有两种: 一种是奇偶栈,就是所有下标为奇数的是一个栈,偶数是另一个栈。但是这样一个栈的最大存储就确定了,并没有起到互补空缺的作用&a…

Error when loading the SDK:解决方案

错误情况: 当打开eclipse时出现如下窗口(内容如下) Error when loading the SDK: Error: Error parsing \Android\adt-bundle-windows-x86_64-20140702\sdk\system-images\android-22\android-wear\armeabi-v7a\devices.xml cvc-complex-type…

单调队列优化的背包问题

对于背包问题,经典的背包九讲已经讲的很明白了,本来就不打算写这方面问题了。 但是吧。 我发现,那个最出名的九讲竟然没写队列优化的背包。。。。 那我必须写一下咯嘿嘿,这么好的思想。 我们回顾一下背包问题吧。 01背包问题 …

用Python去除扫描型PDF中的水印

内容概述 含水印扫描型PDF文件,其中某页如下图所示,用Python去除其页顶及页底的水印。 处理思路:PDF中的每一页的水印的相对位置基本相同,将PDF每一页输出成图片,然后进行图片编辑,用白色填充方形覆盖水印…