2

私は現在、強化学習から有名なマウンテンカーの問題に取り組んでいます。この問題は連続的な性質のものです。つまり、2 つの変数があります。1 つの位置 - -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つの連続変数をどのように離散化できるか考えていますか?

Upd:申し訳ありませんが、位置または速度が最大値または最小値を超えた場合は、最大値または最小値に戻します。

4

2 に答える 2

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;
}
于 2012-05-30T12:29:21.253 に答える
0

位置と速度を制限していません。それらが大きすぎると (符号に関係なく)、ハードコードされたオフセット値 (14 と 10) をオーバーフローします。値を結合する前に値を制限する必要があります。

于 2012-05-29T04:48:17.510 に答える