Introduction

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.

Implementation

As described in the GA engine description, applying the GA engine to a problem requires following a few simple steps:

  1. Create a class to represent the characteristics of the problem
  2. The problem class coin-product-problem contains only the number of coin flips to simulate.
  3. Implement a method to create instances of the problem class
  4. The make-coin-product-problem function creates an instance of coin-product-problem.
  5. Implement the required generic functions for the problem:
    • genome-length
    • The genome length is simply the number of coin flips to simulate.
    • fitness
    • The fitness of a genome is the product of the length of each string of consecutive 1 bits.
    • fitness-comparator
    • This problem can use the greater-comparator provided by the GA engine.
  6. Implement a terminator function
  7. This problem can use the fitness-terminator provided by the GA engine.
  8. Run solve

Results

My first simulation used a population of 1000 bit vectors of 500 bits each and a mutation rate of 0.2%:

  (solve-coin-product (make-coin-product-problem 500) 1000 0.002)
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.

I kept the mutation rate the same and bumped the population size to 10,000:

  (solve-coin-product (make-coin-product-problem 500) 10000 0.002)
This run found a solution with fitness 1.064x1060 in just 705 generations:
11110111011101111011110111110111101111011110111110
11101110111011110111101111101111011110111101111011
11011101111011110111101110111101111011110111011110
11110111101110111011101111011111011110111101110111
10111101110111101110111011101111011101111011101110
11110111101111011110111101111011110111101111011101
11101111011110111101110111101111011110111011110111
11011110111011110111101111011101111011110111011101
11011110111011101110111101111011110111110111101111
01111011101111011110111101110111101110111011110111
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.

Summary

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.

Source Code

The code is available in two files:

This requires the GA Engine code:

Please contact me by email if you have any questions, comments, or suggestions.

www.softwarematters.org