Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/algorithm/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Algorithm 贪婪算法:机器人_Algorithm_Pseudocode_Greedy - Fatal编程技术网

Algorithm 贪婪算法:机器人

Algorithm 贪婪算法:机器人,algorithm,pseudocode,greedy,Algorithm,Pseudocode,Greedy,有什么想法吗?我试着把它画出来,缩小了你需要的机器人的最小数量,但我不知道如何用贪婪算法来表达它,或者如何证明它。这是我们讲座中的一个附加问题,所以我们不必知道如何做,但我觉得这是一个很好的练习。提前谢谢 或者更简洁地说: If there are coins to the right: go right Otherwise: go down 编辑: 要想知道该算法是最优的,因为它需要最少的机器人总数来清除棋盘,请注意,没有一个机器人的动作比最优机器人更差:“贪婪保持领先”。下面是一个让这个

有什么想法吗?我试着把它画出来,缩小了你需要的机器人的最小数量,但我不知道如何用贪婪算法来表达它,或者如何证明它。这是我们讲座中的一个附加问题,所以我们不必知道如何做,但我觉得这是一个很好的练习。提前谢谢

或者更简洁地说:

If there are coins to the right: go right
Otherwise: go down
编辑: 要想知道该算法是最优的,因为它需要最少的机器人总数来清除棋盘,请注意,没有一个机器人的动作比最优机器人更差:“贪婪保持领先”。下面是一个让这个论点更正式的尝试:

设G为贪婪算法,R为任意最优算法

从单个机器人的角度来看,有一些硬币可以够得到。例如,从起始位置开始,所有硬币都在伸手可及的范围内(当然,有些硬币可能是相互排斥的)。当机器人r移动时,S的子集V对于r变得不可到达。很明显,对于任何单次移动,只需要一个额外的机器人来获取V中的所有硬币。因此,在某种意义上,最糟糕的单个移动将是V不为空,并且单次移动不可能导致算法需要两个或多个额外的机器人

对于G中的机器人,除非S为空,否则V始终是S的真实子集。换句话说,G不会做出任何“明显愚蠢”的动作。再加上G和R收集所有硬币的事实,我们发现机器人唯一有趣的不同之处是,他们在拿走同一枚硬币后做出不同的选择(向下或向右)

考虑机器人r in r和g in g的不同点。有两种可能性:

  • g向右移动,r向下移动
  • g向下,r向右
  • 在第一种情况下,右边有一枚硬币,r下降。因此,在这一步,对于r,V不是空的,根据前面的论证,g的决定不会更糟

    在第二种情况下,右边没有硬币,g下降。很明显,V对于g是空的,r的决定再好不过了

    我们看到,在R和G不同的任何情况下,G至少和R一样好,这是最优的,所以G也必须是最优的

    我只是不知道如何用贪婪算法来表达它

    使用

    那么一个贪婪的启发式可能是

    • 对于任何机器人:

    • 右下看最近的硬币(使用出租车区
      min(deltaX,deltaY)
    • 收集
    • 从当前点开始,重复步骤1

    只需在第一步“退出”一个看不到硬币的机器人。

    距离使用曼哈顿距离

    While robot cannot move:
        if robot is at right edge:
            nextStep = down
        if robot is at bottom edge:
            nextStep = right
        nextStep = F(right,down)
    
    F(right,down):
        if(distanceAll(right)<distanceAll(down))
            return right
        else return down
    
    distanceAll(location):
        return the sum of distance between this location to remaining coins
    
    机器人无法移动时:
    如果机器人位于右边缘:
    下一步=下一步
    如果机器人位于底部边缘:
    下一步=右
    下一步=F(右下)
    F(右下):
    
    如果(距离所有(右)反例:00=开始,23=结束,硬币在:10,01,02,03,12,22如果机器人从左上角开始,走到左下角,它不能向左移动,那么它只能向下移动。我认为第二个限制应该是机器人走到右下角。机器人知道硬币的位置,还是只是“绊倒”硬币行走?在任何情况下,你最多需要8个机器人:第一个机器人从0,0开始向右移动到边缘,然后向下移动。下一个机器人从0,0开始向下移动一行,然后向右移动到边缘,然后向下移动。下一个机器人向下移动两行,以此类推。如果机器人可以向前看,那么最坏情况下的机器人数量至少为(占用的行、占用的列)。也就是说,如果只有2行包含硬币,那么你只需要2个机器人。这很好,可能比我的答案更直观。可能也更容易证明最优。但需要始终以相同的方式打破联系,否则可能不是最优的。如果第一个机器人这样做,则不是最优的:不是我。谢谢你的回答。
    While robot cannot move:
        if robot is at right edge:
            nextStep = down
        if robot is at bottom edge:
            nextStep = right
        nextStep = F(right,down)
    
    F(right,down):
        if(distanceAll(right)<distanceAll(down))
            return right
        else return down
    
    distanceAll(location):
        return the sum of distance between this location to remaining coins