AlgGenRS
This commit is contained in:
parent
2ff85f9abb
commit
272e1e1f9a
@ -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>
|
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
|
||||
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)
|
||||
]
|
||||
|
Loading…
Reference in New Issue
Block a user