diff --git a/README.md b/README.md index e69de29..cb10e4f 100644 --- a/README.md +++ b/README.md @@ -0,0 +1,66 @@ +# 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] +``` +