移动机器人最佳地沿网格移动

时间:2014-02-23 16:04:32

标签: algorithm dynamic-programming

有一个大小为N*M的迷宫,由单位块组成。一开始机器人的电池充电率为R%。现在机器人从第1行开始向第N行移动。从当前块中,机器人可以移动到下一行中的块,该块位于当前块的右侧或左侧。在第i行第j列移动到块时,如果C(i,j)大于0,则机器人电池电量将减少C(i,j)%,否则将按C(i,j)%充电。

例如,如果电池有50%的电量,在用C(i,j) = 15移动到阻止时,电池将有35(50-15)%的电量。

现在我们想要了解电池的最终状态,如果机器人最佳地移动以节省最大电量。

注意:电池电量不会超过100%,如果电池电量降至0%,机器人将无法进一步移动。

示例:LET N*M网格为4*4,如下所示:

 10 -10 10 -10

-10 10 -10  10

 5  -5   5  -5

-5  -5  -5  -5

如果初始电池充电为50(= R),那么这里的答案将是80,因为其中一个最佳动作将是

<1,2> -> <2,1> -> <3,2> -> <4,1>
在这一举动中,机器人获得了30%的电量,因此最终电池将有80%的电量。

2 个答案:

答案 0 :(得分:0)

显然,所描述的问题是具有负运动成本的路径发现问题。特别是如果您的机器人的电池可能被过度充电。这类问题通常由A-star searching algorithm解决。

答案 1 :(得分:0)

这个问题有一个简单的算法:

int charge(int x, int y, int battery){
    //Check to see if we've been in this cell with this battery before
    //You'll have to write the functions hasMemorized and memorized to return the value
    //In Java you can use a simple hash map

    if (hasMemorized(x, y, battery)){
        return memorized(x, y, battery);
    }

    if (battery<0 || x<0 || x>=N){
         //We are dead and cannot move
         return -Inf;
    }

    if (y>=M){
        //We have reached our goal; return battery
        return battery;
    }

    //Otherwise, try again
    int val =MAX( charge(x-1, y+1, battery-cost(x-1, y+1)), 
                charge(x,   y+1, battery-cost(x,   y+1)), 
                charge(x+1, y+1, battery-cost(x+1, y+1)));
    setMemorized(x,y,battery, val);

    return val;

  }

然后致电:

int optimalCharge = 
           MAX( charge(1, 0, 100), 
                charge(2, 0, 100), 
                ... 
                charge(N-1, 0, 100));