ROBOT & AI

首页 | 新闻 | 产品 | 竞赛 | 学苑 | 读书 | 硬件 | 软件 | 智能 | 制作 | 项目 | 资源 | 论坛
 您的位置:首页 >> 智能 >> 智能体 >> 正文
站内搜索:   

人工智能 Java 坦克机器人系列: 遗传算法

来源:http://www.ibm.com/cn/   字体:[ ]  2007-01-09

关键词:Java


通过三个循环遍历整个群体,对各个适应度进行比较后找出最优适应度。

4. 产生遗传后代
public void newGeneration (){

String copy_pop[] = ga.copy (ga.population, ga.copy);
String cross_pop[] = ga.crossover (ga.population, ga.crossover);
copy_pop = ga.mutate (copy_pop, ga.mutation);
cross_pop = ga.mutate (cross_pop, ga.mutation);
for (int i = 0; i < copy_pop.length; i++){
ga.population[i+elite_pop.length].genome = copy_pop[i];
}
for (int i = 0; i < cross_pop.length; i++){
ga.population[i+elite_pop.length+copy_pop.length].genome = cross_pop[i];
}

current_generation++;
evaluateAll();
}

通过复制(ga.copy)、交叉(ga.crossover)、变异(ga.mutate)操作,产生出遗传后代。
SmallBrain也即我们写的利用遗传算法的例子机器人,它开始读取遗传文件"genome.dat",产生新的编码,当扫描到敌人时把所有相关的信息写入数组robot_data,再通过循环操作进化写入输入运算,最后遍历输入运算决定输出机器人的动作。
1.编码:
public void parseGenome (String genome){
functions = new int [num_boxes][num_events];
inputs1 = new int [num_boxes][num_events];
inputs2 = new int [num_boxes][num_events];
robot_data = new double [num_boxes + num_system_inputs][num_events];

通过parseGenome方法,设置function,input1,input2等数组的参数,对要操作的机器人进行编码。这部分和最上面提来的TableRex编码表是一致的。
2.写入状态信息
public void onScannedRobot (ScannedRobotEvent e){
robot_data[0][kSCAN_EVENT] = getVelocity();
robot_data[1][kSCAN_EVENT] = getEnergy();
robot_data[2][kSCAN_EVENT] = getHeading();
….

3.根据函数数组写入输入运算
for (int i = 0; i < num_boxes; i++){
switch (functions[i][event_num]){
case 0: //greater than
robot_data [i + num_system_inputs][event_num] =
robot_data[inputs1[i][event_num]][event_num] >
robot_data[inputs2[i][event_num]][event_num]?1f:0f;
break;

case 2: //equal to
break;
case 15: //output
handleOutput (inputs1[i][event_num], robot_data [inputs2[i][event_num]][event_num]);
break;

此处注意最后是根据写入的操作运算进行输出
4.输出机器人动作命令
  public void handleScanOutput (int outputType, double value){ 
switch (outputType % 16){
case 0:
ahead (value); break;
case 1:
back (value); break;
case 2:
//maybe shouldn't use mod here
fire (value % 3); break;


最后我们可以看出TableRex程序中,smallBrain和BrainWorld之间以文件方式并行交互,smallBrain扫描信息,写入文件。BrainWorld根据文件数据进化机器人,并把进化结果写入文件,smallBrain根据进化后的数据产生机器人的动作。
Geep 的机器人GPBot系统正是采用了TableRex解释程序的简单例子。
GPBot仅由四行代码组成(每行都以分号结束),它做了如下一些定制达到代码最优化:忽略雷达旋转,让它直接随着炮管而转动TurnGunRight(INFINITY);把行为做为常量来实现,让它们能显示在进化代码序列的任意点。
OnScannedRobot() {
MoveTank(<GP#1>);
TurnTankRight(<GP#2>);
TurnGunRight(<GP#3>);
}

GPBot所有事件都写在ScannedRobotEvent事件。每个方法都利用到了遗传算法进化机器人。第一行代码移动系统进化,适应度值依照个体躲避子弹,避墙和敌人的能力而设置;第二行代码指示坦克旋转指定的方向角。第三行代码瞄准系统进化指示炮管旋转指定的方向角, 适应度值依照个体打中敌人概率来设置。GPBot群体大小为256个个体,变异、交叉概率分别为0.9,选择长度为5。在最附录中提供了例子机器人人下载。
最后我们给出一些测试数据,看看我们的程序不同的测试结果。
变异概率变化测试:
群体大小: 25
变异概率(Mutation): tested
精英概率(Elitism): 0.1
比赛回合: 20 rounds
后代: 25

我们选择变异概率分级从0.01到0.5这间。依照上面的遗传算法介绍,0.01的概率是比较合理的,所以我们以此为初始化值,下图中显示了所有的测试概率数据,从下图我们可以看出,开始一个很小的适应度值,从6代开始图形就增长很慢了,在13代的时候,有一个小的变化,到最后每个后代都相当逼近。

图4. 变异测试
图4. 变异测试

图5. 6 到 9代放大特写
图5. 6 到 9代放大特写

测试说明:

我们从上可以看出当我们给出初始的适应度在很小时,在第一代增长很多,经过一定数量的后代开始汇聚到一些最大的适应度值。由此我们得到证明,机器人在我们的学习环境中聪明的开始躲避子弹、墙、和其他机器人。而且它自己找到一个很好的瞄准位置给与敌人打击。

最后不能不说一下Jgap的使用, JGAP 是一款用Java编写的遗传算法包,由sourceforce上开发而来。它提供了基本的遗传算法,你可以使用它来解决一些适合用遗传算法解决的问题。而 且它给出了很多例子程序,可用于我们一些遗传算法的测试工作。由于它来自于开源组织sourceforce,所以开源的遗传功能将是研究简单遗传算法很好 工具。

近来在研究人工智能过程和坦克机器人时,发现国内也开发出了一个类似于 Robocode 仿真器的平台 AI-CODE,其思想延用 Robocode,但在 Robocode 基础上做了很多的改进,封装了一些函数模块,让开发者更侧重于算法和程序设计的学习。最有意思的这个平台能同时支持 Java,C,C++,C# 语言,从理论上看它支持任何语言。美中不足的是国内应用的例子还不是很多,远没有 Robocode 那么多可参考的例子。如果大家有兴趣可尝试在 AI-CODE 平台上用不同语言做一些遗传算法的测试。我想能帮助更多人工智能爱好者。其相关网站大家可到 http:///www.ai-code.org 去了解。

4页 上一页 [1] [2] [3] [4] 

录入:master 点击:

[发表评论] [打印文章] [关闭窗口]  

原创文章属本站所有,转载请注明来源:Robotain.com  
相关文章

 网友评论(只显示最新10条。评论内容只代表网友观点,与本站立场无关!)

发表评论 昵称:

  

  • 请遵守《互联网电子公告服务管理规定》及中华人民共和国其他各项有关法律法规。
  • 严禁发表危害国家安全、损害国家利益、破坏民族团结、破坏国家宗教政策、破坏社会稳定、侮辱、诽谤、教唆、淫秽等内容的评论 。
最新推荐
热门文章
论坛精华
网站简介设为首页 加入收藏在线留言友情链接联系我们 - 广告服务 - 版权申明

Copyright © Robotain.com  all rights reserved  浙ICP备07003355号

版权所有 机器与智能网