遗传算法入门(连载之八)

2024-06-10 14:08

本文主要是介绍遗传算法入门(连载之八),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

    最近在学习有关遗传算法和神经网络方面的知识,网上查看了很多这方面的秘笈,只怪小生天生愚钝、才疏学浅,不能很好的领悟秘笈中的真谛,往往被弄得晕头转向、不知所措快哭了委屈。直到有一天无意中看到了博主zzwu写的有关这方面的文章,初读之,如温旧习;渐深入,觉甚好;遂一气呵成,犹如拨云见日、茅塞顿开。余甚怕在茫茫Internet中再无机会拜读之,遂收藏于此,以便众人观之,绝无其他不良用途。在此对博主再次深表感谢。

博文转自:http://blog.csdn.net/zzwu/article/details/561628


.

.
(连载之八)
.
扎自<游戏编程中的人工智能技术>第三章

 清华大学出版社

 3.4.3 参数值的选取
(Choosing the Parameter Value )

。。你可能想了解我是如何知道需要采用这些变量初值?这可是价值百万美元的问题,因至今尚未有快速有效的规则能确定这些值,有的只是一些原则性的指导。而且,我已把程序用到的所有参数存放在文件defines.h 中了。这些参数中大多数将是一目了然的,但有其中几个我想说明一下,即  
       
       #define CROSSOVER_RATE 0.7   #define MUTATION_RATE  0.001   #define POP_SIZE       140   #define CHROMO_LENGTH  70   选择这些值最终还得归结为每个人对遗传算法所得到的“感觉”,你只能通过自己的编程实践、用各种不同的参数值进行调试、看结果会发生什么,并从中选取适合的值。不同的问题需要不同的值,但是通常来说,如果你在使用二进制编码的染色体,则把杂交率设定为O.7,变异率设为0.001,将是很好的初始缺省值。而确定群体大小的一条有用规则是将基因组的数目取为染色体长度的2倍。   。。因 70表示 Bob 的 35步的最大可能移动数目,所以这里选择70作为染色体的长度,它比 Bob 为穿越地图到达出口所需的步数还要多一些。当你学习了以后几章的方法后可以使遗传算法变得更为有效,到时你就能将这个长度减少下来。 
        
