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

2024-06-10 14:08

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

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

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


.

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

 清华大学出版社

(本章由zzwu译)

3.4 帮助 Bob 回家( Helping Bob Home )

        由于寻找路径问题被看成是游戏人工智能的一块神圣基石,我们下面就来创建一个遗传算法,用在一个非常简单的场景中解决寻找路径问题。为此,我们将创建一个迷宫,它的左边有一入口,右边有一出口,并有一些障碍物散布在其中。然后在出发点放置一个虚拟的人,我们叫他鲍勃(Bob),然后要为他解决如何寻找路径的问题,使他能找到出口,并避免与所有障碍物相碰撞。下面我将说明怎样来产生Bob的染色体的编码,但首先需要解释怎样来表示迷宫...

   迷宫是一个2D整数型数组;用0来表示开放的空间,1代表墙壁或障碍物,5是起始点,8是出口。因此,整数数组:

.{ 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,.
1,0,1,0,0,0,0,0,1,1,1,0,0,0,1,
..5,0,0,0,0,0,0,0,1,1,1,0,0,0,1,
..1,0,0,0,1,1,1,0,0,1,0,0,0,0,1,
..1,0,0,0,1,1,1,0,0,0,0,0,1,0,1,
. 1,1,0,0,1,1,1,0,0,0,0,0,1,0,1, 
..1,0,0,0,0,1,0,0,0,0,1,1,1,0,1,
..1,0,1,1,0,0,0,1,0,0,0,0,0,0,8,
..1,0,1,1,0,0,0,1,0,0,0,0,0,0,1,
.. 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1 }

   在屏幕上看起来将会有下面图3.5的样子:


图 3.5 Bob的迷宫,用红色标出了入口和出口

  作者已把这种地图设计方法封装在一个被称作CBobsMap的类中,它定义为:

 class CBobsMap
{           
      
private:
                
   //保存地图用的存储器 (一个2维整型数组)
    static const int map[MAP_HEIGHT][MAP_WIDTH];  
    static const int m_iMapWidth;   //地图的宽度   
    static const int m_iMapHeight;  //地图的高度 
    
   //起始点在数组中的下标        
    static const int m_iStartX;    
    static const int m_iStartY;              
       
   //终点的数组下标       
    static const int m_iEndX;              
    static const int m_iEndY;           

public:              
   //你可以利用这一数组作为 Bob 存储器,如果需要的话 
    int memory[MAP_HEIGHT][MAP_WIDTH];   
   
    CBobsMap() 
    { 
      ResetMemory(); 
    }
             
   //利用一个字符串来记录Bob行进的方向,其中每一个字符代表
   //Bob所走的一步;检查Bob离开出口还有多远; 
   //返回一个与到达出口距离成正比的适应性分数 
    double TestRoute(const vector &vecPath,
                     CBobsMap     &memory);             
                             
   //Render函数利用Windows GDI在一个给定的surface上显示地图
    void Render(const int    cxClient,
                const int    cyClient,
                HDC          surface); 

   //画出能够存放于存储器中的不管什么样的路径 
    void MemoryRender(const int cxClient,
                      const int cyClient.
                      HDC       surface); 
    void ResetMemory(); 
};

.     由上可以看出,我们只需要以常量的形式来保存地图数组以及起点和终点的坐标就行了。这些数据是在文件CBobsMap.cpp 中定义的,在光盘上你能找到它的相关的文件夹。除了存储迷宫的数据外,这个Map类也用来记录Bob在迷宫中所走过的路程:memory[][] 。这对遗传算法本身而言不是本质的,但为了显示目的,使你能看到 Bob 怎样在迷宫中漫游,设置一个记录是必需的。这里重要的是成员函数TestRoute(),它需要利用一系列的行进方向来检测Bob 走了多远。这里我不准备花费时间来列出TestRoute 函数的清单,因为这是十分简单的那种函数,但要列出来却可能需要长长的2页。我们只需要说明一下就行了。给出一个方向向量,它的每个分量能代表向北(North)、向南(South)、向东(East)、向西(West)四个方向之一,让Bob 按照它在地图中行走, TestRoute 计算 Bob 能到达的最远点的位置,然后返回一个适应性分数,它正比于Bob 最终位置离出口的距离。他所到达的位置离开出口愈近,奖励给他的适应性分数也愈高。如果他实际已到达了出口,则我们就要向他表示祝贺了,他将得到满分1。这时循环就会自动结束,因为你已经找到一个解了,可以喊乌拉了!
...再有,不要因为理解不了这个类的任何一点而操心。我们下面马上就会开始讨论有关的每一件事情的。

-连载5完-

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



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

相关文章

C++必修:模版的入门到实践

