FormationControlSimulation/SOURCE/networks-toolbox/forestFireModel.m

61 lines
1.7 KiB
Matlab
Raw Normal View History

2019-06-17 14:31:50 +07:00
% Implementation of the forest fire model by Leskovec et al
% "Graphs over Time: Densification Laws, Shrinking
% Diameters and Possible Explanations"
%
% Inputs: forward burning probability p in [0,1],
% backward burning ratio r, in [0,inf),
% T - number of nodes
% Outputs: adjacency list of the constructed (directed) graph
%
% Other routines used: weightedRandomSample.m
% GB: last updated, November 28, 2012
function L = forestFireModel(T,p,r)
if T==1
L{1} = []; % a single node, no edges
return
elseif T>=2
L{1} = [2]; L{2} = [1]; % start with a single edge
end
for t=3:T
L{t} = []; % new node arrives
w = randi(t-1); % pick a node from 1->t-1 uniformly at random
queue=[w]; visited = [];
while not(isempty(queue))
L{t} = [L{t} w]; % connect t to w
w = queue(1); visited = [visited w];
outlinks = L{w}; inlinks = [];
for ll=1:length(L)
if sum(find(L{ll}==w))>0; inlinks = [inlinks ll]; end
end
N = length(unique([outlinks inlinks]));
x = geornd(1-p,1,1); % mean p/(1-p) => (1-p) probability
y = geornd(1-r*p,1,1); % mean rp/(1-rp) => (1-rp) probability
s_in = weightedRandomSample(y,inlinks,ones(size(inlinks))/length(inlinks));
s_out = weightedRandomSample(x,outlinks,ones(size(outlinks))/length(outlinks));
ws = unique([s_in s_out]);
L{t} = unique([L{t} ws]); % add as outlinks to new node
for ii=1:length(ws)
if sum(find(visited==ws(ii)))==0; queue = [queue ws(ii)]; end
end
queue = queue(2:length(queue)); % remove w from queue
end
end
for ll=1:length(L); L{ll} = setdiff(L{ll},ll); end % remove self-loops