Elizabeth Liddle reviewed Intelligent Design Creationist William Dembski's paper Specification: The Pattern That Signifies Intelligence on her blog and came up with an interesting test of his claims:
Imagine a coin-tossing game. On each turn, players toss a fair coin 500 times. As they do so, they record all runs of heads, so that if they toss H T T H H H T H T T H H H H T T T, they will record: 1, 3, 1, 4, representing the number of heads in each run. At the end of each round, each player computes the product of their runs-of-heads. The person with the highest product wins. In addition, there is a House jackpot. Any person whose product exceeds 1060 wins the House jackpot.
Dr. Liddle implemented a genetic algorithm in MatLab to demonstrate how known evolutionary mechanisms can come up with a string of heads and tails that have a runs-of-heads product greater than her House Jackpot. Her implementation uses only point mutations and excludes the least fit half of the population from propagating.
I've implemented a variant of Dr. Liddle's simulation using my GA Engine. This uses a tournament selection system where two genomes are selected at random and the most fit of the two is chosen to propagate to the next generation. This makes it less deterministic than Dr. Liddles. In fact, the most fit individual in some generations is observed to not be selected.
A more significant difference is that, in addition to point mutations, my version uses crossover between winners of the tournament selection. This should result in a solution in fewer generations.
As described in the GA engine description, applying the GA engine to a problem requires following a few simple steps:
- Create a class to represent the characteristics of the problem The problem class
- Implement a method to create instances of the problem class The
- Implement the required generic functions for the problem:
coin-product-problemcontains only the number of coin flips to simulate.
make-coin-product-problemfunction creates an instance of
The genome length is simply the number of coin flips to
The fitness of a genome is the product of the length of each
string of consecutive 1 bits.
This problem can use the
greater-comparatorprovided by the GA engine.
fitness-terminatorprovided by the GA engine.
My first simulation used a population of 1000 bit vectors of 500 bits
each and a mutation rate of 0.2%:
Within 1000 generations the best fit individual was approximately
1059. The fitness of the best individual reached
9.2x1059 after another few tens of thousands of
generations, but no additional increases appeared through 300,000
generations. I terminated this run and increased the population size
to reduce the odds of a single very fit individual taking it over and
eliminating genetic diversity.
(solve-coin-product (make-coin-product-problem 500) 1000 0.002)
I kept the mutation rate the same and bumped the population size to
This run found a solution with fitness 1.064x1060 in just
(solve-coin-product (make-coin-product-problem 500) 10000 0.002)
or an assortment of 35 strings of 3 heads, 65 strings of 4 heads, and
6 strings of 5 heads, each separated by single instances of tails.
Even with the larger population size, this simulation still only examined approximately 3,530,000 (3.53x106) sequences out of a possible 3x10151. This emphasizes the fact that claims by IDCists about "exceeding the computational resources of the universe" are based on a deep ignorance of modern evolutionary theory.
Quite frankly, I am thoroughly unconvinced that CSI is a well-defined concept. I spent a considerable amount of time attempting to get IDCists to define it with any degree of mathematical rigor and to demonstrate how to calculate it. Not one person could do so.
That being said, based on Dr. Liddle's interpretation of Dembski's paper, this exercise clearly demonstrates that a simple subset of known evolutionary mechanisms is more than capable of generating sequences of bits that exhibit what he seems to be claiming is CSI. I don't expect Dembski or any other IDCist to actually admit this, of course, but this result does restrict where they can move their goalposts in the future.
The code is available in two files:GA Engine code:
Please contact me by email if you have any questions, comments, or suggestions.