Zaktualizuj 'README.md'
This commit is contained in:
parent
2557e567f5
commit
f69a425559
66
README.md
66
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]
|
||||||
|
```
|
||||||
|
|
Loading…
Reference in New Issue
Block a user