Projekt wykorzystuje **algorytm genetyczny** do znalezienia optymalnej trasy dla śmieciarki
# Przebieg algorytmu
Algorytm rozpoczynamy od stworzenia populacji:
```python
for i in range(totalPopulaton):
population.append(DNA(goals)
```
Następnie, dla każdego członka populacji, obliczamy jego `.fitness`, czyli dystans, jaki musi pokonać przemierzając punkty w wyznaczonej kolejności, jednocześnie zapisując najlepszy wynik
```python
for i in range(totalPopulaton):
population[i].calcFitness(A)
if population[i].fitness < recordDistance:
recordDistance = population[i].fitness
best = copy.deepcopy(population[i])
bestGeneration = generation
```
Mnożąc `.fitness * 100` zwiększamy częstotliwość pojawiania się danego wyniku w tablicy, tym samym zwiększając prawdopodobieństwo na jego późniejsze wylosowanie
```python
for i in range(totalPopulaton):
n = population[i].fitness * 100
for j in range(int(n)):
matingPool.append(population[i])
```
Na końcu mieszamy 2 losowe obiekty za pomocą `.crosover()`, poddajemy mutacji `.mutate()` i powtarzamy cały kod, ze zmienioną populacją
```python
child = partnerA.crossover(partnerB)
child.mutate(mutationRate)
population[i] = child
```
# Opis funkcji `DNA`
* `crosover`
Funkcja dzieli listę punktów w 2 losowych miejscach, a następnie uzupełnia wolne pola pozostałymi punktami