2017-03-03 53 views
1

我有一個由三個數字向量組成的矩陣data=[kids,mothers,fathers],其中每個向量包含孩子及其母親和父親的ID。孩子的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被安置在同一個家庭組中,我會接受。

EDIT ::

最少例如:

輸入:

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

小例子,... – bla

回答

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