练习
测量机器人
很难通过让机器人解决一些场景来客观比较他们。 也许一个机器人碰巧得到了更简单的任务,或者它擅长的那种任务,而另一个没有。
编写一个compareRobots
,接受两个机器人(和它们的起始记忆)。 它应该生成 100 个任务,并让每个机器人解决每个这些任务。 完成后,它应输出每个机器人每个任务的平均步数。
为了公平起见,请确保你将每个任务分配给两个机器人,而不是为每个机器人生成不同的任务。
function compareRobots(robot1, memory1, robot2, memory2) {
// Your code here
}
compareRobots(routeRobot, [], goalOrientedRobot, []);
机器人的效率
你能写一个机器人,比goalOrientedRobot
更快完成递送任务吗? 如果你观察机器人的行为,它会做什么明显愚蠢的事情?如何改进它们?
如果你解决了上一个练习,你可能打算使用compareRobots
函数来验证你是否改进了机器人。
// Your code here
runRobotAnimation(VillageState.random(), yourRobot, memory);
持久性分组
标准 JavaScript 环境中提供的大多数数据结构不太适合持久使用。 数组有slice
和concat
方法,可以让我们轻松创建新的数组而不会损坏旧数组。 但是Set
没有添加或删除项目并创建新集合的方法。
编写一个新的类PGroup
,类似于第六章中的Group
类,它存储一组值。 像Group
一样,它具有add
,delete
和has
方法。
然而,它的add
方法应该返回一个新的PGroup
实例,并添加给定的成员,并保持旧的不变。 与之类似,delete
创建一个没有给定成员的新实例。
该类应该适用于任何类型的值,而不仅仅是字符串。 当与大量值一起使用时,它不一定非常高效。
构造函数不应该是类接口的一部分(尽管你绝对会打算在内部使用它)。 相反,有一个空的实例PGroup.empty
,可用作起始值。
为什么只需要一个PGroup.empty
值,而不是每次都创建一个新的空分组?
class PGroup {
// Your code here
}
let a = PGroup.empty.add("a");
let ab = a.add("b");
let b = ab.delete("a");
console.log(b.has("b"));
// → true
console.log(a.has("b"));
// → false
console.log(b.has("a"));
// → false