最小瓷砖订购

时间:2012-09-27 21:05:51

标签: algorithm permutation combinatorics sparse-matrix

最小化拼贴重新排序问题:

假设我有以下对称的9x9矩阵,N个粒子之间的N ^ 2相互作用:

(1,2) (2,9) (4,5) (4,6) (5,8) (7,8), 

这些是对称交互,因此隐含地暗示存在:

(2,1) (9,2) (5,4) (6,4) (8,5) (8,7),

在我的问题中,假设它们以矩阵形式排列,其中只显示上三角形:

t       0     1     2     (tiles)
  #   1 2 3 4 5 6 7 8 9   
  1 [ 0 1 0 0 0 0 0 0 0 ]
0 2 [ x 0 0 0 0 0 0 0 1 ]
  3 [ x x 0 0 0 0 0 0 0 ]
  4 [ x x x 0 1 1 0 0 0 ] 
1 5 [ x x x x 0 0 0 1 0 ]
  6 [ x x x x x 0 0 0 0 ]
  7 [ x x x x x x 0 1 0 ]
2 8 [ x x x x x x x 0 0 ]
  9 [ x x x x x x x x 0 ] (x's denote symmetric pair)

我有一些在3x3区块中计算的操作,并且必须完全计算包含至少单个1的任何3x3。以上示例至少需要5个图块:(0,0),(0,2),(1,1),(1,2),(2,2)

但是,如果我通过置换输入来交换第3列和第9列(以及与对称矩阵一起的行):

t       0     1     2
  #   1 2 9 4 5 6 7 8 3 
  1 [ 0 1 0 0 0 0 0 0 0 ]
0 2 [ x 0 1 0 0 0 0 0 0 ]
  9 [ x x 0 0 0 0 0 0 0 ]
  4 [ x x x 0 1 1 0 0 0 ] 
1 5 [ x x x x 0 0 0 1 0 ]
  6 [ x x x x x 0 0 0 0 ]
  7 [ x x x x x x 0 1 0 ]
2 8 [ x x x x x x x 0 0 ]
  3 [ x x x x x x x x 0 ] (x's denote symmetric pair)

现在我只需要计算4个图块:(0,0),(1,1),(1,2),(2,2)。

一般问题:

给定NxN稀疏矩阵,找到重新排序以最小化必须计算的TxT瓦片的数量。假设N是T的倍数。通过尝试N,可以找到最佳但不可行的解决方案!输入排序的排列。

对于启发式方法,我尝试过带宽最小化例程(例如Reverse CutHill McKee),Tim Davis' AMD例程,到目前为止无济于事。我不认为对角线化是正确的方法。

这是一个样本起始矩阵:

http://proteneer.com/misc/out2.dat

希尔伯特曲线: Hilbert Curve

RCM: RCM

莫顿曲线: Morton Curve

2 个答案:

答案 0 :(得分:3)

您可以尝试几种众所周知的选项(其中一些是您拥有的,但仍然存在):

  • (Reverse) Cuthill-McKee减少了矩阵带宽,使条目保持接近对角线。
  • Approximage Minimum Degree - 轻量级填充减少重新排序。
  • 稀疏LU / LL'分解的填充减少重新排序(METISSCOTCH) - 计算量很大。
  • 空间填充曲线重新排序(these lines中的内容)
  • 用于3D问题的四维树或用于3D问题的八叉树 - 您将粒子分配给四边形/八分圆,然后根据四边形/八分圆ID对它们进行编号,类似于某种意义上的空间填充曲线。
  • Self Avoiding Walk用于结构化网格,以按照所有点只访问一次的顺序遍历网格点
  • 在稀疏矩阵 - 向量乘法的上下文中已经进行了许多阻塞稀疏矩阵条目的研究。许多研究人员试图为此目的找到良好的重新排序(我没有关于该主题的完美概述,但看看例如this paper

所有这些都倾向于在矩阵中找到结构,并在某种意义上将非零条目分组。既然你说你处理粒子,那就意味着你的连通图在某种意义上是“局部的”,因为粒子相互作用的空间局部性。在这种情况下,这些方法应该是很好用的。

当然,他们没有提供问题的确切解决方案:)但它们通常用于这种情况,因为它们在实践中产生非常好的重新排序。我想你说你试过的方法失败了,你的意思是什么?您期望找到最佳解决方案吗?当然,与随机矩阵排序相比,它们改善了这种情况。

修改让我简要介绍几张照片。我创建了一个由20节点砖元素组成的3D结构笛卡尔网格。我匹配网格的大小,使其类似于你的(约1000个节点)。此外,每行非零条目的数量并不太远(在我的情况下为51-81,在您的情况下为59-81,但两者都有非常不同的分布)下面的图片显示了RCM和非周期性网格的METIS重新排序(左),以及具有完整xyz周期性的网格(右):RCM reordering

下图显示了使用METIS和填充减少重新排序重新排序的相同矩阵

metis reordering

差异非常明显 - 周期性的不良影响很明显。现在你的矩阵用RCM和METIS重新排序

enter image description here

WOW。你有一个问题:)首先,我认为你的rcm有问题,因为我看起来不一样;)另外,我确信你不能得出任何基于这个特定矩阵的任何重新排序的一般和有意义的结论。这是因为您的系统大小非常小(小于大约10x10x10点),并且您的粒子之间似乎有相对长距离的交互。因此,在这种小型系统中引入周期性对重新排序的影响要大于我的结构化案例。

我会通过关闭周期性来开始寻找良好的重新排序。一旦您完成了满足您的重新排序,就会引入定期交互。在你显示的系统中几乎没有任何但是周期性:因为它非常小并且因为你的交互是相当长的,至少与我的网格相比。在更大的系统中,周期性对模型中心的影响较小。

较小,但仍然是负面的。也许你可以改变你的周期性方法?不是在矩阵中明确地包括周期性连接,而是在没有这些连接的情况下构造和重新排序矩阵,并引入将周期性粒子结合在一起的显式方程式,例如:

V_particle1 = V_particle100

或换句话说

V_particle1 - V_particle100 = 0

并在矩阵的末尾添加这些方程式。这种方法称为拉格朗日乘数。以下是它查找我的系统的方式

enter image description here

您保持非周期系统的重新排序,并且周期性连接性位于矩阵末尾的块中。当然,您可以将它用于任何其他重新排序。

下一个想法是从一个重新排序的非周期系统开始,并通过将它们添加到它们映射到的行中,明确地消除周期性节点的矩阵行。你当然也应该删除列。

您是否可以使用这些取决于您对矩阵的处理方式。拉格朗日乘数例如在对角线上引入0 - 并非所有求解器都是这样的..

无论如何,这是一项非常有趣的研究。我认为,由于你的问题的具体细节(据我所知 - 在3D中不规则地放置粒子,具有相当长程的交互)使得很难对矩阵条目进行分组。但我很好奇你最终做了什么。请让我知道!

答案 1 :(得分:0)

您可以查找kd-tree,R-tree,quadtree或空间填充曲线等数据结构。特别是空间填充曲线可以提供帮助,因为它减小了尺寸并且还对瓷砖进行了重新排序,因此可以向网格添加一些新信息。使用9x9网格,查看peano曲线可能会很好。 z阶Morton曲线对于2格的功率更好。