# Inteligentna śmieciarka 2000 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 ```python child = DNA(self.genes) start = abs(random.randint(0, len(self.genes)) - 1) end = abs(random.randint(start - 1, len(self.genes))) child.genes = child.genes[start:end] for i in range(len(self.genes)): node = partner.genes[i] if node not in child.genes: child.genes.append(node) ``` * `mutate` Jeśli wylosowana liczba będzie mniejsza niż `mutateRate`, funkcja zamienia jeden element populacji z jego sąsiadem ```python if random.random() < mutationRate: indexA = abs(random.randint(0, len(self.genes)) - 1) indexB = (indexA + 1) % len(self.genes) self.genes[indexA], self.genes[indexB] = self.genes[indexB], self.genes[indexA] ```