节点

时间:2015-10-02 13:08:04

标签: matlab binomial-coefficients

我有一组30个节点,每个节点可以连接一个,一次只能连接一个。此外,一个节点无法连接到另一个特定的节点(例如,带有id= id+15的节点,例如1-16,2-17 ......规则不相关,我可以更改关联节点号)。我正在寻找的是一个矩阵,其中每一行都是一组可能的连接,其中所有节点都连接到另一个节点,并且每个节点都连接到所有其他节点(禁止的节点除外)。它看起来像这样(成对阅读)

[1  2   3   4   5   6   7   8   9   10  11  12  13  14  15  16  17  18  19  20  21  22  23  24  25  26  27  28  29  30;
2   3   4   5   6   7   8   9   10  11  12  13  14  15  16  17  18  19  20  21  22  23  24  25  26  27  28  29  1   30;
1   4   2   5   3   6   7   10  8   11  9   12  13  16  14  17  15  18  19  22  20  23  21  24  25  28  26  29  27  30;
4   7   5   8   6   9   10  13  11  14  12  15  16  19  17  20  18  21  22  25  23  26  24  27  28  1   2   29  3   30;
...
]

我试图通过用nchoosek收集所有可能的非重复组合(二项式30超过2 => 435)来开发这个,但现在我正处理放置所有对的问题在 29 -by- 15 对矩阵中,不重复。这样我就可以通过从nchoosek的输出中删除禁用对来轻松地遵守约束。

我确信这是一个已知的图形问题,但我无法找到任何相关信息。有谁知道实现它?

目的是描述30个节点之间点对点连接的时间线。由于每个连接都无法连接到其他连接,因此可能的连接总数为420(435 - 15个禁止连接),总共28个时隙(行)包含15对(30列)。

Edit2:另一种方法是生成一个30x30矩阵,其中包含1到30之间所有可能的数字组合,但约束条件不应重复(不按顺序)。例如。以下是可能的有效向量(限制为12个元素而不是30个),但是第二个被丢弃,因为耦合[2 1]相当于成对[1 2]。但是,不知道如何处理约束。

[1 2 3 4 5 6 7 8 9 10 11 12]
[2 1 3 4 5 6 7 8 9 10 11 12]

2 个答案:

答案 0 :(得分:0)

你可以这样做:

clear   all
%creation of vector
v       = 1:30;
%creation of combinations
[p1,p2] = meshgrid(v,v);
A       = [p1(:) p2(:)];
B       = fliplr(A);
%selection of unique combinations
[~,ind] = ismember(A,B,'rows');
ind     = ind > (1:length(ind))';
A       = A(ind,:);

答案 1 :(得分:0)

好,

我找到的第一个解决方案是使用烫发(1:30),但输出太大了!它给出了一个阵列,其中所有可能的排列都是1:30(30!超过10 ^ 32 ..)。

所以我们需要找到另一种方法来选择有效行先验

一种可能的方法是递归计算N的所有偶数值的所有行,从N = 2(初始化)到N = 30(你想要的结果),即:

(我用Res(k)表示满足N = k条件的行集

初始化:

N = 2:Res(2)= [12];

N - > N + 2:

RES(N + 2)= {

  • Res(N)的所有行在末尾添加[N + 1 N + 2]
  • 对于(1,N-1)×(2:N)中的(i,j),i <1。 j,找到包含该对的行(i j):将其替换为(i N + 1)(j N)和(i N)(j N + 1)

}

示例: 2 - &gt; 4

RES [4] = [

  • 1234

  • 1423和1324(i = 1,j = 2)

示例2: 4 - &gt; 6

Res(6)= [

  • 123456,142356,13246

  • 152634和162534(i = 1 j = 2),153624和163524(i = 1 j = 3),154623和164523(i = 1 j = 4),253614和263514(i = 2 j = 3),132546和132645(i = 2 j = 4),123546和123645(i = 3 j = 4)

我建议您使用单元格阵列为每个单元保留一对,以便轻松找到对。