Алгоритм коллективного влияния в Matlab - PullRequest
0 голосов
/ 03 декабря 2018

Привет всем, мне нужна помощь для реализации алгоритма для модели коллективного влияния [CI = (Ki - 1) * sum (Kj -1)] в Matlab.Эта модель вычисляет значения коллективного влияния каждого узла в сети.Он задается произведением степеней узла i на 1 и суммы степеней ближайших ближайших соседей узла i на 1, как указано на расстоянии d.'d' может быть из 2-х, 3-х или более прыжков из узла i.

Идея состоит в том, чтобы определить узлы с наибольшим влиянием на сеть, которые способны разрушить или полностью фрагментировать сеть при их удалении.После первой итерации значение CI рассчитывается и сортируется в порядке убывания.Узел с самым высоким значением CI удаляется, и вычисление повторяется, и CI снова сортируется, чтобы определить узел со следующим самым высоким значением CI.Цикл продолжается до тех пор, пока сеть не будет полностью фрагментирована с наименьшим количеством самых крупных компонентов.

До сих пор я пытался реализовать эту модель с использованием встроенных синтаксисов Matlab.Я могу получить доступ к следующим ближайшим соседям узла i, но когда я вычисляю значения его степени, он также включает в себя прямых соседей узла i и узла i.См. Код ниже:

Изображение примера сети

for i=1:gg
    Neb = neighbors(G,i); %Calculates the neighbours of node i
    degNodi=degree(G,i);  %Calculates the degree of node i
    d=distances(G);       %Calculates distances of all nodes from each pivot
                          %note
    for m=1:length(Neb)   %Calculates the length of of node i's neighbours 
                          %at each iteration                         
        NNN=neighbors(G,Neb(m));  %Finds the neighbours of the neighbours of 
                                  %node i or next nearest neighbours        
        if NNN==Neb(m) || NNN==G(i)
           NNN=find(NNN~=Neb) & find(NNN~=G(i));
        end
        Kj=degree(G,NNN);         %Calculates the degrees of the next 
                                  %nearest neighbours of node i
    end
end

Моя задача с помощью приведенного выше кода состоит в том, чтобы получить доступ и вычислить значения степени для узла i 2-прыжок или больше соседей прыжка, исключая прямые соседние узлы i и узла i.

Q: Какую строку кода я могу использовать, чтобы избавиться от прямых соседей узла i и узла i после того, как я вычислю значения степени узлая являюсь соседями по 2 прыжкам?

Я также попробовал другой код, но не смог получить нужный мне результат.

load('simp10net.mat');
networkA=A;
N=size(networkA,1);
mmm=0;
for i=1:N
  neb1=length(kmin_neighbors(networkA,i,1));
  neb2=kmin_neighbors(networkA,i,2);
  m=length(neb2); 
     for m1=1:m
         for q=1:m
             NN(find(networkA(neb2(m),m1)))=1;
         end
     end
   mmm=NN-1;
   Kjall=sum(mmm);
   collInf(i)=((neb1 - 1)* Kjall);
end

В приведенном выше коде я смог получить доступ кСоседи по 2 прыжкам узла i, но я не знаю правильный синтаксис или строку кода, которые я могу использовать, чтобы позволить мне вычислить значения степени.Я не получаю ожидаемого результата после его запуска.

Какая строка кода может помочь мне сделать это?

Q: Как я могу сохранить идентификаторы / теги каждого узла после удаленияузел с самым высоким значением CI на каждой итерации, сеть меньше узла, и нумерация меняется?

Любая помощь или совет о том, как сделать этот код более эффективным, будет очень цениться.

Спасибо

...