基于分数系统(Scoring System)的AI设计(1)

最近在做的一个AI用到了分数系统,这次就来和大家聊聊这个话题。

先来设计一个场景,有一个单兵作战的士兵,在丛林中,他有一些基本的行为,比如射击(shoot),移动(move),撤退(retreat)。他必须结合很多因素来决定自己的行为,比如,敌人的数量,自身的情况,弹药的情况,环境的情况等等,我们现在就来为这个士兵写AI来模拟他的行为。

AI常常用到一些if-else的逻辑判定(这种方式,在AI中叫基于规则的AI,Rule-Based System),对一些简单并且确定的逻辑,这种方式十分的便捷有效。但在上面这个场景中,如果单纯的用if-else,会使代码很快变的杂乱和难以维护,我们可以试着写一下,假设我们需要考虑以下两个个要素:

1. 敌人的数量(Enemy Count,EC)
2. 自己的负伤程度(Hit point,HP,用0~100来表示)

我们定义以下规则

规则1. 如果 EC = 0,那么 Move
规则2. 如果 HP < 30,那么 Retreat
规则3. 如果 EC > 4,那么Retreat
规则4. 如果 0< EC <= 2 并且 HP >= 30 那么 Shoot
规则5. 如果 2< EC <= 4 并且 HP > 70 那么 Shoot
规则6. 如果 2< EC <= 4 并且 HP <= 70 那么 Retreat

这些规则可以转换成相对应的if-else,但这样一个简单的情形(两个条件,三个结果),我们就需要6条规则来描述,如果我们需要其他一些考虑因素,比如,弹药,环境,那用这样的结构就很难维护了。对这种多因素判定的情况,我们就可以尝试用分数系统来做。分数系统的一个基本思想,是为每个单独的行为打分,根据分数的高低来决定做哪个行为,而所有的因素就是打分的依据。上面这个场景中,我们有三个独立行为,在每次的AI选择中,我们来为这些行为打分,下面我们来试着把这个士兵的AI用分数系统来做:

假设我们的分数是从0~100,Clamp(v, l, h)是指如果v<l,则v=l,或者如果v>h,则v=h,Max值取两者较大的那个值

1. Move:   s = Clamp(100*(1 – EC), 0, 100)
2. Retreat:s1 = Clamp(100 – HP, 0, 100)
s2 = Clamp(25 * EC, 0, 100)
s = (s1 + s2)/2
3. Shoot: s1 = Clamp(HP, 0, 100)
s2 = Clamp(100 – 25 * Max(EC, 1), 0, 100)
s = (s1 + s2)/2

我们来做一些测试:

1. HP = 60, EC = 2
Move(0), Retreat(45), Shoot(55) –> Shoot
2. HP = 20, EC = 1
Move(0), Retreat(52.5), Shoot(47.5) –> Retreat
3. HP = 100,EC = 5
Move(0), Retreat(50), Shoot(50) –> Shoot or Retreat
4. HP = 70, EC = 0
Move(100), Retreat(15), Shoot(72.5) –>Move

有上面的测试可以看出,大部分还是能符合我们预先定义的一些规则……

(待续)

ps: 本来想一下写完了,可是太晚了,最近身体不是很好,要早点休息了,明天再补完

————————————————————————
作者:Finney
Blog:AI分享站(http://www.aisharing.com/)
Email:finneytang@gmail.com
本文欢迎转载和引用,请保留本说明并注明出处
————————————————————————

(已被阅读4,085次)

发表评论

邮箱地址不会被公开。

此站点使用Akismet来减少垃圾评论。了解我们如何处理您的评论数据

Copyright © 2011-2020 AI分享站    登录