我正在开发简单的游戏程序来展示线性函数逼近的 q-learning。 截屏
在这个游戏中,有不可数的状态。我必须考虑很多因素,比如玩家的位置、速度和敌人的位置(有 12 ~ 15 个敌方物体)。我最终将我的算法从使用表更改为使用线性函数逼近。
我决定了大约 20 ~ 22 个特征。(常数,玩家位置,玩家速度,所有敌人的位置)。并且有
实施该算法后,我陷入了一些问题。
运行我的程序后,权重值会在几秒钟内溢出。我发现我没有标准化特征和重量。
归一化特征值很容易,因为每个特征都有其界限。然而,仅仅标准化特征值是不够的。它仍然会溢出。
我的问题是如何标准化我的体重。
下面是我实现功能标准化的代码。
//f is feature
f[0] = 1;
f[1] = this.getNormMinMax(this.player.x,0,cc.winSize.width);
f[2] = this.getNormMinMax(this.player.vel,-80,80);
for(var i=0; i<pooList.length;++i)
{
f[3 + 2*i] = this.getNormMinMax(pooList[i].x,0,cc.winSize.width);
f[3 + 2*i+1] = this.getNormMinMax(pooList[i].y,0,cc.winSize.height*3);
}
下面的代码是在没有任何标准化的情况下更新权重。
for(var i=0; i<this.featureSize; ++i)
{
var w = this.weightArray[this.doAction][i];
this.weightArray[this.doAction][i] =
w + this.learningRate*(this.reward + this.discountFactor*maxAction - this.updateQSA) * f[i];
}