“机器人”一词起源于捷克语,意为强迫劳动力或奴隶。这个词是由剧作家 Karel Capek 引入的,他虚构创作的机器人很象 FrankenSTein 博士的怪物-由化学和生物学方法而不是机械方法创造的生物。但现在流行文化中的机械机器人和这些虚构的生物创作物没多大区别。
在制造业领域,机器人的开发集中在执行制造过程的工程机器人手臂上。在航天工业中,机器人技术集中在高度专业的一种行星漫步者上。不同于一台高度自动化的制造业设备,行星漫步者在月亮黑暗的那一面工作- 没有无线电通讯 -可能碰到意外的情况。至少,一个行星漫步者必须具备某种传感输入源、某种解释该输入的方法和修改它的行动以响应改变着的世界的方法。此外,对感知和适应一个部分未知的环境的需求需要智能(换句话说就是人工智能)。
前段时间做了个人机对战的五子棋游戏,觉得人工智能非常有意思。所以最近没事,又思考了一下机器人足球的人工智能算法。
机器人足球和五子棋游戏的主要联系是:都需要随时分析整个棋盘/球场的状态,并作出最合适的反应;主要区别是:五子棋游戏是回合制的,而机器人足球是“即时”游戏,另外五子棋只要基于某一步棋子考虑,但机器人足球必须考虑23个人/球(棋子)。
表面看区别蛮大的,现在具体来分析一下:
⒈ 关于机器人足球的“即时”特点
22个人,再加上一个足球,场上一共有23个物体在同时运动。我们不可能说机器人足球和五子棋一样,先一个人动,其他人站着,第一个动完再第二个人动…这样不是在踢球,而是在表演节目。如果当年《星际争霸》这样的即时战略游戏,当人全部部署好之后,按一个ready键通知计算机,然后计算机慢慢悠悠测挨个处理它控制的坦克,那还有什么乐趣。
有人肯能会说可以用多线程;没错,多线程确实可以同步处理,并且对于足球这样的游戏,场上人员是确定的(不考虑被红牌罚下的),用23个线程来控制人和球,似乎也没什么不妥。但我想即使是用多线程,也肯定有专门的算法对其进行优化。
所以我认为,对于机器人足球,只需要轮循计算机控制的所有球员,让每个球员针对场上情况作出最正确的响应就行了。计算机的速度非常快,虽然是轮循,但几乎不会察觉出其中的先后次序,给人的感觉就是在同时进行。其实操作系统的多线程,也是这样实现的。X86构架的cpu,多线程多任务程序是运行在保护模式下的,其根本思想就是将cpu时间切片,这个时间片上处理a任务,不管有没有处理完,下一个时间片上一定处理b任务,一圈循环下来,再继续执行未完成的a任务。
但是还有一个问题。由于计算机的反应远比人快,如果设计FIFA这样的人机交互游戏,很可能计算机将它控制的所有物体都计算好多遍了,可人还没作出反应呢。对于强调反应能力的即时制游戏,这种思维速度的差距可能无法接受。我的看法是,可以让计算机处理完一遍所有物体后,暂时停顿一段时间,比如500ms,比如1s(具体长度需要测试后才能得出)。而且,计算机停顿时间的长短,也可以用来区分难度,难度越低,计算机停顿的时间也越长。当然,我这里所说的停顿,并不是指计算机真的停止处理任何事务。计算机仍需要按照事先设定的运动方向和速度计算每个球员的新坐标并不断刷新,以显示出动画效果。只是每隔1s钟,才会作出特殊反应(踢球、抢断等),改变运动方向和速度
⒉ 机器人足球计算机考虑的点比五子棋多
场上有23个物体需要计算机处理,情况似乎比五子棋复杂的多了。但真的需要无差别的处理23个物体吗?
对于球来说,虽然它随时都在运动,但抽象看来,它在场上的情况非常简单:向某个方向运动,运动速度如何,目前所在的坐标,就这么三个要素。其他的什么由哪方控制,谁踢了一脚,都不需要也不应该考虑。
再来看看22个运动员。其实我们可以发现,往往只有离球最近的球员,才会作出相应的反应(包括盘带/踢球、传球、接球、抢断、射门等,都只有靠近球的队员才会作出,甚至防守的时候,也往往是防守有球的球员,归根到底还是离球非常近)。所以离球较远的球员,只需向球跑动甚至暂时停止不前(这个可以用随即函数来控制。影响随机值的是球员的积极性和离球的远近。积极的球员更加主动的奔跑,离球稍近的奔跑更主动)。只有离球近的球员,才会作出特殊的处理。这样细细划分后,整体算法思路就比较清晰了。
通过上面的分析,现在来总结一下:
设计机器人足球的时候,可以使用轮循的方法,挨个处理22个队员和1个球。一般情况下,处理方法也就是:通过原来的坐标和事先确定的方向、速度,计算新的坐标。当计算完所有物体的新坐标后,刷新屏幕,以显示出动画效果。
每隔一段时间,允许计算机对每个物件作出特殊操作(踢球、传球等),这些特殊操作的本质就是改变23个物体的速度和方向,使接下来一段时间物体的运动轨迹产生变化。
做特殊