我有一组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]
答案 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)= {
}
示例: 2 - > 4
RES [4] = [
1234
1423和1324(i = 1,j = 2)
示例2: 4 - > 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)
我建议您使用单元格阵列为每个单元保留一对,以便轻松找到对。