2012-05-29 2 views
2

현재 강화 학습에서 유명한 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; 
} 

그러나이 계획의 결과. 이 두 변수를 어떻게 이산 적으로 이산시킬 수 있습니까?

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 man, 멋진 솔루션 –

0

당신은 당신의 위치와 속도를 제한하지 않는로 설정 언급하는 것을 잊었다. 기호가 너무 크면 (기호에 관계없이) 하드 코드 된 오프셋 값 (14 및 10)이 오버플로됩니다. 값을 결합하기 전에 값을 제한해야합니다.