157 lines
5.8 KiB
Python
157 lines
5.8 KiB
Python
|
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
|