如何生成满足三角不等式的矩阵?

时间:2013-06-10 06:21:05

标签: algorithm math matrix

让我们考虑方阵

enter image description here

(n是矩阵E的维数并且是固定的(例如n = 4或n = 5))。矩阵条目  a_{ij}满足以下条件:

enter image description here

enter image description here

任务是生成所有矩阵E.我的问题是如何做到这一点?有没有共同的方法或算法?这甚至可能吗?什么开始?

1 个答案:

答案 0 :(得分:7)

天真的解决方案

要考虑的一个天真的解决方案是生成每个可能的n - by - n矩阵E,其中每个组件都是一个不大于n的非负整数,然后取从那些只满足额外约束的矩阵。那复杂性会是什么?

每个组件都可以采用n + 1个值,并且有n^2个组件,因此有O((n+1)^(n^2))个候选矩阵。这有一个疯狂的高增长率

链接:WolframAlpha analysis of (n+1)^(n^2)

我认为这是不安全的,这是不安全的。

更好的解决方案

更好的解决方案如下。它涉及很多数学。

S成为满足您要求的所有矩阵E的集合。让N = {1, 2, ..., n}

<强>解释

  • N上的 指标 具有通常的定义,除非省略对称性要求。

  • IJ对集合N进行分区。当D(I,J)位于nn位于{{D_ij = 1时,i成为I x j矩阵J 1}}和D_ij = 0否则。

  • ABS。然后A 相邻 B当且仅当存在IJ分区{{1}时} N

    当且仅当A + D(I,J) = BA相邻时,我们说BA 相邻 BB相邻。

  • A中的两个矩阵AB 路径连接 当且仅当存在它们之间的S相邻元素的序列。

  • 让函数S表示矩阵M(E)的元素之和。

引理1:
EE = D(I,J)上的指标。

  

<强>证明:
  这是一个简单的陈述,除了边缘从NI的情况。让J位于iI位于j。然后根据J的定义E_ij = 1。让D(I,J)进入k。如果N位于k,则IE_ik = 0E_kj = 1。如果E_ik + E_kj >= E_ij位于k,则JE_ik = 1E_kj = 0

引理2:
E_ij + E_kj >= E_ij置于ES。然后存在E != zeros(n,n)I分区JN位于E' = E - D(I,J) S

  

<强>证明:
  让M(E') < M(E)(i,j)。让E_ij > 0成为I的子集,可以通过有效的N路径从i到达0I不能为空,因为i位于II不能N,因为j不在I中。这是因为E满足三角不等式和E_ij > 0

     

J = N - I。然后IJ都非空,分区N。根据{{​​1}}的定义,不存在任何I (x,y)E_xy = 0位于xI位于y 1}}。因此,J中的所有E_xy >= 1x中的I都会y

     

因此JE' = E - D(I,J) >= 0很明显,因为我们所做的就是从M(E') < M(E)的元素中减去E。现在,由于E'E上的指标,ND(I,J)上的指标(引理1 )和N ,我们E >= D(I,J)E'上的指标。因此N位于E'

<强>定理:
S进入E。然后SE是路径连接的。

  

证明(通过归纳):
  如果zeros(n,n),则该陈述是微不足道的。

     

假设E = zeros(n,n)。设E != zeros(n,n)M(E)中值的总和。然后,通过归纳,我们可以假设对于具有E的任何矩阵E',该陈述都是正确的。

     

M(E') < M(E)以来,引理2 ,我们在E != zeros(n,n)中有E'S。然后归纳假设M(E') < M(E)E'路径连接。因此,zeros(n,n)E路径相关。

<强>推论:
集合zeros(n,n)是路径连接的。

  

<强>证明:
  让SA放在B中。通过定理SA都路径连接到B。因此,zeros(n,n)A路径相关。

算法

推论告诉我们B中的所有内容都是路径连接的。因此,发现S的所有元素的有效方法是对由以下定义的图执行广度优先搜索。

  • S的元素是图表的节点
  • 当且仅当它们相邻时,图的节点通过边连接

给定一个节点S,您可以通过简单枚举所有可能的矩阵E找到E的所有(可能)未访问的邻居(其中D(I,J) }}并为每个生成2^n。枚举E' = E + D(I,J)应该相对简单(D(I,J)的每个可能的子集I都有一个,但空集和D除外。

请注意,在上一段中,DE都是D(I,J)上的指标。因此,当您生成N时,您不必检查它是否满足三角不等式 - E' = E + D(I,J)是两个指标的总和,因此它是一个指标。要检查E'是否在E',您需要做的就是验证S中的最大元素是否超过E'

您可以从n的任何元素开始广度优先搜索,并保证您不会错过任何S。因此,您可以使用S开始搜索。


请注意,随着zeros(n,n)的增加,集S的基数增长非常快,因此计算整个集合n只能处理小S。< / p>