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