探索具有未定义大小的矩阵

Explore a matrix with undefined size

本文关键字:未定义 探索      更新时间:2023-10-16

我正试图通过用二维矩阵建模来探索环境。然而,我事先不知道矩阵的大小。

目前,我正在使用std::vector<std::vector>结构来抽象矩阵并将其调整为特定大小。如果我的应用程序达到了原来调整大小的限制,我会再次执行该操作。

我正在结合DFS和a*算法来探索这个矩阵。我的探索者代理可以向前、向后、向左和向右移动。每当资源管理器到达一个位置时,他都会将邻居添加到DFS的堆栈中。例如,如果他在位置(25,25),它将添加邻居(25,24)、(25,26)、(24,25)和(26,25)。

到目前为止,它运行良好。然而,有一种情况是我没有想到的。我一直在用浏览器从矩阵的一角开始测试我的算法,这表现得很好。但是,如果浏览器从房间的中间或任何其他不在角落的位置开始,我的算法就无法正常工作。

之所以会发生这种情况,是因为我在矩阵中的0,0位置启动了我的资源管理器。因此,如果资源管理器从房间的中间开始,一些位置将不会被探索,因为它们会为我的资源管理器生成负指数。有人知道我能做些什么来解决这个问题吗?

一种方法是像您所说的那样简化它,并强制它从一个角落开始。

更复杂的方法是,每当遇到索引为负数时,都要调整数组和以前生成的所有索引的大小,以强制它们为正数。对于性能,可能是大块的,比如简单地在所有内容上加10或100。

因此,当你添加邻居时,你会添加负数的检查,如果其中任何一个是负数,你会对迄今为止生成的所有索引应用相同的加法,以强制每个索引为正数。

这只是一个假想的坐标系,重要的是它们的相对位置。最后,决定哪一个应该是0,0,并从x、y和ALL索引中减去足够的值,使向量归一化。

还有一个性能问题,如果你从一个足够大的正数开始,你可能会减少或消除这种坐标图移动的需要,直到最后。比如,如果你从100100开始,那么你需要移动100个节点才能得到负数。如果任何方向上的节点都少于100个,则在完成映射之前不必进行平移。