分化困境

时间:2012-05-29 04:22:40

标签: java math reinforcement-learning calc

我目前正在从强化学习中着名Mountain Car problem。这个问题具有连续性,这意味着我有两个变量:一个位置 - 范围从-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;
}

但是这种方案导致一些扇区具有相同的索引号。您是否知道如何将这两个连续变量离散化?

更新抱歉忘记提及当位置或速度超过最大值或最小值时,我将其设置回最大值或最小值

2 个答案:

答案 0 :(得分:2)

您对所有这些签名检查过于复杂。此外,你应该避免使用魔术常量 - 给他们有意义的名字。离散化代码应如下所示:

double normalize(double value, double min, double max) {
    return (value - min) / (max - min);
}

int clamp(int value, int min, int max) {
    if (value < min) value = min;
    if (value > max) value = max;
    return value;
}

int discretize(double value, double min, double max, int binCount) {
    int discreteValue = (int) (binCount * normalize(value, min, max));
    return clamp(discreteValue, 0, binCount - 1);
}

public int discretizeObservation(Observation observation ) {
    int position = discretize(observation.getDouble(0), minPosition, maxPosition, positionBinCount);
    int velocity = discretize(observation.getDouble(1), minVelocity, maxVelocity, velocityBinCount);
    return position * velocityBinCount + velocity;
}

答案 1 :(得分:0)

你不是限制你的位置和速度。当它们太大(无论什么标志)时,它们将溢出硬编码的偏移值(14和10)。您必须在合并之前限制值。