SzIProjekt/Traktorek/Kinga Jagodzińska_Algorytm genetyczny.py

157 lines
5.8 KiB
Python
Raw Normal View History

2020-05-20 11:10:45 +02:00
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