InteligentnaSmieciarka2000/Algorytm_genetyczny - raport.md

67 lines
2.0 KiB
Markdown
Raw Normal View History

2020-06-29 11:32:52 +02:00
# 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]
```