我正在MATLAB中编写一个算法来预处理一个用于路径寻找算法的大图,我很好奇我可以跟踪我的移动以便能够重建的最佳方式解决方案并将其投影到原始图表上。
到目前为止,我使用的预处理方法相对简单;我正在使用的3种技术是:
1)删除长边:
可以通过序列(a,b)
在(a,c,b)
移除的任何边(a,b) > (a,c)+(c,b)
2)删除度数为1的顶点
如果一个带有一条边的顶点不是路径的起点或终点,那么该顶点将永远不会成为路径的一部分,并且可以将其删除
3)删除度数为2的顶点
如果顶点b
有两条边出现,则可以删除b
,边(a,b)
和(b,c)
可以替换为单边(a,c)
长度(a,b) + (b,c)
。
算法迭代这3种技术,直到图中不再可能进行进一步的更改,此时它会删除图形邻接矩阵中的所有空行和列,并返回缩减图以供路径查找算法使用。
预处理算法效果很好,在某些情况下,我能够在图形大小上减少大约70%,并且我的路径寻找算法能够找到与un-相同质量的路径。处理过的图形但速度快了一个数量级。
我现在的问题是重建原始图表上的解决方案,即所谓的“后期处理”。
我觉得我应该跟踪我的预处理算法所做的所有动作,然后在完成之后以相反的顺序应用它们,我只是不太确定我应该怎么做......
以下是我的想法:
首先,跟踪我在预处理后从矩阵中删除的所有空行和列,然后重新插入它们。
然后有一个简单的向量,其中索引代表移动数,而值代表移动类型。
然后为3个移动“类型”中的每一个都有一个单元格数组,其中包含每个移动的数据,按照它们执行的顺序,使用它们自己的迭代计数器。
然后如果我在移动列表上向后迭代,它将告诉我要访问哪个单元格数组,然后我可以应用该列表上的下一个反向操作(类似于堆栈数据结构)< / p>
编辑:我想在计算机科学堆栈交换中发布这个;但我的问题不是关于预处理方法本身,而是关于数据存储和检索以及实现本身。但如果您认为它更适合其他地方,请随意迁移它