This commit is contained in:
s474139 2024-06-09 14:14:03 +02:00
parent 2ff85f9abb
commit 272e1e1f9a
10 changed files with 128 additions and 2 deletions

View File

@ -3,5 +3,5 @@
<component name="Black">
<option name="sdkName" value="Python 3.9 (traktor)" />
</component>
<component name="ProjectRootManager" version="2" project-jdk-name="Python 3.9 (traktor)" project-jdk-type="Python SDK" />
<component name="ProjectRootManager" version="2" project-jdk-name="Python 3.10" project-jdk-type="Python SDK" />
</project>

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

119
algorytm_genetyczny.py Normal file
View File

@ -0,0 +1,119 @@
import pygame
from constant import rows, cols
import random
import numpy as np
ROZMIAR_POPULACJI = 50
GENERACJI = 60
LICZBA_ROSLIN = 30
MUTATION_RATE = 0.1
def wygeneruj_populacje_poczatkowa():
populacja = []
for i in range(ROZMIAR_POPULACJI):
osobnik = []
for j in range(LICZBA_ROSLIN):
x, y = random.randint(0, 7), random.randint(0, 7)
e = (x, y)
# Zastępowanie powtórek
while e in osobnik:
x, y = random.randint(0, 7), random.randint(0, 7)
e = (x, y)
osobnik.append(e)
populacja.append(osobnik)
return populacja
def ocena_osobnika(osobnik):
ocena = 0
if len(osobnik) == len(set(osobnik)):
ocena += 5
else:
ocena -= 5
# Czy dana roślina ma sąsiedzi niepotrzebnym dystansie pomiędzy koordynatami
positions = set(osobnik)
for (x, y) in osobnik:
if ((x + 1, y) in positions or (x - 1, y) in positions or
(x, y + 1) in positions or (x, y - 1) in positions):
ocena -= 1
else:
ocena += 1
return ocena
def selekcja(populacja):
populacja = sorted(populacja, key=lambda x: ocena_osobnika(x), reverse=True)
return populacja[:int(ROZMIAR_POPULACJI * 0.4)]
def mutacja(osobnik, mutation_rate):
# mutacja poprzez randomową zamiane jednej pary koordynatow
for i in range(len(osobnik)):
if random.random() < mutation_rate:
osobnik[i] = (random.randint(0, 7), random.randint(0, 7))
return osobnik
def krzyzowanie(rodzic1, rodzic2):
# krzyzowanie pomiedzy dwojka rodzicow i tworzenie dziecka
dziecko = []
for i in range(len(rodzic1)):
if random.random() < 0.5:
dziecko.append(rodzic1[i])
else:
dziecko.append(rodzic2[i])
return dziecko
def ewolucja():
populacja = (wygeneruj_populacje_poczatkowa())
for gen in range(GENERACJI):
# wybranie jedynie najlepszych osobnikow
rodzice = selekcja(populacja)
# stworz nowa generacje poprzez krzyzowanie i mutacje
potomek = []
while len(potomek) < ROZMIAR_POPULACJI:
rodzic1, rodzic2 = random.sample(rodzice, 2)
dziecko = krzyzowanie(rodzic1, rodzic2)
dziecko = mutacja(dziecko, MUTATION_RATE)
potomek.append(dziecko)
populacja = potomek
najlepszy_potomek = max(populacja, key=ocena_osobnika)
print(f'Generacja {gen}: Best Fitness = {ocena_osobnika(najlepszy_potomek)}')
return max(populacja, key=ocena_osobnika)
wynikowa_populacja = ewolucja()
print('Wynikowa populacja: ' , wynikowa_populacja)
liczba_roslin = 0
karta = np.zeros((rows, cols))
for koord in wynikowa_populacja:
i = koord[0]
j = koord[1]
if karta[i][j] != 7.7:
liczba_roslin += 1
karta[i][j] = 7.7
print('Liczba roślin: ' , liczba_roslin)
for i in range(cols):
for j in range(rows):
print(karta[i][j], end=' ')
print(' ')
print(' ')
#Krzyrzowanie z zastępowaniem powtórek wartościami randomowymi
#kandydat = rodzic1[i] if random.random() < 0.5 else rodzic2[i]
# zastępowanie powtóra koordynatów wartością randomową (mutacja)
#while(kandydat in dziecko):
#x = random.randint(0, ZASIEG - 1)
#y = random.randint(0, ZASIEG - 1)
#kandydat = (x, y)

View File

@ -1,6 +1,7 @@
import pygame
from constant import size, rows, cols
import random
from algorytm_genetyczny import wynikowa_populacja
class Board:
def __init__(self):
@ -44,7 +45,13 @@ class Board:
}
def generate_board(self):
self.board = [[random.choice([0, 1, 2, 3, 4, 5, 6, 7, 8, 9]) for _ in range(cols)] for _ in range(rows)]
self.board = [[random.choice([0, 1, 2, 3, 4, 5]) for _ in range(cols)] for _ in range(rows)]
for koord in wynikowa_populacja:
x = koord[0]
y = koord[1]
self.board[x][y] = random.choice([6, 7, 8, 9, 10, 11])
self.vegetables = [
[None for _ in range(cols)] for _ in range(rows)
]