5/3/2012 - comparing two populations for evolution speed. The basic idea is, have a starting population, give it T time to evolve, and then compare the start pop with the finish population. Ideally, simulate (on a computer) the evolution over time T, and find which scheme evolves faster. This idea was inspired by a recent documentary where it said humans were repeatedly exposed to boom and bust cycles, and this was suggested as a cause of the growth of our brains. Their explanation was that this had a strong selection effect for humans being generalists, that can survive almost anything. My hunch though is that, while this is very likely true, this boom+bust also significantly speeds up evolution. And to test that hunch is the point of this note. Proposed evolution schemes: 1) repeated bust and boom. Start. strong natural selection (ie bust). weak nat sel (ie boom) for a longish time. strong nat sel. weak nat sel (for long time). repeat. 2) single bust followed by a boom. ie, strong nat sel, followed by weak nat sel. 3) stable. ie gradual evolution with only food carrying capacity limiting population. I propose that (1) evolves a population significantly faster than the other two. Why? The bust strongly filters the gene pool. Then the boom over a long time allows new mutations to accumulate in the population. Repeat. Yeah, not a convincing explanation I suppose, but I am having trouble translating the mental picture. Anyway, point is, maybe we can test this idea using computers. Starting point is code to compare two populations. -- metric satisfies: -- metric[x,x] = 0 -- metric[x,y] in [0,1] for all x,y -- metric[x,y] = metric[y,x] for all x,y (ie, symmetric). -- sample-size, the number of members of {start,finish}-pop to compare. -- If zero, then use min[|start-pop|,|finish-pop|] compare-populations[start-pop,finish-pop,metric,sample-size] ::= [ n = sample-size; test[ sample-size == 0 : n = min[|start-pop|,|finish-pop|]; ] pop-A = pick[n]:start-pop; -- I'd prefer this version of pick[n]:list does not have duplicates. pop-B = pick[n]:finish-pop; -- though it might still work with duplicates. return 100*Sum[metric[pop-A[i],pop-B[i]]; for i in 1..n]/n; -- this is just an average. Other functions are possible. Though ave should do. ] Well, that was disappointingly short. And cleaned of the comments: compare-populations[start-pop,finish-pop,metric,sample-size] ::= [ n = sample-size; test[ sample-size == 0 : n = min[|start-pop|,|finish-pop|]; ] pop-A = pick[n]:start-pop; pop-B = pick[n]:finish-pop; return 100*Sum[metric[pop-A[i],pop-B[i]]; for i in 1..n]/n; ] I guess I should note: result = 0 means identical, and 100 means completely different. Also, the hard part is finding a suitable metric, though SimM should work. Hrmm... Also, I've only done part of the job. I would also need code to test my evolution schemes. That would require: 1) a way to represent information of each creature in the population. (either base 2, or base 4 like DNA - I'm unsure if base would have an effect on the outcome.) 2) a way to implement random mutations and mixing of DNA by way of sexual reproduction. 3) some way to provide (strict) natural selection. How would you choose which to keep and which to delete? Anyway, think about it.