我试图通过用二维矩阵建模来探索环境。但是,我事先并不知道矩阵的大小。
目前,我正在使用std :: vector< std :: vector>用于抽象矩阵并将其调整到一定大小的结构。如果我的应用程序达到原始调整大小的限制,我会再次执行该操作。
我正在使用DFS和A *算法的组合来探索这个矩阵。我的探险家代理可以向前,向后,向左和向右移动。每次探险家到达某个位置时,他都会将邻居添加到DFS堆栈中。例如,如果他在位置(25,25),它将添加邻居(25,24),(25,26),(24,25)和(26,25)。
到目前为止,它运作正常。但是,有一种情况我没想到。我一直在测试我的算法,探测器从矩阵的一角开始,表现很好。但是,如果探险家从房间的中间或不在角落的任何其他位置开始,我的算法无法正常工作。
这是因为我在矩阵中的0,0位置启动了我的资源管理器。因此,如果探险家从房间的中间开始,则不会探索某些位置,因为它们会为我的探险家生成负面索引。有没有人知道我能做些什么才能解决这个问题?
答案 0 :(得分:1)
一种方法就是像你说的那样简化它并迫使它从一个角落开始。
更复杂的方法是,每当遇到WOULD为负数的索引时,请调整数组的大小以及之前生成的所有索引以强制它们为正数。对于性能,可能是大块,比如简单地向所有东西添加10或100。
因此,当您添加邻居时添加负数检查,如果其中任何一个为负数,则对目前生成的所有索引应用相同的加法以强制每个索引为正数。
它只是一个虚构的坐标系,重要的部分是它们的相对位置。最后,确定哪一个应该是0,0并从中减去x,y和所有索引,以便将向量归一化。
同样是性能问题,如果从足够大的正数开始,您可以减少或消除此坐标图移位到最后的需要。就像你从100,100开始那样,在你消极之前你需要旅行100个节点。如果任何方向上的节点少于100个,则在完成映射之前不必进行转换。