首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >离散困境

离散困境
EN

Stack Overflow用户
提问于 2012-05-29 04:22:40
回答 2查看 895关注 0票数 2

我目前正在从强化学习中学习著名的山地汽车问题。这个问题是连续的,这意味着我有两个变量:一个位置-范围从-1.2到0.5,速度范围从-0.07到0.07。我有三种可能的动作--反向加速,正向加速度和中性,动作会在适当的方向改变位置。由于加速度的计算方法,我的位置变量是连续的,这意味着我不能使用查找表,所以我尝试将矩形扇区中的位置-速度轴划分为宽度为0.005 .0 5的桶,将速度分成0.005长的桶,为每个扇区分配一个指数,我这样做:

代码语言:javascript
复制
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:对不起,忘记提到当位置或速度超过最大值或最小值时,我将其设置为最大值或最小值。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2012-05-30 12:29:21

你把所有的符号检查都搞得太复杂了。此外,您应该避免使用魔术常量-给它们有意义的名称。离散化代码应该如下所示:

代码语言:javascript
复制
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;
}
票数 2
EN

Stack Overflow用户

发布于 2012-05-29 04:48:17

你没有限制你的位置和速度。当它们太大时(不管是什么符号),它们都会溢出硬编码的偏移值(14和10)。在组合这些值之前,必须限制它们。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/10793034

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档