Go to file
2020-06-29 09:32:52 +00:00
astar.py xx 2020-06-29 10:52:52 +02:00
DNA.py Zaktualizuj 'DNA.py' 2020-06-29 09:08:09 +00:00
GarbageTruck.png xx 2020-06-29 10:52:52 +02:00
genetic.py Zaktualizuj 'genetic.py' 2020-06-29 09:09:03 +00:00
Home.png xx 2020-06-29 10:52:52 +02:00
main.py xx 2020-06-29 10:52:52 +02:00
README.md Zaktualizuj 'README.md' 2020-06-29 09:32:52 +00:00
x.png xx 2020-06-29 10:52:52 +02:00

Inteligentna śmieciarka 2000

Projekt wykorzystuje algorytm genetyczny do znalezienia optymalnej trasy dla śmieciarki

Przebieg algorytmu

Algorytm rozpoczynamy od stworzenia populacji:

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

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

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ą

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
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

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]