Artificial intelligence 游戏中的Q-learning未按预期工作

Artificial intelligence 游戏中的Q-learning未按预期工作,artificial-intelligence,game-ai,q-learning,Artificial Intelligence,Game Ai,Q Learning,我已经尝试在我编写的一个简单游戏中实现Q-learning。游戏的基础是玩家必须“跳跃”以避开迎面而来的盒子 我设计了两个动作的系统跳转和不做任何事和状态是与下一个块的距离(分割和地板以确保没有大量状态) 我的问题似乎是,我的算法实现没有考虑“未来回报”,因此它最终在错误的时间跳转 这里是我的Q-学习算法的实现 JumpGameAIClass.prototype.getQ=函数getQ(状态){ 如果(!this.Q.hasOwnProperty(state)){ 这个.Q[状态]={}; 对于

我已经尝试在我编写的一个简单游戏中实现Q-learning。游戏的基础是玩家必须“跳跃”以避开迎面而来的盒子

我设计了两个动作的系统<代码>跳转和
不做任何事
和状态是与下一个块的距离(分割和地板以确保没有大量状态)

我的问题似乎是,我的算法实现没有考虑“未来回报”,因此它最终在错误的时间跳转

这里是我的Q-学习算法的实现

JumpGameAIClass.prototype.getQ=函数getQ(状态){
如果(!this.Q.hasOwnProperty(state)){
这个.Q[状态]={};
对于(var actionIndex=0;actionIndex=0&(最近距离==-1 | |距离<最近距离)){
最近距离=距离;
}
}
返回Math.max(0,Math.floor(最近的*this.resolution));
};
JumpGameAClass.prototype.getActionWithHighestQ=函数getActionWithHighestQ(距离){
var jumpReward=this.getQ(距离)[this.actions[0]];
var doNothingReward=this.getQ(距离)[this.actions[1]];
如果(跳转奖励>不执行奖励){
返回此。操作[0];
}否则如果(不执行奖励>跳跃奖励){
返回此。操作[1];
}否则{
如果(!this.canJump()){
返回此。操作[1];
}
返回this.actions[Math.floor(Math.random()*this.actions.length)];
}
};
JumpGameAClass.prototype.getActionEpsilonGreedy=函数getActionEpsilonGreedy(){
//我们不能在半空中跳
如果(!this.canJump()){
返回此。操作[1];
}
if(Math.random()
以下是它使用的一些属性:

epsilon:0.05,
阿尔法:1,
伽马:1,
决议:0.1,
操作:[“跳转”、“不做任何事”],
问:{},
利沃德:0,
积分奖励:100,
死亡奖励:-1000,
最后一个动作:“什么都不做”,
最后距离:0,
最后得分:0
我必须使用lastAction/lastDistance来计算Q,因为我无法使用当前数据(将作用于前一帧中执行的动作)

在所有渲染和游戏内容(物理、控制、死亡等)完成后,每帧调用一次
think
方法

var JumpGameAIClass=函数JumpGame(画布){
Game.JumpGame.call(这个,画布);
对象。定义属性(此{
ε:{
数值:0.05
},
阿尔法:{
价值:1
},
伽马:{
价值:1
},
决议:{
数值:0.1
},
行动:{
值:[“跳转”,“不做任何事”]
},
问:{
值:{},
可写:对
},
利沃德:{
数值:0
},
计分奖励:{
数值:100
},
死亡奖励:{
值:-1000
},
最后行动:{
值:“什么都不做”,
可写:对
},
最后距离:{
值:0,
可写:对
},
最后得分:{
值:0,
可写:对
}
});
};
JumpGameAClass.prototype=Object.create(Game.JumpGame.prototype);
JumpGameAClass.prototype.getQ=函数getQ(状态){
如果(!this.Q.hasOwnProperty(state)){
这个.Q[状态]={};
对于(var actionIndex=0;actionIndex=0&(最近距离==-1 | |距离<最近距离)){
最近距离=距离;
}
}
返回Math.max(0,Math.floor(最近的*this.resolution));
};
JumpGameAClass.prototype.getActionWithHighestQ=函数getActionWithHighestQ(距离){
var jumpReward=this.getQ(距离)[this.actions[0]];
var doNothingReward=this.getQ(距离)[this.actions[1]];
如果(跳转奖励>不执行奖励){
返回此。操作[0];
}否则如果(不执行奖励>跳跃奖励){
返回此。操作[1];
}否则{
如果(!this.canJump()){
    epsilon: {
        value: 0.01
    },
    alpha: {
        value: 0.7
    },
    gamma: {
        value: 0.9
    },
    resolution: {
        value: 0.1
    },  
    liveReward: {
        value: 10
    },
    scoreReward: {
        value: -100
    },
    deathReward: {
        value: 1000
    },
Q(s, a)=r(s,a)+gamma*max_a'(Q(s', a'))