AlgGenRS
This commit is contained in:
parent
2ff85f9abb
commit
272e1e1f9a
@ -3,5 +3,5 @@
|
|||||||
<component name="Black">
|
<component name="Black">
|
||||||
<option name="sdkName" value="Python 3.9 (traktor)" />
|
<option name="sdkName" value="Python 3.9 (traktor)" />
|
||||||
</component>
|
</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>
|
</project>
|
BIN
__pycache__/algorytm_genetyczny.cpython-310.pyc
Normal file
BIN
__pycache__/algorytm_genetyczny.cpython-310.pyc
Normal file
Binary file not shown.
BIN
__pycache__/board.cpython-310.pyc
Normal file
BIN
__pycache__/board.cpython-310.pyc
Normal file
Binary file not shown.
BIN
__pycache__/constant.cpython-310.pyc
Normal file
BIN
__pycache__/constant.cpython-310.pyc
Normal file
Binary file not shown.
BIN
__pycache__/decisiontree.cpython-310.pyc
Normal file
BIN
__pycache__/decisiontree.cpython-310.pyc
Normal file
Binary file not shown.
BIN
__pycache__/kolejka.cpython-310.pyc
Normal file
BIN
__pycache__/kolejka.cpython-310.pyc
Normal file
Binary file not shown.
BIN
__pycache__/neuralnetwork.cpython-310.pyc
Normal file
BIN
__pycache__/neuralnetwork.cpython-310.pyc
Normal file
Binary file not shown.
BIN
__pycache__/tractor.cpython-310.pyc
Normal file
BIN
__pycache__/tractor.cpython-310.pyc
Normal file
Binary file not shown.
119
algorytm_genetyczny.py
Normal file
119
algorytm_genetyczny.py
Normal 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)
|
9
board.py
9
board.py
@ -1,6 +1,7 @@
|
|||||||
import pygame
|
import pygame
|
||||||
from constant import size, rows, cols
|
from constant import size, rows, cols
|
||||||
import random
|
import random
|
||||||
|
from algorytm_genetyczny import wynikowa_populacja
|
||||||
|
|
||||||
class Board:
|
class Board:
|
||||||
def __init__(self):
|
def __init__(self):
|
||||||
@ -44,7 +45,13 @@ class Board:
|
|||||||
}
|
}
|
||||||
|
|
||||||
def generate_board(self):
|
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 = [
|
self.vegetables = [
|
||||||
[None for _ in range(cols)] for _ in range(rows)
|
[None for _ in range(cols)] for _ in range(rows)
|
||||||
]
|
]
|
||||||
|
Loading…
Reference in New Issue
Block a user