From d292b8d750da46ba102b9b20069149a5fd8dd8b0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jakub=20Dami=C5=84ski?= Date: Mon, 15 Jun 2020 13:54:22 +0000 Subject: [PATCH] =?UTF-8?q?Zaktualizuj=20'Jakub=20Dami=C5=84ski.md'?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Jakub Damiński.md | 41 ++++++++++++++++++++++++++++++++++++++++- 1 file changed, 40 insertions(+), 1 deletion(-) diff --git a/Jakub Damiński.md b/Jakub Damiński.md index 53cdb7c..9789ce5 100644 --- a/Jakub Damiński.md +++ b/Jakub Damiński.md @@ -12,4 +12,43 @@ Ponieważ wózek musi odwiedzić wszystkie paczki każde rozwiązanie tego probl Wykorzystując algorytm genetyczny sprawimy, że spośród losowych permotacji zaczną wyłaniać się tej najbardziej efektywne, czyli te o najkrótszej ścieżce. #### Zasada działania -... +Pierwszym krokiem jest zapełnienie populacji losowymi permutacjiami. +Następnie wykonuje się liczba iteracji w których najlepsze osobniki krzyżują się ze sobą tworzyć nowe permutacje wymianiając między sobą losową ilość elementów +``` +def crossover(a, b): + new_a = copy.deepcopy(a) + new_b = copy.deepcopy(b) + for i in range(floor(len(a) / 2)): + rel = randrange(len(a)) + tmp_a = new_a[rel] + tmp_b = new_b[rel] + if tmp_a == tmp_b: + continue + new_a[new_a.index(tmp_b)] = tmp_a + new_b[new_b.index(tmp_a)] = tmp_b + new_a[rel] = tmp_b + new_b[rel] = tmp_a + return new_a, new_b +``` +Nowo stworzone osobniki mają następnie szansę na mutacje, która polega na zamienieniu dwóch losowych elementów ze sobą +``` +def mutate(route): + new_route = copy.deepcopy(route) + for i in range(len(route) - 1): + if random() < mutation_probability: + tmp = new_route[i] + new_route[i] = new_route[i + 1] + new_route[i + 1] = tmp + return new_route +``` +Następnym krokiem jest dodanie do populacji najlepszych osobników z poprzedniej populacji +``` +for j in range(0, num_of_surviving): + new_population.append(population[scores[j][0]]) +``` +Po wykonaniu tych kroków do nowej populacji dodawane są zupelnie nowe soobniki by osiągną maksymalną ilość populacji +``` + for j in range(max_population - (num_of_surviving + num_of_couples)): + new_population.append(create_new_route(packages)) +``` +Na koniec iteracji wszystkie permutacje są oceniane na podstawie tego ile wózkowi zajęło by przejechanie całej trasy \ No newline at end of file