2017-11-23 1 views
0

나는 유전자 알고리즘을 사용하여 커뮤니티를 탐지하고 있습니다. 커뮤니티는 궤적 기반의 표현으로 표현되며 각 인덱스 (유전자)와 그 가치는 동일한 커뮤니티에 있습니다. 아래 도면에서 예를 들어 MATLAB에서 찾기 및 정렬을위한 가장 빠른 대안

염색체 인 경우 (B) 공동체는 (d)

locus-based representation 그래서

가 염색체 지역을 추출하는 것, I 반복적 인덱스를 찾을 필요 값은이 작업을 수행하기 위해,이 코드를 작성했습니다 :

while (SumComms)~=nVar 
    j=find(Sol>0,1,'first');%find the first node which has not placed in any community 
    Com=[j,Sol(j)];%index of the node and it's value 
    Comsize=0; 
    while Comsize<numel(Com) 
     Comsize=numel(Com); 
     x=find(ismembc(Sol,sort([Com,Sol(Com)])));%Indexes which Com occure in Sol 
     Com=unique([Com,x,Sol(x)]); 
    end 
    Sol(Com)=0; 
    i=i+1; 
    SumComms=SumComms+numel(Com); 
    Communities{i}=Com; 
end 

그러나 x=find(ismembc(Sol,sort([Com,Sol(Com)]))) 심지어 중간 크기의 네트워크에서 매우 시간이 소모됩니다. 더 빠른 방법을 알고 있습니까?

+0

예, 이미지가 표시됩니다. –

+0

'SumComms','nVar','Sol'가 처음에 무엇인지 샘플을 제공하고 그 변수에 대한 출력을 제공하고 설명하십시오. –

+0

'SumCumms'는 클러스터 노드 수이고'nVar'는 총 수입니다 따라서 종료 조건은 while (SumComms) ~ = nVar입니다. 즉, 모든 노드가 커뮤니티에 루프가있을 때까지 종료됩니다. 'Sol'은 이미지에서 예를 들어 –

답변

1

다음은 논리 벡터를 사용하는 솔루션입니다. 옥타브에서 테스트

i=0; 
SumComms=0; 
nVar = 9; 
Sol = [3 0 3 1 5 6 4 7 7]+1; 
while SumComms ~= nVar 
    j=find(Sol>1,1,'first'); 
    Com = false(1,nVar); 
    Com([j Sol(j)])=true; 
    Comsize=0; 
    sumcom = 2; 
    while Comsize<sumcom 
     Comsize=sum(Com); 
     Com(Sol(Com))=true; 
     Com = Com(Sol); 
     Com(Sol(Com))=true; 
     sumcom = sum(Com); 
    end 
    Sol(Com)=1; 
    i = i + 1; 
    SumComms=SumComms+sumcom; 
    Communities{i}=find(Com); 
end 

결과가 제안하는 방법은 적어도 10 배 더 빠르다는 것을 보여준다 같은 ismember 같은 인덱스에 대한 연산이 색인 작업을 저감시킬 수 있도록하는 대신 인덱스의 조작 우리는 논리 벡터로서 Com을 정의 할 원래의 방법보다

+0

해결책 주셔서 감사합니다. 그러나 테스트를 마쳤습니다. 이 기능과 제 기능은 약 10 % 빨라졌으며, 어떻게 10 배 빠르게 실행됩니까? 내가 사용하는 matlab에 2017a, 당신은 옥타브가 그렇게 빨리 생각하십니까? –

+0

한 번 더, 내 데이터에서 일부 노드 null이 될 수 있습니다, 그들의 값은 -1, 내 코드가 작동합니다 어떻게 네가 부정적인 값을 처리하도록 코드를 변경합니까? 'Sol = [3 0 3 1 5 6 4 7 7 -1]' –

+0

예를 들어'nVar = 1000; Sol = randi (nVar, 1, nVar);와 같이 무작위 데이터로 테스트했습니다. 우리가 테스트 할 수 있도록 데이터를 업로드 할 수 있습니다. 보통 MATLAB은 Octave보다 빠릅니다. – rahnema1

관련 문제