85 lines
2.1 KiB
Matlab
85 lines
2.1 KiB
Matlab
% Implements the network growth model from: Fabrikant et al,
|
|
% "Heuristically Optimized Trade-offs: A New Paradigm
|
|
% for Power Laws in the Internet"
|
|
% Note: Assumes the central point (root) to be the one closest to (0,0)
|
|
%
|
|
% INPUTS: n - number of points, parameter alpha, [0,inf),
|
|
% plt='on'/'off', if [], then 'off' is default
|
|
% OUTPUTS: generated network (adjacency matrix) and plot [optional]
|
|
%
|
|
% GB: last updated: November 14, 2012
|
|
|
|
|
|
function [adj,p]=fabrikantModel(n,alpha,plt)
|
|
|
|
|
|
% create random point (polar) coordinates
|
|
p = zeros(n,2);
|
|
rad = rand(1,n);
|
|
theta = 2*pi*rand(1,n);
|
|
for i=1:n; p(i,:) = rad(i)*[cos(theta(i)),sin(theta(i))]; end
|
|
norms = [];
|
|
for pp=1:length(p); norms = [norms; norm(p(pp,:))]; end
|
|
[~,Y]=sort(norms);
|
|
p = p(Y,:);
|
|
clear norms rad theta
|
|
|
|
h=zeros(n,1); % initialize centrality function
|
|
adj=zeros(n); % initialize adjacency matrix
|
|
|
|
adjL = pdist2(p,p,'euclidean'); % compute all point-to-point distances
|
|
|
|
% compute centrality function based from p(1,:)
|
|
h = adjL(1,:);
|
|
|
|
|
|
for i=2:n % a new point arrives at each iteration
|
|
|
|
% compute min weight across all existing points
|
|
d=[];
|
|
for j=1:i-1; d=[d; alpha*norm(p(i,:)-p(j,:)) + h(j)]; end
|
|
[~,indmin]=min(d);
|
|
adj(i,indmin)=1; adj(indmin,i)=1;
|
|
|
|
|
|
end
|
|
|
|
if nargin<=2 || not(strcmp(plt,'on')); return; end
|
|
|
|
set(gcf,'color',[1,1,1])
|
|
for i=1:n
|
|
axis off
|
|
%drawnow
|
|
%plot(p(i,1),p(i,2),'.','Color',[0.5,0.5,0.5]); hold off; hold on; % plot the new point
|
|
for j=i+1:n
|
|
if adj(i,j)>0
|
|
line([p(i,1) p(j,1)],[p(i,2) p(j,2)],'Color',[0.5,0.5,0.5])
|
|
hold off; hold on;
|
|
end
|
|
end
|
|
end
|
|
|
|
|
|
|
|
|
|
|
|
function L = pdist2(x,y,distance);
|
|
|
|
% L is the matrix of distances between
|
|
% all members of x to all members of y
|
|
% distance type can be defined differently,
|
|
% but for the purposes of this routine it
|
|
% is 'euclidean'
|
|
|
|
if not(strcmp(distance,'euclidean'));
|
|
print('no other distance than euclidean implemented yet\n');
|
|
return
|
|
end
|
|
|
|
L = zeros(size(x,1),size(y,1));
|
|
|
|
for xx=1:size(x,1)
|
|
for yy=1:size(y,1)
|
|
L(xx,yy) = norm(x(xx,:)-y(yy,:));
|
|
end
|
|
end |