2012-05-29 92 views
2

我目前正在從強化學習着名Mountain Car problem。這個問題具有連續性,這意味着我有兩個變量:一個位置 - 從-1.2到0.5,速度 - 從-0.07到0.07。而且我有3種可能的行動 - 反向加速,前進加速和空擋,導致適當方向的位置變化。由於計算加速度的方式,我的位置變量是連續的,這意味着我不能使用查找表,所以我試圖在矩形扇區中分割位置 - 速度軸,將位置分爲寬度爲0.05和速度爲0.75的桶和速度爲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; 
} 

但這個方案的結果具有相同索引號的一些部門。你有什麼想法我該如何離散這兩個連續變量?

UPD:對不起忘了提,當位置或速度超過最大值或最小值我將其設置回最大值或最小值

+0

我想我做的時候聲稱,一些部門有相同的索引號,只需再次檢查函數的最後一行,它確實導致不同的索引號是錯誤的。對不起,打擾你們 –

+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; 
} 
+0

Thx男人,很好的解決方案 –

0

你不限制你的位置和速度。當它們太大(不管是什麼符號)時,它們會溢出硬編碼的偏移值(14和10)。在組合它們之前,您必須限制這些值。