Zaktualizuj 'Traktorek/Kinga Jagodzińska_Algorytm genetyczny.py'

This commit is contained in:
Kinga Jagodzińska 2020-06-15 11:10:08 +00:00
parent 91715f1210
commit 687ee80170

View File

@ -1,156 +1,156 @@
import random import random
import pygame import pygame
class Gen(object): class Gen(object):
def __init__(self, game): def __init__(self, game):
self.game = game self.game = game
self.pokolenie = 0 self.pokolenie = 0
self.length = 0 self.length = 0
self.max_gen = 99 self.max_gen = 99
self.index_gen = [] self.index_gen = []
def empty(self): def empty(self):
for x in range(25): for x in range(25):
if self.game.fields[x] == "puste": if self.game.fields[x] == "puste":
self.length = self.length + 1 self.length = self.length + 1
self.index_gen.append(x) self.index_gen.append(x)
# tworzenie dna # tworzenie dna
def dna_create(self): def dna_create(self):
self.dna = [] self.dna = []
for x in range(self.max_gen): for x in range(self.max_gen):
temp = [] temp = []
for y in range(self.length): for y in range(self.length):
temp.append(random.choice(["żyto", "jęczmień", "owies", "marchew", "rzodkiew", "pietruszka"])) temp.append(random.choice(["rzodkiewa", "papryka", "sałata", "marchew", "pomidor", "pietruszka"]))
self.dna.append(temp) self.dna.append(temp)
def algorytm(self): def algorytm(self):
l = [] l = []
first = True first = True
self.empty() self.empty()
self.dna_create() self.dna_create()
while True: while True:
if first == True: if first == True:
for x in range(len(self.dna)): for x in range(len(self.dna)):
l.append(self.l_score(self.dna[x])) l.append(self.l_score(self.dna[x]))
first = False first = False
elif first == False: elif first == False:
for x in range(int(self.max_gen * 1 / 3)): for x in range(int(self.max_gen * 1 / 3)):
l.append(self.l_score(self.dna[x + int(self.max_gen * 2 / 3)])) l.append(self.l_score(self.dna[x + int(self.max_gen * 2 / 3)]))
if max(l) >= self.length or self.pokolenie > 200: if max(l) >= self.length or self.pokolenie > 200:
return self.dna[l.index(max(l))] return self.dna[l.index(max(l))]
# usuwamy najmniej odpowiadające nam dna # usuwamy najmniej odpowiadające nam dna
for x in range(int(self.max_gen * 1 / 3)): for x in range(int(self.max_gen * 1 / 3)):
del self.dna[l.index(min(l))] del self.dna[l.index(min(l))]
l.remove(min(l)) l.remove(min(l))
for x in range(int(self.max_gen * 1 / 3)): for x in range(int(self.max_gen * 1 / 3)):
temp = [] temp = []
for y in range(self.length): for y in range(self.length):
if y % 2 == 0: if y % 2 == 0:
temp.append(self.dna[x][y]) temp.append(self.dna[x][y])
if y % 2 == 1: if y % 2 == 1:
temp.append(self.dna[int(self.max_gen * 2 / 3) - 1 - x][y]) temp.append(self.dna[int(self.max_gen * 2 / 3) - 1 - x][y])
# mutacja # mutacja
if random.randint(0, 100) <= 40: if random.randint(0, 100) <= 40:
for x in range(3): for x in range(3):
temp[random.randint(0, self.length - 1)] = random.choice(["żyto", "jęczmień", "owies", "marchew", "rzodkiew", "pietruszka"]) temp[random.randint(0, self.length - 1)] = random.choice(["rzodkiewa", "papryka", "sałata", "marchew", "pomidor", "pietruszka"])
self.dna.append(temp) self.dna.append(temp)
self.pokolenie = self.pokolenie + 1 self.pokolenie = self.pokolenie + 1
def l_score(self, tab): def l_score(self, tab):
suma1 = 0 suma1 = 0
for x in range(len(tab)): for x in range(len(tab)):
suma = 1 suma = 1
for y in self.game.neighbours[self.index_gen[x]]: for y in self.game.neighbours[self.index_gen[x]]:
if y in self.index_gen: if y in self.index_gen:
som = tab[self.index_gen.index(y)] som = tab[self.index_gen.index(y)]
else: else:
som = self.game.fields[y] som = self.game.fields[y]
if tab[x] == "żyto": if tab[x] == "rzodkiewa":
if som == "żyto": if som == "rzodkiewa":
suma = suma * 0.5 suma = suma * 0.5
elif som == "jęczmień": elif som == "papryka":
suma = suma * 1 suma = suma * 1
elif som == "owies": elif som == "sałata":
suma = suma * 0.7 suma = suma * 0.7
elif som == "marchew": elif som == "marchew":
suma = suma * 0 suma = suma * 0
elif som == "rzodkiew": elif som == "pomidor":
suma = suma * 1 suma = suma * 1
elif som == "pietruszka": elif som == "pietruszka":
suma = suma * 0.6 suma = suma * 0.6
elif tab[x] == "jęczmień": elif tab[x] == "papryka":
if som == "żyto": if som == "rzodkiewa":
suma = suma * 1 suma = suma * 1
elif som == "jęczmień": elif som == "papryka":
suma = suma * 0.8 suma = suma * 0.8
elif som == "owies": elif som == "sałata":
suma = suma * 0.2 suma = suma * 0.2
elif som == "marchew": elif som == "marchew":
suma = suma * 1 suma = suma * 1
elif som == "rzodkiew": elif som == "pomidor":
suma = suma * 0.2 suma = suma * 0.2
elif som == "pietruszka": elif som == "pietruszka":
suma = suma * 0.9 suma = suma * 0.9
elif tab[x] == "owies": elif tab[x] == "sałata":
if som == "żyto": if som == "rzodkiewa":
suma = suma * 0.7 suma = suma * 0.7
elif som == "jęczmień": elif som == "papryka":
suma = suma * 0.2 suma = suma * 0.2
if som == "owies": if som == "sałata":
suma = suma * 1 suma = suma * 1
if som == "marchew": if som == "marchew":
suma = suma * 0.3 suma = suma * 0.3
if som == "rzodkiew": if som == "pomidor":
suma = suma * 0 suma = suma * 0
if som == "pietruszka": if som == "pietruszka":
suma = suma * 1 suma = suma * 1
if tab[x] == "marchew": if tab[x] == "marchew":
if som == "żyto": if som == "rzodkiewa":
suma = suma * 0 suma = suma * 0
if som == "jęczmień": if som == "papryka":
suma = suma * 1 suma = suma * 1
if som == "owies": if som == "sałata":
suma = suma * 0.3 suma = suma * 0.3
if som == "marchew": if som == "marchew":
suma = suma * 0.9 suma = suma * 0.9
if som == "rzodkiew": if som == "pomidor":
suma = suma * 1 suma = suma * 1
if som == "pietruszka": if som == "pietruszka":
suma = suma * 0.8 suma = suma * 0.8
if tab[x] == "rzodkiew": if tab[x] == "pomidor":
if som == "żyto": if som == "rzodkiewa":
suma = suma * 1 suma = suma * 1
if som == "jęczmień": if som == "papryka":
suma = suma * 0.2 suma = suma * 0.2
if som == "owies": if som == "sałata":
suma = suma * 0 suma = suma * 0
if som == "marchew": if som == "marchew":
suma = suma * 1 suma = suma * 1
if som == "rzodkiew": if som == "pomidor":
suma = suma * 0.9 suma = suma * 0.9
if som == "pietruszka": if som == "pietruszka":
suma = suma * 0.7 suma = suma * 0.7
if tab[x] == "pietruszka": if tab[x] == "pietruszka":
if som == "żyto": if som == "rzodkiewa":
suma = suma * 0.6 suma = suma * 0.6
if som == "jęczmień": if som == "papryka":
suma = suma * 0.9 suma = suma * 0.9
if som == "owies": if som == "sałata":
suma = suma * 1 suma = suma * 1
if som == "marchew": if som == "marchew":
suma = suma * 0.8 suma = suma * 0.8
if som == "rzodkiew": if som == "pomidor":
suma = suma * 0.7 suma = suma * 0.7
if som == "pietruszka": if som == "pietruszka":
suma = suma * 0.4 suma = suma * 0.4
suma1 = suma1 + suma suma1 = suma1 + suma
return suma1 return suma1