器人手爪的开合例如:MOVE PICK!表示尛机器人人由关节插值运
动到精确PICK所定义的
。“!”表示位置变量已
你对这个回答的评价是
遗传算法(Genetic Algorithm, GA)是近几年发展起来嘚一种崭新的全局优化算法本文将讲解这种算法,并介绍如何 Robocode Java 坦克小机器人人中采用此算法以实现小机器人人进化
遗传算法(Genetic Algorithm, GA)是近幾年发展起来的一种崭新的全局优化算法。1962年霍兰德(Holland)教授首次提出了GA算法的思想它借用了仿真生物遗传学和自然选择机理,通过自然选擇、遗传、变异等作用机制实现各个个体的适应性的提高。从某种程度上说遗传算法是对生物进化过程进行的数学方式仿真
这一点体現了自然界中"物竞天择、适者生存"进化过程。与自然界相似遗传算法对求解问题的本身一无所知,它所需要的仅是对算法所产生的每个染色体进行评价,把问题的解表示成染色体并基于适应值来选择染色体,使适应性好的染色体有更多的繁殖机会在算法中也即是以二进淛编码的串。并且在执行遗传算法之前,给出一群染色体也即是假设解。然后把这些假设解置于问题的“环境”中,也即一个适应喥函数中来评价并按适者生存的原则,从中选择出较适应环境的染色体进行复制, 淘汰低适应度的个体再通过交叉,变异过程产生更适應环境的新一代染色体群对这个新种群进行下一轮进化,至到最适合环境的值
遗传算法已用于求解带有应用前景的一些问题,例如遗傳程序设计、函数优化、排序问题、人工神经网络、分类系统、计算机图像处理和小机器人人运动规划等
由于遗传算法是由进化论和遗傳学机理而产生的搜索算法,所以在这个算法中会用到很多生物遗传学知识下面是我们将会用来的一些术语说明:
染色体又可以叫做基洇型个体(individuals),一定数量的个体组成了群体(population),群体中个体的数量叫做群体大小。
基因是串中的元素基因用于表示个体的特征。例如有一个串S=1011則其中的1,01,1这4个元素分别称为基因它们的值称为等位基因(Alletes)。
基因地点在算法中表示一个基因在串中的位置称为基因位置(Gene Position)有时也简稱基因位。基因位置由串的左向右计算例如在串 S=1101 中,0的基因位置是3
在用串表示整数时,基因的特征值与二进制数的权一致;例如在串 S=1011 中基因位置3中的1,它的基因特征值为2;基因位置1中的1它的基因特征值为8。
各个个体对环境的适应程度叫做适应度(fitness)为了体现染色体嘚适应能力,引入了对问题中的每一个染色体都能进行度量的函数叫适应度函数. 这个函数是计算个体在群体中被使用的概率。
霍兰德(Holland)教授最初提出的算法也叫简单遗传算法简单遗传算法的遗传操作主要有三种:选择(selection)、交叉(crossover)、变异(mutation)这也是遗传算法中最常用的三种算法:
选擇操作也叫复制操作,从群体中按个体的适应度函数值选择出较适应环境的个体一般地说,选择将使适应度高的个体繁殖下一代的数目較多而适应度较小的个体,繁殖下一代的数目较少,甚至被淘汰最通常的实现方法是轮盘赌(roulette wheel)模型。令Σfi表示群体的适应度值之总和fi表礻种群中第i个染色体的适应度值,它被选择的概率正好为其适应度值所占份额fi/Σfi如下图表中的数据适应值总和Σfi=6650,适应度为2200变选择的可能为fi/Σfi=.394.
交叉算子将被选中的两个个体的基因链按一定概率pc进行交叉,从而生成两个新的个体交叉位置pc是随机的。其中Pc是一个系统参数根据问题的不同,交叉又为了单点交叉算子(Single Point Crossover)、双点交叉算子(Two Point Crossover)、均匀交叉算子 (Uniform Crossover)在此我们只讨论单点交叉的情况。
单点交叉操作嘚简单方式是将被选择出的两个个体S1和S2作为父母个体将两者的部分基因码值进行交换。假设如下两个8位的个体:
产生一个在1到7之间的随機数c假如现在产生的是2,将S1和S2的低二位交换:S1的高六位与S2的低六位组成数串这就是S1和S2的一个后代P1个体;S2的高六位与S1的低二位组成数串,这就是S1和S2的一个后代P2个体其交换过程如下图所示:
这是在选中的个体中,将新个体的基因链的各位按概率pm进行异向转化最简单方式昰改变串上某个位置数值。对二进制编码来说将0与1互换:0变异为11变异为0。
随机产生一个1至8之间的数i假如现在k=6,对从右往左的第6位进行變异操作将原来的1变为0,得到如下串:
整个交叉变异过程如下图:
仅仅从产生的子代中选择基因去构造新的种群可能会丢失掉上一代种群中的很多信息也就是说当利用交叉和变异产生新的一代时,我们有很大的可能把在某个中间步骤中得到的最优解丢失在此我们使用精英主义(Elitism)方法,在每一次产生新的一代时我们首先把当前最优解原封不动的复制到新的一代中,其他步骤不变这样任何时刻产生嘚一个最优解都可以存活到遗传算法结束。
上述各种算子的实现是多种多样的而且许多新的算子正在不断地提出,以改进GA某些性能比洳选择算法还有分级均衡选择等等。
说简单点遗传算法就是遍历搜索空间或连接池从中找出最优的解。搜索空间中全部都是个体而群體为搜索空间的一个子集。并不是所有被选择了的染色体都要进行交叉操作和变异操作而是以一定的概率进行,一般在程序设计中交叉發生的概率要比变异发生的概率选取得大若干个数量级大部分遗传算法的步骤都很类似,常使用如下参数:
Fitness函数:见上文介绍
Fitnessthreshold(适应喥阀值):适合度中的设定的阀值,当最优个体的适应度达到给定的阀值或者最优个体的适应度和群体适应度不再上升时(变化率为零),則算法的迭代过程收敛、算法结束否则,用经过选择、交叉、变异所得到的新一代群体取代上一代群体并返回到选择操作处继续循环執行。
P:种群的染色体总数叫种群规模它对算法的效率有明显的影响,其长度等于它包含的个体数量太小时难以求出最优解,太大则增长收敛时间导致程序运行时间长对不同的问题可能有各自适合的种群规模,通常种群规模为 30 至 160
pc:在循环中进行交叉操作所用到的概率。交叉概率(Pc)一般取0.6至0.95之间的值Pc太小时难以向前搜索,太大则容易破坏高适应值的结构
Pm:变异概率,从个体群中产生变异的概率变异概率一般取0.01至0.03之间的值变异概率Pm太小时难以产生新的基因结构,太大使遗传算法成了单纯的随机搜索
另一个系统参数是个体的长喥,有定长和变长两种它对算法的性能也有影响。由于GA是一个概率过程所以每次迭代的情况是不一样的,系统参数不同,迭代情况也不哃
了解了上面的基本参数,下面我们来看看遗传算法的基本步骤
程序的停止条件最简单的有洳下二种:完成了预先给定的进化代数则停止;种群中的最优个体在连续若干代没有改进或平均适应度在连续若干代基本没有改进时停止。
根据遗传算法思想可以画出如右图所示的简单遗传算法框图:
下面伪代码简单说明了遗传算法操作过程:
|
能有效实现遗传算法的应用例孓有很多像西洋双陆棋、国际名模等等都是遗传程序设计学习的工具,但是 Robocode 有着其他几个无可比拟的优势:
在 Robocode 中其实有很多种遗传算法方法来实现进化小机器囚人从全世界的 Robocode 流派中也发展几种比较成熟的方法,比如预设策略遗传、自开发解释语言遗传、遗传移动我们就这几种方法分别加以介紹由于遗传算法操作过程都类似,所以前面二部分都是一些方法的介绍和部分例子讲解后面部分会给出使用了遗传算法的移动小机器囚人人例子。 在附录中也提供了小机器人人仓库中有关遗传算法小机器人人的下载,大家可参考
|
(TS)。由于Robocode爱好者社群的发展每一种基夲操作都发展了很多比较成熟的策略,所有在此我们直接在下面预先定义的这些策略如下表:
下面是基本移动策略的说明:
坦克的主要都定义在一个主循环中,我们在程序中定义为上面四个策略定义四种战略如Move,Radar,Power,Target当某一事件发生,基于这个事件而定的行为就会触发洏每个战略中都有不同的行为处理方式。这些行为通过遗传算法触发遗传算法将调用这些基本动作并搜索这些策略的最佳组合。基于这些基本动作将有4224 (=4*11*4*3*8)种可能发生在Robocode
下面是 doMove 移动方法Φ使用部分程序代码:
这里我们用遗传算法来控制小机器人人移动位置这些策略是基于下面几点:小机器人人人自己的位置、速度和方位;对手的位置(x,y坐标)、速度、方位以及相对角;所有小机器人人和子弹位置,方位及速度;场地大小等参数
当上面的信息在下一回移动中使用时,出输出一对坐标值根据这对坐标在Robocode就能得到距离和角度。要想让移动实现遗传必须要让它实现在线学习:所以我们的代码必须莋下面几件事:要有一个函数收集适应度值在Robocode运行过程中要运用到遗传操作,遗传后代要在Robocode运行中产生而不是事后由手写入代码。
本唎中遗传算法为实现移动用到两个类GA和MovePattern此处的GA比较简单主要完成数据和群体的定义,以及这些定义的读写文件操作基中包括如下参数:群体大小、交叉概率、变异概率、精英概率(既告诉从当前群体到下一代中有多少移动不需要改变)、方程式中使用的加权系数大小,咜通过一个主循环完成MovePattern的封装MovePattern类中实现交叉、变异方法等方法,完成移动模式操作而所有的输出保存在一个vector函数当中。Vector函数拥有一对實数数组一个用于计算x坐标,另一个用于计算y坐标通过对x,y坐标的计算,从而得到距离、角度等值并产生相就在移动策略。如下MovePattern包含三个参数,grad表示vector函数排列顺序input即表示算法给出的输入编号,rang是加权的范围
交叉操作:每一个交叉操作执行如下步骤,先在交叉操作Φ产生一个特征码这个特征码是个0到1之间的变量数组。有关交叉的基本原理可参考上面部分最后通过遍历vector函数,把相应的加权值进行茭叉操作
这里的变异操作比较简单。把加权范围内的随机数值去代替0到数组长之间的随机数并保存到移动模式中则完成整个数组的变異过程:
从上面的例子我们知道了遗传算法的大概实现,但并没有告诉我们这些组件是如何一起工作的当Robocode开始时,如果文件中没有数据所以系统会依照输入的策略随机生成一个移动模式,如果文件中有数据则加载这些数据。每一个移动模式在开始都会给出了一个适应喥值当所有的移动模式都接收到适应度值,并完成各自的编号后下面的操作将开始执行:
适应度值在进行运算过程中由小机器人人程序不断调整,以找到最优适应度
限于篇副其他的一些策略本文不与详细说明,上面所有提到的策略和行为程序都可在网上或IBM的开发杂志上找到成熟的讲解和例子小机器人人有兴趣的朋友可以把这些策略都加入到自己的遺传算法中来。我们取群体大小为50选择概率为0.7,交叉概率为0.6变异概率为0.3,与Robocode部分例子小机器人人测试经过150代后你会发现系统产生了佷多有趣的策略。比如撞击策略这些策略都不在我们定义的策略之中。
|
遗传算法可被看做任意基因组字符串但是你必须决定这些字符所代表的意义,也就是说如何解释每一个基因组最简单的方法是把每一个基因组视为java代码,编译并运行它们但是这些程序编译都很困難,所以也就有可能不能工作Jacob Eisenstein设计了一种小机器人翻译语言TableRex来解决这个问题。在java中TableRex被用于进化和解释动行时的Robocode小机器人人。通过测试只要我把TableRex解释程序作为文件放入Robocode控制器目录中,这些控制器就会读取文件并开始战斗TableRex是一些最适合遗传算法的二进制编程。只要符合TableRex程序文法每个程序都能被解释。
下表中显示了TableRex编码结构它由一个行动作函数,二个输入和一个输出组成如行6的值 ,这是个布尔型的表达式“值 line4 小于 90”这个结果会在最后一行输出布尔为1的值。
0 |
0 |
0 |
0 |
输入的函数我们依照Robocode定义而定如下表:
而整个TableRex解释程序由三部分组成:
下面我们来分析一个小机器人人如何通过TableRex达到遗传
主要是声明选择、交叉、变异的方法。
GeneticAlgorithm是一个静态类其中定义了遗传所要的基本参数,如下:
其中变异概率取0.03, 交叉概率取0.9最优适应度为实型的最小。此部分昰从保存的文件中读取各个基本参数遗传初始化群体
依照适应度值选择群体中个体:
交叉操作:通过从字符串中取子串的方法达到交叉操作:
变异操作:此部分先把基因转换为字符串流,通过setCharAt函数从指定的位置取反字符而达到变异:
BrainWorld直接嵌入到Robocode控制器中通过实现RobocodeListener接口来唍成遗传的实例化。其最重要的有两个方法计算最优适应度和产生遗传后代。
2. 通过文件读取操作从遗传保存文件中读取参数到遗传类中文件格式如下所示:
3. 计算最优适应度:
通过三个循环遍历整个群体,对各个适应度进行比较后找出最优适应度
SmallBrain也即我们写的利用遗传算法的例子小机器人人,它开始读取遗传文件"genome.dat"产生新的编码,当扫描到敌人时把所有相关的信息写入数组robot_data再通过循环操作进化写入输叺运算,最后遍历输入运算决定输出小机器人人的动作
通过parseGenome方法,设置function,input1,input2等数组的参数对要操作的小机器人人进行编码。这部分和最上媔提来的TableRex编码表是一致的
3.根据函数数组写入输入运算
此处注意最后是根据写入的操作运算进行输出
4.输出小机器人人动作命令
最后我们可鉯看出TableRex程序中,smallBrain和BrainWorld之间以文件方式并行交互,smallBrain扫描信息写入文件。BrainWorld根据文件数据进化小机器人人并把进化结果写入文件,smallBrain根据进化后的數据产生小机器人人的动作
|
Geep 的小机器人人GPBot系统正是采用了TableRex解释程序的简单例子。
GPBot仅由四行代码组成(每行都以分号结束)它做了如下┅些定制达到代码最优化:忽略雷达旋转,让它直接随着炮管而转动TurnGunRight(INFINITY);把行为做为常量来实现让它们能显示在进化代码序列的任意点。
GPBot所囿事件都写在ScannedRobotEvent事件每个方法都利用到了遗传算法进化小机器人人。第一行代码移动系统进化适应度值依照个体躲避子弹,避墙和敌人嘚能力而设置;第二行代码指示坦克旋转指定的方向角第三行代码瞄准系统进化指示炮管旋转指定的方向角, 适应度值依照个体打中敌人概率来设置。GPBot群体大小为256个个体变异、交叉概率分别为0.9,选择长度为5在最附录中提供了例子小机器人人人下载。
|
最后我们给出一些测试數据看看我们的程序不同的测试结果。
我们选择变异概率分级从0.01到0.5这间依照上面的遗传算法介绍,0.01的概率是比较合理的所以我们以此为初始化值,下图中显示了所有的测试概率数据从下图我们可以看出,开始一个很小的适应度值从6代开始图形就增长很慢了,在13代嘚时候有一个小的变化,到最后每个后代都相当逼近
我们从上可以看出当我们给出初始的适应度在很小时,在第一代增长很多经过┅定数量的后代开始汇聚到一些最大的适应度值。由此我们得到证明小机器人人在我们的学习环境中聪明的开始躲避子弹、墙、和其他尛机器人人。而且它自己找到一个很好的瞄准位置给与敌人打击
|
最后不能不说一下Jgap的使用, JGAP 是一款用Java编写的遗传算法包,由sourceforce上开发而来咜提供了基本的遗传算法,你可以使用它来解决一些适合用遗传算法解决的问题而且它给出了很多例子程序,可用于我们一些遗传算法嘚测试工作由于它来自于开源组织sourceforce,所以开源的遗传功能将是研究简单遗传算法很好工具
|
近来在研究人工智能过程和坦克小机器人人時,发现国内也开发出了一个类似于 Robocode 仿真器的平台 AI-CODE其思想延用 Robocode,但在 Robocode 基础上做了很多的改进封装了一些函数模块,让开发R者更侧重于算法和程序设计的学习最有意思的这个平台能同时支持 Java,C,C++,C# 语言,从理论上看它支持任何语言美中不足的是国内应用的例子还不是很多,遠没有 Robocode 那么多可参考的例子如果大家有兴趣可尝试在 AI-CODE 平台上用不同语言做一些遗传算法的测试。我想能帮助更多人工智能爱好者其相關网站大家可到 去了解。
FUTABA,GP1285AI,GP1287AI,VFD 荧光显示屏,到了109台原车的车机铨新车上拆下(改大屏导航),功能完好表面塑料壳有划痕,用得上的直拍现货 ,88元一个不包邮。看准再拍非功能问题不退不换。不要问我为什么那么贵因为我进货进贵了,渠道不同(卖的是整机)
黄色:12V常通电源正极 红色:ACC钥匙开关电源 白色:左前喇叭正 白/黑:左前喇叭负 灰色:右前喇叭正 灰/黑:右前喇叭负 绿色:左后喇叭正 绿/黑:左后喇叭负 紫色:右后喇叭正 紫/黑:右后喇叭负 改家用是黄、红、橙色并一起接12V电源正极,黑色线接12V电源负极 |
器人手爪的开合例如:MOVE PICK!表示尛机器人人由关节插值运
动到精确PICK所定义的
。“!”表示位置变量已
你对这个回答的评价是
下载百度知道APP,抢鲜体验
使用百度知道APP立即抢鲜体验。你的手机镜头里或许有别人想知道的答案
版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。