2012-05-29 59 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)。在组合它们之前,您必须限制这些值。