|
USENET News sfnet.keskustelu.evoluutio
Säie: Mutaatioiden yleistyminen suurissa populaatioissa Re: LuomiskertomusEdellinen säie: Varastamisteorioista Seuraava säie: Geeneistä [Muut säikeet] [Muut uutisryhmät]
Newsgroups: sfnet.keskustelu.evoluutio
Subject: Re: Mutaatioiden yleistyminen suurissa populaatioissa Re: Luomiskertomus
From: magi AT iki PISTE fi (Marko Grönroos)
Date: 31 Jul 2000 14:02:59 +0300
zur AT nexus PISTE edu PISTE lahti PISTE fi (Pekka Aleksi Knuutila) writes:
> Minun korvaani ym. perustelut kuulostivat hieman ontuvilta, ja en osaa
> ajatella miksi riittavalla ajalla riittavan edullinen mutaatio ei
> yleistyisi ihmistenkin keskuudessa.
Myös itse olen aina ihmetellyt tätä varsin yleistä väitettä, mutta en
ainakaan pienellä etsimisellä löytänyt sitä mistään kirjastani.
Talkorigins.org:in mainiossa evoluutiobiologia-introssa kerrotaan
joitain kaavoja tuosta. Sen mukaan populaation koko ei vaikuttaisi
evoluution nopeuteen. Eli isossa populaatiossa uudet alleelit leviävät
hyvin hitaasti (hitauden kasvavan lineaarisesti populaation koon
suhteen), mutta toisaalta niissä myös syntyy uusia alleeleita enemmän
(lineaarisesti koon suhteen), jolloin nämä kaksi lineaarista tekijää
kumoavat toisensa. Näin ymmärsin.
Sitten diploidinen genomi tuo asiaan tietysti lisäväriä, sekä se että
isot populaatiot eivät ole välttämättä kovin pienellä alueella.
Evolutiivisilla algoritmeilla suurempi populaatio (yleensä?) aina
nopeuttaa evoluutiota. Esimerkiksi seuraava esimerkki:
Populaatiokoko Keskimääräinen konvergenssiaika (sukupolvissa)
10 25.26
20 12.66
40 8.5
80 5.21
(Ei tuo nyt aivan lineaarisesti 1/N pienene, mutta silti enemmän kuin
1/sqrt(N).)
Tämän laskin siis kokeellisesti seuraavalla pienellä ohjelmalla:
----------------------------------------------------------------------
#!/usr/bin/python
import whrandom
# Generates a random binary genome of given length
def randomBinaryGenome(length):
return map (lambda x: whrandom.randint(0,1), [0]*length)
# Returns the linear Hamming distance between two vectors
def hammingDistance(binaryVector1, binaryVector2):
distance = 0;
for i in xrange(0,len(binaryVector1)):
distance = distance + abs(binaryVector1[i] - binaryVector2[i])
return distance
# Takes a list of (fitness,genome)-pairs, kills the worst 50% of them and
# duplicates the best 50%, to form the next generation.
def generateNextPopulation (fitnesses):
fitnesses.sort()
selection = map (lambda x: x[1], fitnesses[0:len(fitnesses)/2])
selection = selection + selection
return selection
# Mutates one gene with given propability
def mutateGene (gene,rate):
if whrandom.random()<0.01:
return 1-gene
else:
return gene
# Mutates a population with given per-gene-propability
def mutatePopulation (population,rate):
return map (lambda genome,rate=rate: map(lambda gene,rate=rate: mutateGene(gene,rate), genome), population)
# Evolves a population of given size, and returns the convergence time
# (in generations). The generated genome is binary, the default length
# is length 10, and mutation rate is 1 percent per gene.
def evolve(popSize, genomeSize = 10, mutationRate = 0.01, target = [0]*10):
# Create initial random population
population = map (lambda x,size=genomeSize: randomBinaryGenome(size), [0]*popSize)
# Calculate fitnesses as tuples: (fitness, genome)
fitnesses = map (lambda x,target=target: (hammingDistance(x,target),x), population)
for generation in xrange(0,1000):
# Generate next generation
population = generateNextPopulation (fitnesses)
# Mutate the population a little
population = mutatePopulation (population,mutationRate)
# Calculate fitnesses as tuples: (fitness, genome)
fitnesses = map (lambda x,target=target: (hammingDistance(x,target),x), population)
fitnesses.sort()
if fitnesses[0][0]==0:
break
return generation
# Calculates average value of a numeric vector
def average(vector):
return reduce (lambda x,y: x+y, vector) / float(len(vector))
# Evolve a population for 100 times and print the average convergence time
def averageConvergenceTime (popSize, runs=100):
return average (map(lambda x,popSize=popSize: evolve(popSize), [0]*runs))
print averageConvergenceTime (10)
print averageConvergenceTime (20)
print averageConvergenceTime (40)
print averageConvergenceTime (80)
----------------------------------------------------------------------
--
-- Marko Grönroos, magi AT iki PISTE fi (http://www.iki.fi/magi/)
-- Paradoxes are the source of truth and the end of wisdom
|
Newsgroups: sfnet.keskustelu.evoluutio
Subject: Re: Mutaatioiden yleistyminen suurissa populaatioissa Re: Luomiskertomus
From: magi AT iki PISTE fi (Marko Grönroos)
Date: 02 Aug 2000 23:12:36 +0300
"Ilkka Karaila" <ilkka PISTE karaila AT nelesautomation PISTE com> writes:
> Tämä mutaatiokeskustelu ei ole paljoa pohtinut sitä mahdollisuutta, että
> olosuhteet ovat olleet maapallolla varsin vakaat pitkään. Tämän seurauksena
> organismien geenipopulaatiot ovat konvergoineet paikalliseen optimiin ja
> kaikki mutaatiot voivat sen johdosta vaikuttaa huonon suuntaisilta kun
> vaihtoehtoja ei enää ole.
Tämä ei kuullosta järkevältä, vaikka joissain hyvin yksinkertaisissa
ja stabiileissa ympäristöissä näin voikin olla, jos jollain lajilla ei
juurikaan ole kilpailua, eikä se kykene löytämään uusia ekologisia
lokeroita hyödynnettäväksi.
Jos lajien väliset interaktiot ovat voimakkaat, on sopeutumismaasto
hyvin dynaaminen. Näin taitaa olla useimmilla lajeilla. Tällöin
koevolutiivinen dynaamisyys auttaa lajeja pääsemään pois ainakin
pienemmistä paikallisista minimeistä.
--
-- Marko Grönroos, magi AT iki PISTE fi (http://www.iki.fi/magi/)
-- Paradoxes are the source of truth and the end of wisdom
|
Edellinen säie: Varastamisteorioista Seuraava säie: Geeneistä [Muut säikeet] [Muut uutisryhmät] |