✨✨ 欢迎大家来到贝蒂大讲堂✨✨ 🎈🎈养成好习惯,先赞后看哦~🎈🎈 所属专栏:C++学习 贝蒂的主页:Betty’s blog 1. 泛型编程 首先让我们来思考一个问题,如何实现一个交换函数? void swap(int& x, int& y){int tmp = x;x = y;y = tmp;} 相信大家很快就能写出上面这段代码,但是如果要求这个交换函数支持字符型

零基础STM32单片机编程入门(一)初识STM32单片机

文章目录 一.概要二.单片机型号命名规则三.STM32F103系统架构四.STM32F103C8T6单片机启动流程五.STM32F103C8T6单片机主要外设资源六.编程过程中芯片数据手册的作用1.单片机外设资源情况2.STM32单片机内部框图3.STM32单片机管脚图4.STM32单片机每个管脚可配功能5.单片机功耗数据6.FALSH编程时间,擦写次数7.I/O高低电平电压表格8.外设接口

ps基础入门

1.基础      1.1新建文件      1.2创建指定形状      1.4移动工具          1.41移动画布中的任意元素          1.42移动画布          1.43修改画布大小          1.44修改图像大小      1.5框选工具      1.6矩形工具      1.7图层          1.71图层颜色修改          1

C++入门01

1、.h和.cpp 源文件 (.cpp)源文件是C++程序的实际实现代码文件,其中包含了具体的函数和类的定义、实现以及其他相关的代码。主要特点如下:实现代码: 源文件中包含了函数、类的具体实现代码,用于实现程序的功能。编译单元: 源文件通常是一个编译单元,即单独编译的基本单位。每个源文件都会经过编译器的处理,生成对应的目标文件。包含头文件: 源文件可以通过#include指令引入头文件,以使

LVGL快速入门笔记

目录 一、基础知识 1. 基础对象(lv_obj) 2. 基础对象的大小(size) 3. 基础对象的位置(position) 3.1 直接设置方式 3.2 参照父对象对齐 3.3 获取位置 4. 基础对象的盒子模型(border-box) 5. 基础对象的样式(styles) 5.1 样式的状态和部分 5.1.1 对象可以处于以下状态States的组合: 5.1.2 对象

C语言入门系列:探秘二级指针与多级指针的奇妙世界

文章目录 一,指针的回忆杀1,指针的概念2,指针的声明和赋值3,指针的使用3.1 直接给指针变量赋值3.2 通过*运算符读写指针指向的内存3.2.1 读3.2.2 写 二,二级指针详解1,定义2,示例说明3,二级指针与一级指针、普通变量的关系3.1,与一级指针的关系3.2,与普通变量的关系,示例说明 4,二级指针的常见用途5,二级指针扩展到多级指针 小结 C语言的学习之旅中,二级

打造坚固的SSH防护网:端口敲门入门指南

欢迎来到我的博客,代码的世界里,每一行都是一个故事 🎏:你只管努力,剩下的交给时间 🏠 :小破站 打造坚固的SSH防护网:端口敲门入门指南 前言什么是端口敲门端口敲门的优点1. 增强安全性2. 动态防火墙规则3. 隐匿服务4. 改善日志管理5. 灵活性和兼容性6. 低资源消耗7. 防御暴力破解和扫描8. 便于合法用户访问9. 适用于不同类型的服务 端口敲

好书推荐《深度学习入门 基于Python的理论与实现》

如果你对Python有一定的了解,想对深度学习的基本概念和工作原理有一个透彻的理解,想利用Python编写出简单的深度学习程序,那么这本书绝对是最佳的入门教程,理由如下:     (1)撰写者是一名日本普通的AI工作者,主要记录了他在深度学习中的笔记,这本书站在学习者的角度考虑,秉承“解剖”深度学习的底层技术,不使用任何现有的深度学习框架、尽可能仅使用基本的数学知识和Python库。从零创建一个

手把手教你入门vue+springboot开发(五)--docker部署

文章目录 前言一、前端打包二、后端打包三、docker运行总结 前言 前面我们重点介绍了vue+springboot前后端分离开发的过程,本篇我们结合docker容器来研究一下打包部署过程。 一、前端打包 在VSCode的命令行中输入npm run build可以打包前端代码,出现下图提示表示打包完成。 打包成功后会在前端工程目录生成dist目录,如下图所示: 把

CALayer入门

iOS开发UI篇—CALayer简介 一、简单介绍 在iOS中,你能看得见摸得着的东西基本上都是UIView,比如一个按钮、一个文本标签、一个文本输入框、一个图标等等,这些都是UIView。 其实UIView之所以能显示在屏幕上,完全是因为它内部的一个图层,在创建UIView对象时,UIView内部会自动创建一个图层(即CALayer对象),通过UIView的layer属性可