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