一维车辆世界
Posted 一起来看流星雨
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了一维车辆世界相关的知识,希望对你有一定的参考价值。
机器人初始化
想象一下,你有一个生活在一维世界中的机器人。这个机器人依存于九个不同空间的网格。它只能向前或向后移动。如果它从网格上脱落下来,则会绕回到另一侧。
这个机器人有一张地图,这样它可以知道只有九个空格。但机器人不知道它在地图上的位置。下面就是该一维地图。
第一次打开该机器人时,它在这些空间中的任何一个网格上的概率是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轴表示概率。
函数的输入是一个列表,其中机器人位于网格上的每个点上。
你的结果应该是这样的:
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!‘)
以上是关于一维车辆世界的主要内容,如果未能解决你的问题,请参考以下文章