我有一个由三个数值向量data=[kids,mothers,fathers]
组成的矩阵,其中每个向量包含孩子及其母亲和父亲的ID。孩子的身份证是独一无二的,但父亲和母亲的身份证是非独特的(存在兄弟姐妹和半兄弟姐妹)。我希望将孩子矢量分成两个相同大小的矢量,这些矢量之间没有家庭关系。我希望这些矢量尽可能大,但可能会发生一些孩子需要丢弃以确保同样大小的矢量。
我目前的方法是计算每个'家庭组'的大小(=与父母相关的孩子),然后使用每个家庭的大小建立相同大小的组。到目前为止,我已经设法计算孩子的数量每个母亲或父亲都有:
mothersKids = arrayfun(@(x)nnz(mothers==x), mothers);
mothersKids = unique([mothers,mothersKids],'rows');
fathersKids = arrayfun(@(x)nnz(fathers==x), fathers);
fathersKids = unique([fathers,fathersKids],'rows');
这告诉我有多少孩子与单亲有关。使用父母的ID我可以找出哪些孩子是相关的,并基于此建立群组。但是,我无法弄清楚如何结合父母双方的信息来创建“家庭群体”。
作为旁注:如果发生一个案例,其中孩子A通过一个父母与孩子B相关,孩子B通过一个父母与孩子C相关,但是孩子A和孩子C之间没有关系,那么为了简单起见我如果孩子A和孩子C被安置在同一家庭组中,他们会接受它。
编辑::
最小例子:
输入:
data = [1,2,3,4,5,6; 11,11,12,12,13,14; 21, 22, 23, 23, 24, 25]; % = [kids,mothers,fathers]
输出:
kidsInSameFamily = {[1,2],[3,4],[5],[6]};
groupOne = [1,2,5];
groupTwo = [3,4,6];
答案 0 :(得分:0)
通过构建邻接矩阵并使用它来查找子图来解决这个问题。构建相同大小的组似乎是分区问题(Partition Problems Brute Force Algorithm)的变体,我可能需要根据我的需要修改MATLAB脚本https://people.sc.fsu.edu/~jburkardt/m_src/partition_problem/partition_problem.html
% Get kids associated through their mother.
storepairs =[];
for mom = unique(mothers)'
idx = find(mothers==mom);
if numel(idx) > 1
pairs = nchoosek(idx,2);
storepairs = [storepairs; pairs];
end
end
% Get kids associated through their father.
for dad = unique(fathers)'
idx = find(fathers==dad);
if numel(idx) > 1
pairs = nchoosek(idx,2);
storepairs = [storepairs; pairs];
end
end
% Make pairs symmetric
storepairs = [storepairs; fliplr(storepairs)];
% Add diagonal
storepairs = [storepairs; [1:size(data,1); 1:size(data,1)]'];
% Remove non-unique pairs
storepairs = unique(storepairs,'rows');
% Build adjacency matrix
A = sparse(storepairs(:,1),storepairs(:,2),1);
% Create a graph object
G = graph(A);
% Get sub-graphs within graph
SG = conncomp(G);
% Kids in same family
kidsInSameFamily={};
for ii = 1:max(SG)
kidsInSameFamily{ii} = kids(SG==ii);
end