Egy egyszerű genetikus algoritmus (evolúciós szimuláció) segítségével bemutatható, hogyan fejlődik ki egy véletlenszerű karaktersorozatból egy előre meghatározott célkitűzés (például egy adott mondat).A program a következő lépésekből áll:Populáció létrehozása: Véletlen karakterekből álló "egyedek" generálása.Szelekció (Fitnesz): Annak vizsgálata, hogy az egyes egyedek mennyire hasonlítanak a célmondathoz.Kereszteződés és Mutáció: A legjobb egyedek tulajdonságainak összekeverése, és kis eséllyel véletlenszerű hibák (mutációk) bevitele az új generációkba.
----------------
import random
# A cél, amit az evolúciónak el kell érnie
CEL = "Ez egy evolucios szimulacio!"
KARAKTEREK = " abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZÁÉÍÓÖŐÚÜŰ.,!"
POPULACIO_MERET = 100
MUTACIOS_RATA = 0.05 # 5% esély a mutációra
# 1. Egyed létrehozása véletlenszerű karakterekből
def veletlen_egyed(hossz):
return ''.join(random.choice(KARAKTEREK) for _ in range(hossz))
# 2. Fitnesz (célhoz való hasonlóság) kiszámítása
def ertekeles(egyed, cel):
# Minél több karakter egyezik a megfelelő pozícióban, annál magasabb a pontszám
pontszam = sum(1 for i, j in zip(egyed, cel) if i == j)
return pontszam
# 3. Kereszteződés két szülő között
def keresztez(szulo1, szulo2):
hossz = len(szulo1)
if hossz == 0:
return szulo1
# Véletlenszerű vágási pont
vagas = random.randint(0, hossz - 1)
return szulo1[:vagas] + szulo2[vagas:]
# 4. Mutáció
def mutate(egyed):
uj_egyed = []
for kar in egyed:
if random.random() < MUTACIOS_RATA:
uj_egyed.append(random.choice(KARAKTEREK))
else:
uj_egyed.append(kar)
return ''.join(uj_egyed)
# Fő evolúciós ciklus
def evolucio():
cel_hossz = len(CEL)
generacio = 0
# Kezdő populáció generálása
populacio = [veletlen_egyed(cel_hossz) for _ in range(POPULACIO_MERET)]
while True:
# Értékelés és a populáció rendezése fitnesz szerint (csökkenő)
populacio.sort(key=lambda egyed: ertekeles(egyed, CEL), reverse=True)
legjobb_egyed = populacio[0]
legjobb_fitnesz = ertekeles(legjobb_egyed, CEL)
# Kiírás minden generációban
print(f"Generáció: {generacio:4} | Eredmény: {legjobb_egyed} | Fitnesz: {legjobb_fitnesz}")
# Ha elértük a 100%-os egyezést, megállunk
if legjobb_fitnesz == cel_hossz:
print("\nEvolúció sikeresen befejeződött!")
break
# Új generáció építése
uj_populacio = []
# Elitizmus: a legjobb 10% változatlanul átkerül a következő generációba
elit_szam = int(POPULACIO_MERET * 0.10)
uj_populacio.extend(populacio[:elit_szam])
# Új egyedek létrehozása keresztezéssel és mutációval
while len(uj_populacio) < POPULACIO_MERET:
szulo1 = random.choice(populacio[:20]) # Csak a legjobb 20%-ból választunk szülőt
szulo2 = random.choice(populacio[:20])
gyerek = keresztez(szulo1, szulo2)
gyerek = mutate(gyerek)
uj_populacio.append(gyerek)
populacio = uj_populacio
generacio += 1
if __name__ == "__main__":
evolucio()
---------------
Generáció: 0 | Eredmény: znSuxANktClHgKTWmLTÓmnrduYoG | Fitnesz: 3
Generáció: 1 | Eredmény: HPkŰRyÜBVdvwoFxgZSlvvwVa,eo! | Fitnesz: 4
Generáció: 2 | Eredmény: HPkŰRyÜBVdvwoFxgZSlvvwVa,eo! | Fitnesz: 4
Generáció: 3 | Eredmény: zDInÓnvXAŰÓKTqan MTÓmwVanÚo! | Fitnesz: 5
Generáció: 4 | Eredmény: wPkŰRyÜBoŐaUcGoZZSXvwwVanÚo! | Fitnesz: 6
Generáció: 5 | Eredmény: vnSŰŰyKzo.W,cGpn MTÓmwVanÚo! | Fitnesz: 7
Generáció: 6 | Eredmény: HPMŰRyÜBVŐaUcGoh MTÓmwVanÚo! | Fitnesz: 8
Generáció: 7 | Eredmény: HPMŰRyÜBVŐaUcGoh MTÓmwVanÚo! | Fitnesz: 8
Generáció: 9 | Eredmény: H!kNbyÜrVŐaUcGoh sTJmwVanio! | Fitnesz: 10
Generáció: 10 | Eredmény: HPkŰRyÜBICl,cGoh sTJmwVanio! | Fitnesz: 11
Generáció: 11 | Eredmény: HPkŰRyÜBICl,cGoh sTJmwVanio! | Fitnesz: 11
Generáció: 12 | Eredmény: HPkŰRyÜBICl,cGoh sTJmwVanio! | Fitnesz: 11
Generáció: 13 | Eredmény: HPkŰRy BICl,cGoÖ sTJmsVanio! | Fitnesz: 12
Generáció: 14 | Eredmény: HPkŰRy BICl,cGoÖ sTJmsVanio! | Fitnesz: 12
Generáció: 15 | Eredmény: iPkŰRy BICl,cGoC sTJmwlanio! | Fitnesz: 13
Generáció: 16 | Eredmény: iPkeRy fICl,cGoh sTJmwlanio! | Fitnesz: 14
Generáció: 17 | Eredmény: iPkeRy fICl,cGoh sTJmwlanio! | Fitnesz: 14
Generáció: 19 | Eredmény: iPpeRy fI.l,cGoh sTimwlanio! | Fitnesz: 15
Generáció: 20 | Eredmény: iPpeRy fI.l,cGoh sTimwlanio! | Fitnesz: 15
Generáció: 26 | Eredmény: iP eRy fWCl,cGoh sTimwlanio! | Fitnesz: 16
Generáció: 27 | Eredmény: iP eRy fWCl,cGoh sTimwlanio! | Fitnesz: 16
Generáció: 28 | Eredmény: EP eRy fWCl,cGoR sTimwlanio! | Fitnesz: 17
Generáció: 29 | Eredmény: EP eRy fWCl,cGoR sTimwlanio! | Fitnesz: 17
Generáció: 38 | Eredmény: EP eRy fIClWcWoÖ sTim.lacio! | Fitnesz: 18
Generáció: 39 | Eredmény: EP eRy fIClWcWoÖ sTim.lacio! | Fitnesz: 18
Generáció: 42 | Eredmény: EA eRy fWSlÖcGos sTim.lacio! | Fitnesz: 19
Generáció: 43 | Eredmény: EA eRy fWSlÖcGos sTim.lacio! | Fitnesz: 19
Generáció: 44 | Eredmény: EP eRy fvClBcGos sTim.lacio! | Fitnesz: 20
Generáció: 45 | Eredmény: EP eRy fvClBcGos sTim.lacio! | Fitnesz: 20
Generáció: 54 | Eredmény: EP eRy fvClBcGos sTimulacio! | Fitnesz: 21
Generáció: 55 | Eredmény: EP eRy fvClBcGos sTimulacio! | Fitnesz: 21
Generáció: 63 | Eredmény: EP eRy fvClBcGos szimulacio! | Fitnesz: 22
Generáció: 64 | Eredmény: EP eRy fvClBcGos szimulacio! | Fitnesz: 22
Generáció: 65 | Eredmény: Ez eRy fvClBcPos szimulacio! | Fitnesz: 23
Generáció: 66 | Eredmény: Ez eRy fvClBcPos szimulacio! | Fitnesz: 23
Generáció: 67 | Eredmény: Ez eRy MvClucGos szimulacio! | Fitnesz: 24
Generáció: 68 | Eredmény: Ez eRy MvClucGos szimulacio! | Fitnesz: 24
Generáció: 80 | Eredmény: Ez eRy fvClucios szimulacio! | Fitnesz: 25
Generáció: 81 | Eredmény: Ez egy MvClucios szimulacio! | Fitnesz: 26
Generáció: 82 | Eredmény: Ez egy MvClucios szimulacio! | Fitnesz: 26
Generáció: 104 | Eredmény: Ez egy Zvolucios szimulacio! | Fitnesz: 27
Generáció: 105 | Eredmény: Ez egy Zvolucios szimulacio! | Fitnesz: 27
Evolúció sikeresen befejeződött!
Nincsenek megjegyzések:
Megjegyzés küldése