【发布时间】:2019-04-06 18:18:19
【问题描述】:
我是强化学习的新手。我最近了解了近似 q 学习,或基于特征的 q 学习,其中您通过特征描述状态以节省空间。我试图在一个简单的网格游戏中实现这一点。在这里,代理应该学会不进入火坑(由 f 表示),而是尽可能多地吃掉点。这是使用的网格:
...一个
.f.f
.f.f
...f
此处 A 表示代理的起始位置。现在,在实施时,我设置了两个功能。一个是 1/((到最近点的距离)^2),另一个是 (到火坑的距离) + 1。当代理进入火坑时,程序返回 -100 的奖励。如果它去到一个已经被访问过的非火坑位置(因此没有要吃的点),奖励是-50。如果它到达一个未访问的点,则奖励为 +500。在上面的网格中,无论初始权重是多少,程序都不会学习到正确的权重值。具体来说,在输出中,第一个训练会话的得分(它吃了多少个点)为 3,但对于所有其他训练会话,得分仅为 1,并且权重收敛到权重 1 的错误值 -125(到火坑的距离)和 25 权重 2(到未访问点的距离)。我的代码有什么特别的问题,还是我对近似 q 学习的理解不正确?
我尝试过使用环境给予的奖励以及初始权重。这些都没有解决问题。 这是整个程序的链接:https://repl.it/repls/WrongCheeryInterface
这是主循环中发生的事情:
while(points != NUMPOINTS){
bool playerDied = false;
if(!start){
if(!atFirepit()){
r = 0;
if(visited[player.x][player.y] == 0){
points += 1;
r += 500;
}else{
r += -50;
}
}else{
playerDied = true;
r = -100;
}
}
//Update visited
visited[player.x][player.y] = 1;
if(!start){
//This is based off the q learning update formula
pairPoint qAndA = getMaxQAndAction();
double maxQValue = qAndA.q;
double sample = r;
if(!playerDied && points != NUMPOINTS)
sample = r + (gamma2 * maxQValue);
double diff = sample - qVal;
updateWeights(player, diff);
}
// checking end game condition
if(playerDied || points == NUMPOINTS) break;
pairPoint qAndA = getMaxQAndAction();
qVal = qAndA.q;
int bestAction = qAndA.a;
//update player and q value
player.x += dx[bestAction];
player.y += dy[bestAction];
start = false;
}
我希望这两个权重仍然是正的,但其中一个是负的(那个给出到火坑的距离)。
我还希望程序能够通过超时了解到进入火坑是不好的,也不好,但不是那么糟糕,去一个未被访问的点。
【问题讨论】:
标签: c++ machine-learning reinforcement-learning q-learning