1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980 |
- function [R,eff]=randmio_und(R, ITER)
- %RANDMIO_UND Random graph with preserved degree distribution
- %
- % R = randmio_und(W,ITER);
- % [R eff]=randmio_und(W, ITER);
- %
- % This function randomizes an undirected network, while preserving the
- % degree distribution. The function does not preserve the strength
- % distribution in weighted networks.
- %
- % Input: W, undirected (binary/weighted) connection matrix
- % ITER, rewiring parameter
- % (each edge is rewired approximately ITER times)
- %
- % Output: R, randomized network
- % eff, number of actual rewirings carried out
- %
- % References: Maslov and Sneppen (2002) Science 296:910
- %
- %
- % 2007-2012
- % Mika Rubinov, UNSW
- % Jonathan Power, WUSTL
- % Olaf Sporns, IU
- % Modification History:
- % Jun 2007: Original (Mika Rubinov)
- % Apr 2008: Edge c-d is flipped with 50% probability, allowing to explore
- % all potential rewirings (Jonathan Power)
- % Mar 2012: Limit number of rewiring attempts, count number of successful
- % rewirings (Olaf Sporns)
- n=size(R,1);
- [i,j]=find(tril(R));
- K=length(i);
- ITER=K*ITER;
- % maximal number of rewiring attempts per 'iter'
- maxAttempts= round(n*K/(n*(n-1)));
- % actual number of successful rewirings
- eff = 0;
- for iter=1:ITER
- att=0;
- while (att<=maxAttempts) %while not rewired
- while 1
- e1=ceil(K*rand);
- e2=ceil(K*rand);
- while (e2==e1)
- e2=ceil(K*rand);
- end
- a=i(e1); b=j(e1);
- c=i(e2); d=j(e2);
-
- if all(a~=[c d]) && all(b~=[c d])
- break %all four vertices must be different
- end
- end
-
- if rand>0.5
- i(e2)=d; j(e2)=c; %flip edge c-d with 50% probability
- c=i(e2); d=j(e2); %to explore all potential rewirings
- end
-
- %rewiring condition
- if ~(R(a,d) || R(c,b))
- R(a,d)=R(a,b); R(a,b)=0;
- R(d,a)=R(b,a); R(b,a)=0;
- R(c,b)=R(c,d); R(c,d)=0;
- R(b,c)=R(d,c); R(d,c)=0;
-
- j(e1) = d; %reassign edge indices
- j(e2) = b;
- eff = eff+1;
- break;
- end %rewiring condition
- att=att+1;
- end %while not rewired
- end %iterations
|