buckland大神的每一章都很经典,少了任何一章都会感到不完整。今天先介绍第十章-演化算法。因为这是人工生命的基础。大名鼎鼎的tierra就是采用了演化算法。(什么是Tierra?看这里点击打开链接)

演化算法的思路就是让弱小的生命体“死亡”,再让强大的生命体代替“死亡”的生命体,从而保证种群的一直延续,并且,生命体基于求生的本能,避免被“死亡”,会衍生出各种叹为观止的新行为,称之为生物的多样性。因此,演化算法的思路可以概括为:如何筛选弱小的生命体进行“死亡”操作(Tierra里称之为“死神”、“收割机”),以及如何用强大的生命体进行替代。

若想让生命体“死亡”,除了创建一个std::vector作为种群外,还必须创建另一个向量std::multiset,称之为“池”。“池”中的生命体不是显示在游戏屏幕上的,而是在后台运作的一个“母体”,因为游戏画面上所有的生命体都是从“池”中孵化得来的,弱小的即将被杀死的生命体也会丢弃到这个池中等待“死神”“收割”。替代死亡生命体也是从“池”中选出的最强壮的生命体。因此,“池”必须具备两个特征:

(1)“池”中生命体的数量必定比游戏画面上“种群”中生命体的数量要大的多。

(2)“池”必须是有序向量,这样才能简便的分辩谁是弱小生命体,谁是强壮生命体。

ok,闲话不多说,直接进入代码。本节中只介绍关于演化的那一部分,其他部分,例如外星人部分,神经网络部分等不在介绍。

先看相关参数设定。

class CController
{
private://the player's gunCGun*            m_pGunTurret;//the pool of aliensmultiset<CAlien> m_setAliens; //设定“基因组池”,使用multiset容器,利用二叉树实现,详细内容参见教材P235页//the currently active aliensvector<CAlien>   m_vecActiveAliens;//这个是显示在游戏画面上的种群int              m_iAliensCreatedSoFar;int              m_iNumSpawnedFromTheMultiset;//vertex buffer for the starsvector<SPoint>   m_vecStarVB;//keeps track of the window sizeint              m_cxClient,m_cyClient;//lets the program run as fast as possiblebool             m_bFastRender;//custom pens used for drawing the game objectsHPEN             m_GreenPen;HPEN             m_RedPen;HPEN             m_GunPen;HPEN             m_BarPen;void    WorldTransform(vector<SPoint> &pad);CAlien  TournamentSelection();public:CController(int cxClient, int cyClient);~CController();//The workhorse of the program. Updates all the game objects and//spawns new aliens into the population.bool  Update();//演化计算在这里void  Render(HDC &surface);//resets all the controller variables and creates a new starting//population of aliens, ready for another runvoid  Reset();//-----------------------------accessor functionsbool FastRender(){return m_bFastRender;}
};

接下来介绍演化计算相关的Update程序。

//------------------------------- Update ---------------------------------
//
//  The workhorse of the program. Updates all the game objects and
//  spawns new aliens into the population.
//------------------------------------------------------------------------
bool CController::Update()
{//switch the autogun off if enough offspring have been//spawnedif (m_iNumSpawnedFromTheMultiset > CParams::iPreSpawns){m_pGunTurret->AutoGunOff();m_bFastRender = false;}//get update from player for the turret movement//and update any bullets that may have been firedm_pGunTurret->Update();//move the starsfor (int str=0; str<m_vecStarVB.size(); ++str){m_vecStarVB[str].y -= 0.2f;if (m_vecStarVB[str].y < 0){//create a new starm_vecStarVB[str].x = RandInt(0, CParams::WindowWidth);m_vecStarVB[str].y = CParams::WindowHeight;}}//update the aliensfor (int i=0; i<m_vecActiveAliens.size(); ++i){//if alien has 'died' replace with a new oneif (!m_vecActiveAliens[i].Update(m_pGunTurret->m_vecBullets,m_pGunTurret->m_vPos))//如果外星人“死”了{ //first we need to re-insert into the breeding population so//that its fitness score and genes are recorded.m_setAliens.insert(m_vecActiveAliens[i]);//将死去的外星人插入“池”中//if the required population size has been reached, delete the //worst performer from the multisetif (m_setAliens.size() >= CParams::iPopSize)//如果池中的数目满了,iPopSize是池中生命体最大数量{      m_setAliens.erase(--m_setAliens.end()); //将池中最后的,也就是适应度最差的外星人删去,即“收割”操作       }++m_iNumSpawnedFromTheMultiset;//if early in the run then we are still trying out new aliensif (m_iAliensCreatedSoFar <= CParams::iPopSize)//如果刚开始,池中的生命体还没满的话,就新建一个生命体,来替代死去的{m_vecActiveAliens[i] = CAlien();++m_iAliensCreatedSoFar;          }//otherwise select from the multiset and apply mutation,如果池中生命体满了的话,就从池中进行精英选择,来替代死去的else{         m_vecActiveAliens[i] = TournamentSelection();m_vecActiveAliens[i].Reset();if (RandFloat() < 0.8){m_vecActiveAliens[i].Mutate();}}}}//next alienreturn true;
}

