digraph {
	layout=dot;

	// default values
	node  [shape=box, label="", fontname="sans-serif", style=filled, fillcolor=white, fontsize=8];
	graph [fontname="sans-serif"]; // must be specified separately
	edge  [fontname="sans-serif"]; // must be specified separately

	// an unobtrusive background color
	pad="1.0, 0.5";
	bgcolor=whitesmoke;

	// layout of edges and nodes
	splines=ortho;
	nodesep=0.3;
	ranksep=0.3;

	// nodes
	a1[label="INITIALIZE t := 0"];
	a2[label="INITIALIZE P(t)"];
	a3[label="evaluate FITNESS of P(t)"];
	a4[shape="diamond", label="STOPPING CRITERION"; width=4];

	// connect 'end' node with 'a9' node (bottom of figure)
	{
	  rank=same;
	  a9[label="t := t + 1"];
	  // end-symbol similar to UML notation
	  end[shape=doublecircle, label="end", width=0.5];
	}

	a5[label="P'(t) := RECOMBINATION{P(t)}"];
	a6[label="P''(t) := MUTATION{P'(t)}"];
	a7[label="P(t+1) := SELECTION{P''(t) + P(t)}"];
	a8[label="evaluate FITNESS of P''(t)"];

	// edges
	a1 -> a2 -> a3 -> a4;
	// these trailing spaces output as "nbsp" (UTF8 NO-BREAK SPACE)
	a4 -> a5[xlabel="false   ", fontsize=10];
	a4 -> end[xlabel="true  ",  fontsize=10];
	a5 -> a6 -> a7 -> a8 -> a9;
	a4 -> a9 [dir=back];

	// explain the notation
	expl [shape=plaintext, fontsize=10, width=3.2, fillcolor=whitesmoke,
	      label="P(t): generation of ancestors at a time t\lP''(t): generation of descendants at a time t\l"];

}
