Evolution of the giant connected component

In the last example, we saw how an Erdos-Renyi graph has a giant connected component when the connection probability exceeds a threshold. In this script, we will watch the evolution process closely. This script is designed to be run locally, because it produces an animated figure with many subplots. The HTML fill will produce a few presentative examples.

Contents

Parameterize the Erdos-Renyi graph

Here, we first create a parametric representation of varying the connection probability in an Erdos-Renyi random graph.

rand('seed',100);
n = 150;
A = rand(n);
A = triu(A,1);
A = A + A'; % make sure the seed data is symmetric

% define a function to produce a graph given a probability
G = @(p) A < p;

Define thresholds for the Erdos-Renyi graph

% define the thresholds where the graph is fully connected and has
% a giant component
thres_conn = log(n)/(n);
thres_giant = 1/(n-1);

% define a layout threshold at the geometric mean of these thresholds
thres = sqrt(thres_conn*thres_giant);

Compute a static layout

find the layout at the given threshold

Gt = G(thres);
[x y] = neato_layout(Gt);

Show the graph's evolution

Now, we'll watch as the graph evolves as we keep adding edges by increasing the probability p through all the various thresholds.

Define a sequence of probabilities to explore.

t1 = linspace(0, thres_giant, 50);
t2 = linspace(thres_giant, thres_conn, 100);

% we want to pause things at the emergence of the giant component
steps = [t1 ones(1,40)*thres_giant t2];
nframes = length(steps);

comp_size_history = [];
comp_step_history = [];

for frame=1:nframes
    p = steps(frame);

    Gcur = G(p);

    % make one large subplot for the graph layout with the
    % giant component highlighted
    subplot(4,2,[1 2 3 4 5 6]);
    gplot(Gcur, [x' y'],'bo-'); hold on;
    plot(x', y', 'bo');
    [Glc pcc] = largest_component(Gcur);
    gplot(Glc, [x(pcc)' y(pcc)'], 'ro-');
    hold off;
    axis off;
    title({sprintf('p = %d', p), sprintf('p*n = %d', p*n)});

    % make a smaller subplot for the size of the components
    subplot(4,2,[7 8]);
    [comps comp_sizes] = components(Gcur); % get the sizes
    comp_size_history = [comp_size_history comp_sizes];
    comp_step_history = [comp_step_history ones(1,length(comp_sizes))*p];
    plot(comp_step_history, comp_size_history, 'o');
    title('size of components');
    xlabel('p');

    set(gcf,'Color',[1,1,1]);

    % pause for display
    pause(0.15);
    if mod(frame,10)==0 || frame==1 || frame==nframes, snapnow; end
end