我目前正在研究强化学习中著名的山地车问题。这个问题具有连续性,这意味着我有两个变量:一个位置 - 从 -1.2 到 0.5 和速度 - 从 -0.07 到 0.07。我有 3 种可能的动作 - 反向加速、向前加速和空档,动作会导致在适当方向上改变位置。由于如何计算加速度,我的位置变量是连续的,这意味着我不能使用查找表,所以我尝试将位置速度轴划分为矩形扇区,将位置划分为宽度为 0.05 的桶,将速度划分为长度为 0.005 的桶,为每个部门分配一个索引,我是这样做的:
public int discretiseObservation(Observation observation) {
double position = observation.getDouble(0) ;
double velocity = observation.getDouble(1);
boolean positionNegativeFlag = position < 0;
boolean velocityNegativeFlag = velocity < 0;
double absolutePosition = Math.abs(position);
double absoluteVelocity = Math.abs(velocity);
double discretePosition = Math.floor(absolutePosition / 0.05);
double discreteVelocity = Math.floor(absoluteVelocity / 0.005);
if(velocityNegativeFlag) {
discreteVelocity += 14;
}
if(positionNegativeFlag) {
discretePosition += 10;
}
return (int)discretePosition * 28 + (int)discreteVelocity;
}
但是这种方案会导致某些扇区具有相同的索引号。您知道如何离散这两个连续变量吗?
更新:抱歉忘了提到当位置或速度超过最大值或最小值时,我将其设置回最大值或最小值