游戏编程中的人工智能技术-演化算法入门相关推荐

  1. 【转】游戏编程中的人工智能技术--神经网络

    原文:http://blog.csdn.net/ecitnet/article/details/1799444 游戏编程中的人工智能技术 . > .  (连载之一) 用平常语言介绍神经网络(Ne ...

  2. 游戏编程中的人工智能技术--神经网络

    游戏编程中的人工智能技术 . <神经网络入门> .  (连载之一) 用平常语言介绍神经网络 (Neural Networks in Plain English) 因为我们没有很好了解大脑, ...

  3. 游戏编程中的人工智能技术

    游戏编程中的人工智能技术 转自http://blog.csdn.net/aifuture/article/details/1852030 分类: 神经网络 2007-10-28 17:44 652人阅 ...

  4. BP神经网络-(参考游戏编程中的人工智能技术)

    BP神经网络,采用有监督的训练方法,有监督的训练方法适用于已经具备可以用来训练网络的各种数据例子. 他的工作过程:把一个输入模式送给网络,考察他这时的输出,并将它的输出与慕白哦输出进行比较,如果实际的 ...

  5. 游戏编程中的寻路算法研究

    近年来,游戏产业的快速发展带动了游戏中人工 智能(Artificial Intelligence,简称AI)的发展,越来越 多的游戏采用人工智能技术提高游戏的可玩性.在电 子游戏中,玩家操控主要角色, ...

  6. [转] 游戏编程中的寻路算法研究

    [url]http://blog.csdn.net/ityuany/archive/2010/04/21/5509750.aspx[/url] 近年来,游戏产业的快速发展带动了游戏中人工 智能(Art ...

  7. 向量几何在游戏编程中的使用

    <1>简单的2-D追踪 -Twinsen编写 -本人水平有限,疏忽错误在所难免,还请各位数学高手.编程高手不吝赐教 -我的Email-address: popyy@netease.com ...

  8. 向量几何在游戏编程中的使用1

    <1>简单的2-D追踪 -Twinsen编写 -本人水平有限,疏忽错误在所难免,还请各位数学高手.编程高手不吝赐教 -我的Email-address: popyy@netease.com ...

  9. 向量几何在游戏编程中的使用2

    <2>2-D物体任意角度的反弹 -Twinsen编写 -本人水平有限,疏忽错误在所难免,还请各位数学高手.编程高手不吝赐教 -我的Email-address: popyy@netease. ...

最新文章

  1. 100道Java基础面试题收集整理(附答案)
  2. CSDN Github Markdown编辑常用功能符号补充
  3. wxWidgets:wxListCtrl 示例
  4. springMVC导入excel案例poi
  5. 数据库健康状况监视_监视数据库运行状况和行为:哪些指标重要?
  6. php 取出多重数组中的一列_PHP提取多维数组指定一列的方法大全
  7. 严重的“Access:7”供应链漏洞影响100多家厂商150多款联网设备等产品
  8. python下载哪个版本好-究竟哪个版本的Python是最快的?
  9. 基于Qt的学生信息管理系统
  10. 为大众而写的程序员小说——从 简单易懂的现代魔法 说开去
  11. 通过企业微信或者微信公众号发送小程序消息推送功能
  12. MSRA院长周礼栋升任微软全球资深副总裁,20年前加入微软,毕业于复旦
  13. 锌掺杂的普鲁士蓝纳米颗粒|微/纳米多孔普鲁士蓝/金复合物|氧化石墨烯/普鲁士蓝/氨基苝四甲酸复合物(GO/PB/PTC-NH2)
  14. 家用宽带的上传和下载速度
  15. 幅相曲线渐近线_若最小相位系统的低频段幅频特性的渐近线是一条斜率为20dB/dec的直线,则该系统( )。_学小易找答案...
  16. mysql左模糊 走索引_mysql的模糊查找是否走索引问题
  17. STM32物联网通信WIFI
  18. 尝试实现MySQL的登录与部署并记录下来_下列说法正确的是
  19. python实现一个简单的项目建议书范文_建议收藏,22个Python迷你项目(附源码)
  20. web前端实现液晶显示数字、LED、十位、个位

热门文章

  1. bom更改编号 sap_SAP ERP系统如何通过LSMW批量更改BOM
  2. Java小白修炼手册--锻体期--第二阶段:Java SE 核心API
  3. Capacitor Plugin 实现
  4. Python随机生成电话号码号码段分析
  5. sqlite怎么转换mysql_Django如何把SQLite数据库转换为Mysql数据库
  6. CTFHub Bypass disable_function系列(已完结)
  7. freeBSD的VNET_DEFINE跟SYSCTL_VNET_INT
  8. [原创]自定义ViewPager实现3D画廊效果
  9. Ubuntu18.04安装NVIDIA驱动以及cuda出现的问题
  10. javaweb项目通过natapp实现项目让外网访问