67 lines
2.0 KiB
Plaintext
67 lines
2.0 KiB
Plaintext
# 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]
|
|
```
|
|
|