一维车辆世界

机器人初始化

想象一下,你有一个生活在一维世界中的机器人。这个机器人依存于九个不同空间的网格。它只能向前或向后移动。如果它从网格上脱落下来,则会绕回到另一侧。

这个机器人有一张地图,这样它可以知道只有九个空格。但机器人不知道它在地图上的位置。下面就是该一维地图。

1-D Robot World

第一次打开该机器人时,它在这些空间中的任何一个网格上的概率是1/9;其含义是该机器人在网格上任何一个空间的概率相等。

练习1 - 初始概率

现在,编写一个函数,输入机器人世界中的空间数量,然后返回一个包含网格上每个空间的初始概率的列表。

因此,在目前给出的例子中,将会有一个包含九个概率的列表。该列表中的每个值都是1/9。请牢记,因为机器人一开始并不知道它在哪里,所以在任何空间中的可能性都是一样的。

Python的 list.append()方法可能会有用。

import matplotlib.pyplot as plt
%matplotlib inline

import numpy as np
def initialize_robot(grid_size):
    grid = [1/grid_size] * grid_size
    return grid
def initialize_robot(grid_size):

    grid = []

    for i in range(grid_size):
        grid.append(1/grid_size)

    return grid

  

  

运行下面的单元格,确保你的函数输出的是正确的结果。

# Result should be a list with 9 elements all having value 1/9
assert initialize_robot(9) == [1/9, 1/9, 1/9, 1/9, 1/9, 1/9, 1/9, 1/9, 1/9]

# Result should be a list with 4 elements all having value 1/4
assert initialize_robot(4) == [1/4, 1/4, 1/4, 1/4]

print('Hooray! You just initialized a discrete probability distribution')

  

练习2 - 网格概率

现在,编写一个名为 grid_probability 的函数,输出机器人位于网格上特定点的概率。该函数的输入将是:

  • 先前函数的输出(即代表概率的一维映射的列表)
  • 你想知道的某一处的概率的网格编号

所以如果你想知道当前机器人在网格上的第五个网格上的概率,你可以调用如下函数:

grid_probability(my_grid, 4).

为什么函数输入是4而不是5呢? 想一想Python如何访问列表中的值。 键入mylist[0] 可以为你提供列表中的第一个元素。 键入 mylist[1] 可以为你提供列表中的第二个元素。

def grid_probability(grid, position):

    if position < len(grid):
        return grid[position]

    return None

  运行下面的单元格,测试代码的结果。 如果grid_probability函数按预期运行,则该代码单元格应该输出“Awesome work!”。

assert grid_probability([.1, .1, .2, .1, .5], 2) == 0.2
    
assert grid_probability([.1, .1, .2, .1, .5], 7) == None

print('Awesome work!')

  

练习3 - 将机器人世界可视化

接下来,编写一个输出条形图的函数,显示每个网格空间的概率。

请牢记,我们正在使用离散概率分布;机器人的位置只能取一定的数值,例如方格1,方格2,方格3,方格4等。

网格编号将位于x轴上。对于离散概率分布来说,y轴表示概率。

函数的输入是一个列表,其中机器人位于网格上的每个点上。

你的结果应该是这样的:

Uniform Probability Distribution

import matplotlib.pyplot as plt
import numpy as np

def output_map(grid):

    x_labels = range(len(grid))

    plt.bar(x_labels, grid)
    plt.xlabel('Grid Space')
    plt.ylabel('Probability')
    plt.title('Probability of the Robot Being at Each Space on the Grid')
    plt.show()

  

output_map([.2, .2, .2, .2, .2])

  

练习4 - 更新概率

最后的这个问题最具挑战性。你必须考虑循环和列表索引的工作方式。

随着机器人四处移动并感知其周围环境,它将更新其对地图上位置的判断。你将在接下来的本地化课程中了解这一点。

说明

现在,编写一个函数,更新每个网格空间的概率。该函数的两个输入如下:

  • 包含机器人在地图网格上的每个点的概率的列表
  • 包含新概率的列表清单。列表中的每个元素都有两个条目:第一个条目是地图网格上的一个点,第二个条目是更新的概率。

示例输入和输出

以下是一些示例输入:

机器人使用五格网图进行初始化,因此列表中的概率是

  • robot_grid = [0.2, 0.2, 0.2, 0.2, 0.2]

机器人发现,实际上它在第一个点 robot_grid[0]的概率为0.4,而在其他所有点的概率为0.15。所以第二个输入是类似这样的

  • updates = [[4, 0.15], [0, .4], [3, 0.15], [1, 0.15], [2, 0.15]]

    请注意,第二个输入并不是地图网格的顺序。第一个值是网格5(索引为4),然后是网格1(索引为0),然后是网格2(索引为3),以此类推。

更新变量也可能如下所示,不包含有关整个网格的信息:

  • updates = [3, 0.1], [4, 0.2]

因此,请考虑如何使用更新变量中的信息正确更改robot_grid中的值。

该函数的输出将是更新后的概率列表:

  • [0.4, 0.15, 0.15, 0.15, 0.15]

提示

要同时理解所有这些信息,可能会很困难。尝试拿出铅笔和纸来解决这个问题吧。

def update_probabilities(grid, updates):  

    for i in range(len(updates)):
        grid[updates[i][0]] = updates[i][1]

    return grid
def update_probabilities(grid, updates):
    for update in updates:
        grid[update[0]] = update[1] 
    return grid

  

运行下面的代码单元格,测试你的updates_probabilities函数。

assert update_probabilities([0.2, 0.2, 0.2, 0.2, 0.2], [[0, .4], [1, 0.15], [2, 0.15], [3, 0.15], [4, 0.15]]) == [0.4, 0.15, 0.15, 0.15, 0.15]
assert update_probabilities([0.2, 0.2, 0.2, 0.2, 0.2], [[1, 0.15], [0, .4], [4, 0.15], [2, 0.15], [3, 0.15]]) == [0.4, 0.15, 0.15, 0.15, 0.15]
assert update_probabilities([0.2, 0.2, 0.2, 0.2, 0.2], [[0, .25], [4, 0.15]]) == [0.25, 0.2, 0.2, 0.2, 0.15]

print('Everything looks good!')

  

原文地址:https://www.cnblogs.com/fuhang/p/8778040.html