eloquentjavascript阅读5| 青训营笔记

81 阅读2分钟

这是我参与「第五届青训营 」笔记创作活动的第19天。

一个送货机器人看着这个世界,并决定它要向哪个方向移动。因此,我们可以说,机器人是一个函数,它接收一个VillageState对象并返回附近的地方的名称。

因为我们希望机器人能够记住一些东西,这样他们就可以制定和执行计划,所以我们也把他们的记忆传递给他们,并允许他们返回一个新的记忆。因此,机器人返回的东西是一个包含它想要移动的方向和一个内存值的对象,这个内存值将在下一次被调用时反馈给它。

考虑一个机器人要做什么来 “解决 “一个给定的状态。它必须通过访问每一个有包裹的地点来拾取所有的包裹,并通过访问每一个有包裹的地点来运送包裹,但只能在拾取包裹之后。

什么是可能成功的最愚蠢的策略?机器人可以每转一圈都向一个随机的方向行走。这意味着,很有可能,它最终会碰到所有的包裹,然后也会在某一时刻到达应该交付包裹的地方。

请记住,Math.random()返回一个介于0和1之间的数字,但总是低于1。用这样的数字乘以数组的长度,然后对其应用Math.floor,就可以得到数组的随机索引。

由于这个机器人不需要记住任何东西,它忽略了它的第二个参数(记住,JavaScript函数可以用额外的参数来调用而不会产生不良影响),并且在它返回的对象中省略了内存属性。

为了让这个复杂的机器人开始工作,我们首先需要一种方法来创建一个带有一些包裹的新状态。一个静态方法(在这里通过直接给构造函数添加一个属性来编写)是放置该功能的一个好地方。

由于机器人没有很好地提前计划,它需要花很多时间来运送包裹。我们将很快解决这个问题。

要想从更愉快的角度看模拟,你可以使用本章编程环境中的runRobotAnimation函数。这将运行模拟,但不是输出文本,而是向你展示机器人在村庄地图上的移动。

我们应该能够比随机机器人做得更好。一个简单的改进是,从现实世界的邮件投递方式中得到提示。如果我们找到一条能经过村子里所有地方的路线,机器人可以把这条路线跑两遍,这时就能保证完成任务。这里有一条这样的路线(从邮局开始)。