历史的注释 
。。遗传算法是 John Holland大脑的产物,早在上个世纪60年代,他已提出这种想法。但不可思议的是,他没有感到需要在计算机上实际试验出结果,而宁愿利用笔和纸来作修修补补的工作! 直到后来他的一名学生编写出程序并在一台个人计算机上运行后,才使人们终于看到在软件中利用他的思想能够得到什么。 
3.4.4 算子函数(The Operator Functions) 。。我们现在从头到尾来考察一遍遗传算法的各种操作(或称算子)函数-选择、杂交、变异-的代码。尽管很简单,但与你一起通读一遍源码能给你重温一次这些函数的机会。这可使你在了解遗传算法的知识时对它们具有更确切的认识。 3.4.4.1重温轮盘赌选择(Roulette Whell Selection Revisited ) 让我们从轮盘赌选择算法开始。请记住,这一个函数的功能是从群体中选择一个基因组,选中的几率正比于基因组的适应性分数。 SGenome& CgaBob::RouletteWheelSelection() { double fSlice = RandFloat()*m_dTotalFitnessScore; 。。我们从零到整个适应分范围内随机选取了一实数fSlice 。我喜欢把此数看作整个适应性分数饼图中的一块,如早先在图3.4中所示。 [但并不是其中一块,译注] double cfTotal = O; int SelectedGenome = 0; for (int i=O; i<m_iPopSize; ++i) { cfTotal += m_vecGenomes[i].dFitness; if (cfTotal > fSlice) { SelectedGenome = i; break; } } return m_vecGenomes[SelectedGenome]; } 。。现在,程序通过循环来考察各基因组,把它们相应的适应性分数一个一个累加起来,直到这一 部分累加和 大于 fSlice 值时,就返回该基因组。就是这样简单。 3.4.4.2 重温杂交操作(Crossover Revisited) 。。这一函数要求2个染色体在同一随机位置上断裂开,然后将它们在断开点以后的部分进行互换,以形成 2 个新的染色体 ( 子代 ) 。 void CgaBob::Crossover ( const vector<int> &mum, const vector<int> &dad, vector<int> &baby1, vector<int> &baby2) { 这一函数共传入 4 个参数,参数传递均采用引用( reference )方式,其中前2 个传入父辈parent 的染色体(别忘记 , 染色体只是一个整数型的矢量std::vector ),后 2 个则是用来copy 子代染色体的空矢量。 if ( (RandFloat() > m_dCrossoverRate) || (mum == dad) ) { baby1 = mum; baby2 = dad; return; } 这里,首先是进行检测,看 mumdad 两个上辈是否需要进行杂交。杂交发生的概率是由参数 m_dCrossoverRate 确定。如果不发生杂交,则2个上辈染色体不作任何改变地就直接复制为子代,函数立即返回。 int cp = RandInt(0, m_iChromoLength - 1) ; 。。沿染色体的长度随机选择一个点来裂开染色体。 for (int i=0; i<cp; i++) { baby1.push_back(mum[i]); baby2.push_back(dad[i]); } for (i=cp; i<mum.size(); i++) { baby1.push_back(dad[i]); baby2.push_back(mum[i]); 这两个小循环把 2 个 parent 染色体在杂交点( CP,crossover point )以后的所有位进行了互换,并把新的染色体赋给了 2 个子代 : baby1 和 baby2 。 3.4.4.3 重温变异操作(Mutation Revisited) 这一函数所做的工作,不过就是沿着一个染色体的长度,一bit一bit地进行考察,并按m_dMutationRate给定的几率,将其中某些bit实行翻转。 void CgaBob::Mutate(vector<int> &vecBits) { for (int curBit=0; curBit<vecBits.size(); curBit++) { //是否要翻转此bit? If (RandFloat() < m_dMutationRate) ( //是,就翻转此bit vecBits[curBit] = !vecBits[curBit]; } }//移到下一个bit } 。。就是这些了。你的第一遗传算法程序也就这样完成了!下面让我花一些时间来说明一下,当你在运行 Pathfinder 程序时,你能看到些什么?
-连载8完-

这篇关于遗传算法入门(连载之八)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1048378

相关文章

Spring Security 从入门到进阶系列教程

Spring Security 入门系列 《保护 Web 应用的安全》 《Spring-Security-入门(一):登录与退出》 《Spring-Security-入门(二):基于数据库验证》 《Spring-Security-入门(三):密码加密》 《Spring-Security-入门(四):自定义-Filter》 《Spring-Security-入门(五):在 Sprin

数论入门整理(updating)

一、gcd lcm 基础中的基础,一般用来处理计算第一步什么的,分数化简之类。 LL gcd(LL a, LL b) { return b ? gcd(b, a % b) : a; } <pre name="code" class="cpp">LL lcm(LL a, LL b){LL c = gcd(a, b);return a / c * b;} 例题:

Java 创建图形用户界面(GUI)入门指南(Swing库 JFrame 类)概述

概述 基本概念 Java Swing 的架构 Java Swing 是一个为 Java 设计的 GUI 工具包,是 JAVA 基础类的一部分,基于 Java AWT 构建,提供了一系列轻量级、可定制的图形用户界面(GUI)组件。 与 AWT 相比,Swing 提供了许多比 AWT 更好的屏幕显示元素,更加灵活和可定制,具有更好的跨平台性能。 组件和容器 Java Swing 提供了许多

【IPV6从入门到起飞】5-1 IPV6+Home Assistant(搭建基本环境)

【IPV6从入门到起飞】5-1 IPV6+Home Assistant #搭建基本环境 1 背景2 docker下载 hass3 创建容器4 浏览器访问 hass5 手机APP远程访问hass6 更多玩法 1 背景 既然电脑可以IPV6入站,手机流量可以访问IPV6网络的服务,为什么不在电脑搭建Home Assistant(hass),来控制你的设备呢?@智能家居 @万物互联

poj 2104 and hdu 2665 划分树模板入门题

题意: 给一个数组n(1e5)个数,给一个范围(fr, to, k),求这个范围中第k大的数。 解析: 划分树入门。 bing神的模板。 坑爹的地方是把-l 看成了-1........ 一直re。 代码: poj 2104: #include <iostream>#include <cstdio>#include <cstdlib>#include <al

MySQL-CRUD入门1

文章目录 认识配置文件client节点mysql节点mysqld节点 数据的添加(Create)添加一行数据添加多行数据两种添加数据的效率对比 数据的查询(Retrieve)全列查询指定列查询查询中带有表达式关于字面量关于as重命名 临时表引入distinct去重order by 排序关于NULL 认识配置文件 在我们的MySQL服务安装好了之后, 会有一个配置文件, 也就

音视频入门基础:WAV专题(10)——FFmpeg源码中计算WAV音频文件每个packet的pts、dts的实现

一、引言 从文章《音视频入门基础:WAV专题(6)——通过FFprobe显示WAV音频文件每个数据包的信息》中我们可以知道,通过FFprobe命令可以打印WAV音频文件每个packet(也称为数据包或多媒体包)的信息,这些信息包含该packet的pts、dts: 打印出来的“pts”实际是AVPacket结构体中的成员变量pts,是以AVStream->time_base为单位的显

C语言指针入门 《C语言非常道》

C语言指针入门 《C语言非常道》 作为一个程序员,我接触 C 语言有十年了。有的朋友让我推荐 C 语言的参考书,我不敢乱推荐,尤其是国内作者写的书,往往七拼八凑,漏洞百出。 但是,李忠老师的《C语言非常道》值得一读。对了,李老师有个官网,网址是: 李忠老师官网 最棒的是,有配套的教学视频,可以试看。 试看点这里 接下来言归正传,讲解指针。以下内容很多都参考了李忠老师的《C语言非

MySQL入门到精通

一、创建数据库 CREATE DATABASE 数据库名称; 如果数据库存在,则会提示报错。 二、选择数据库 USE 数据库名称; 三、创建数据表 CREATE TABLE 数据表名称; 四、MySQL数据类型 MySQL支持多种类型,大致可以分为三类:数值、日期/时间和字符串类型 4.1 数值类型 数值类型 类型大小用途INT4Bytes整数值FLOAT4By

【QT】基础入门学习

文章目录 浅析Qt应用程序的主函数使用qDebug()函数常用快捷键Qt 编码风格信号槽连接模型实现方案 信号和槽的工作机制Qt对象树机制 浅析Qt应用程序的主函数 #include "mywindow.h"#include <QApplication>// 程序的入口int main(int argc, char *argv[]){// argc是命令行参数个数,argv是