After much inspection and alternative implementation we’ve almost certainly concluded that the methods Riolo et. al in Evolution of cooperation without reciprocity (Letters to Nature vol. 414) differ from those described. Simulations run precisely to the specifications described (tag & tolerance mutation probability of .1, random new tag values, tolerance mutation of change by gaussian noise mean 0 sd .01, give cost .1, give benefit of 1, number of donations 3) fail to produce donation rates over 1 – 2%. This is even across thirty runs of 30,000 generations, as performed by Riolo et. al.
We were most suspicious of the generation of gaussian noise in tolerance mutation, but after using Java’s native Math.nextGaussian() and our own implementation of the Box-Muller method we observed identical results. High donation rates (> 60%) were only achieved with tolerance mutation with gaussian noise mean 0 sd .0001 and/or lowering the mutation probability of tags (.01 instead of .1).
In our copious free time we might try GP on our simulation to determine the parameters needed to replicate the results of Riolo et. al. (if it is merely a matter of parameters), for some amusing meta-evolution.
Download the Riolo Simulation Code (Java, including a nice Processing visualization sketch, allowing interactive running of generations with statistics of average tolerance & donation rate).