《最强基因》神经网络+遗传算法训练游戏AI

链接

Cocos商城:Cocos Store
体验地址:Cocos Creator | zqjy

简介

一款结合神经网络和遗传算法的AI训练小游戏,玩家将体验人工智能的训练过程,通过进化算法与神经网络的结合,让AI不断学习、进化,并在游戏中与其他AI对抗。

游戏规则

  • 随着时间推移每个个体会逐渐掉血,血量归零则会生出新的个体。
  • 吃食物可以恢复一定血量。
  • 击杀其他个体,可以把其他个体的血量加到自己身上

训练结果示例

  • 一开始没经过训练,个体都不懂得抢食物,只会乱走

  • 在禁止攻击其他个体的时候,个体会逐渐增加抢食物能力和存活能力,如:速度变快、个体变大、血量变多、吃食物恢复能力变强等

  • 在允许攻击其他个体的时候,种群的行为会变得不稳定。

  • 在攻击行为多的时候,个体就减少移动速度,减少个体大小,从而降低中弹几率

  • 在攻击行为不多的时候,个体属性将随着环境的变化而变化

神经网络实现

  • 分输入层、隐藏层、输出层,隐藏层可以设置多个节点,但是只实现一层。
  • 一个个体属性对应一个神经网络。
  • 例如方向预测神经网络:
//初始化
if (this.moveDirNeuralNetworkCom == null)
    this.moveDirNeuralNetworkCom = this.node.addComponent(NeuralNetworkCom);
this.moveDirNeuralNetworkCom.init(2, 10, 2);//目标方向->该个体移动方向

//预测移动方向
input = [dir.x, dir.y]//目标方向
let output = this.moveDirNeuralNetworkCom.forward(input)//通过神经网络计算出结果
this.dir.set(output[0], output[1], 0);
this.dir = this.dir.normalize()//最终个体应该往哪个方向走
  • 通过神经网络的各个权重计算出结果,因此个体的是否优秀,实际就是神经网络的各个权重是否准确

遗传算法

  • 要产生优秀的个体,需要优秀的基因(也就是优秀神经网络的权重),因此需要通过遗传算法来筛选优秀个体。
  • 遗传算法主要分选择、交叉、变异。
  • 选择:也就是挑选优秀个体作为祖先繁衍新个体。这个示例中是使用存活时间长的个体,随机挑选两个作为祖先繁衍新个体。
  • 交叉:双亲样本的部分染色体互换。这个示例直接用双亲基因交叉组成新个体基因(也就是双亲的神经网络权重交叉组成新基因)。
  • 变异:就是基因突变。在交叉组成新个体基因的时候,设置1%的突变率,随机一个新基因(新权重)。
//遗传算法
let lst = []
for (let i = 0; i < lst1.length; i++) {
    if (RandomUtils.randomNum(0, 100) <= this.changeRate) {
        lst.push(RandomUtils.randomData())
    } else if (RandomUtils.randomBool()) {
        lst.push(RandomUtils.getPrecision(lst1[i]))
    } else {
        lst.push(RandomUtils.getPrecision(lst2[i]))
    }

}

神经网络+遗传算法

  • 神经网络的作用是预测结果作为状态数据控制个体行为,但是要做出准确的预测就需要准确的权重。
  • 遗传算法的作用是通过筛选优秀个体,不断筛选出优秀的权重,从而能获取更准确预测的神经网络。
  • 优点:算法简单,适用性强,找到影响结果的输入值即可。
  • 缺点:通过遗传算法筛选优秀个体耗时长,并且难以筛选出最优秀的个体(一般只能选出当前环境较优的个体),并且筛选时间可长可短。

应用

  • 玩家间的AI决斗:训练出来的优秀个体,只需要保存下它的神经网络权重,后续直接读取记录值用于预测即可。
  • 游戏的强力AI训练:要融入自己的游戏,就要找好自己游戏的输入变量、输出变量。输入变量一般是个体自己的状态、以及环境和敌人状态。输出变量一般是个体自己的状态与操作。
  • 行为分析:用于模拟一些环境中个体行为并对行为结果分析。

联系作者

6赞

还有高手~

太强了,6666

火钳刘明!!!

太强了
!!

前排围观,mark一下

火钳刘明!!!

不明觉厉.

$:cow::pen:plus

88元一点也不亏

虽然不懂,但是+666