BojkoJ / python-bia-genetic-algorithm-tsp

Genetic Algorithm for Travelling Saleslamn Problem

Repository from Github https://github.comBojkoJ/python-bia-genetic-algorithm-tspRepository from Github https://github.comBojkoJ/python-bia-genetic-algorithm-tsp

BIA – Cvičení 4 (Biologicky inspirované algoritmy)

Tento repozitář obsahuje řešení 4. cvičení z předmětu Biologicky inspirované algoritmy. Cílem je implementace genetický algoritmus pro Problém Obchodního Cestujícího (TSP - Travelling Salesman Problem)

https://michaelmachu.eu/data/pdf/bia/Exercise4.pdf


📋 Obsah


🎯 Popis problému

Travelling Salesman Problem (TSP) je klasický optimalizační problém, kde hledáme nejkratší cestu procházející všemi městy právě jednou a vracející se do počátečního města.

Dataset

  • 20 evropských měst s náhodnými 2D souřadnicemi (0-1000 km)
  • Města: Praha, Bratislava, Berlin, Budapest, Moscow, Ankara, Vienna, Warsaw, Rome, Athens, Paris, London, Madrid, Amsterdam, Brussels, Stockholm, Oslo, Copenhagen, Helsinki, Lisbon

Cíl

Najít optimální pořadí návštěvy měst minimalizující celkovou ujetou vzdálenost pomocí Genetického algoritmu.


🏗️ Struktura implementace

Notebook genetic_algorithm_tsp.ipynb obsahuje následující sekce:

1. Import knihoven

  • numpy - matematické operace a práce s maticemi
  • matplotlib.pyplot - vizualizace tras a měst
  • random - generování náhodných hodnot
  • copy - kopírování struktur dat

2. Definice měst a pozic

  • Generování 20 evropských měst s náhodnými 2D souřadnicemi
  • Každé město má název a souřadnice (x, y) v rozsahu 0-1000 km
  • Nastavení random.seed(42) pro reprodukovatelnost výsledků

3. Matice vzdáleností

  • Výpočet Euklidovské vzdálenosti mezi všemi dvojicemi měst
  • Vzorec: $d = \sqrt{(x_i - x_j)^2 + (y_i - y_j)^2}$
  • Vytvoření matice 20×20 s předpočítanými vzdálenostmi

4. Fitness funkce

  • Výpočet celkové délky trasy
  • Trasa je reprezentována jako permutace indexů měst: [0, 5, 3, 1, 2, 4, ...]
  • Cíl: minimalizovat celkovou vzdálenost

5. Inicializace populace

  • Vytvoření počáteční populace 100 náhodných tras
  • Každý jedinec je náhodná permutace všech měst

🧬 Genetické operátory

Selekce - Turnajová selekce

tournament_selection(population, distance_matrix, tournament_size=5)
  • Náhodně vybere 5 jedinců z populace
  • Vrátí toho s nejlepší (nejkratší) trasou
  • Zajišťuje tlak na kvalitu řešení

Křížení - Ordered Crossover (OX)

ordered_crossover(parent1, parent2)
  1. Vybere náhodný úsek z prvního rodiče
  2. Zkopíruje ho do potomka
  3. Zbylá města doplní z druhého rodiče v pořadí jejich výskytu
  4. Zajišťuje, že každé město je v trase právě jednou
  5. Vytvoří dva potomky prohozením rolí rodičů

Mutace - Swap Mutation

swap_mutation(route)
  • Náhodně prohodí dvě města v trase
  • Pomáhá udržet diverzitu populace
  • Zabraňuje uvíznutí v lokálním optimu

⚙️ Parametry algoritmu

Parametr Hodnota Popis
POPULATION_SIZE 100 Počet jedinců v populaci
GENERATIONS 500 Počet iterací algoritmu
TOURNAMENT_SIZE 5 Velikost turnaje pro selekci
CROSSOVER_RATE 0.8 Pravděpodobnost křížení (80%)
MUTATION_RATE 0.2 Pravděpodobnost mutace (20%)

Hlavní smyčka GA:

  1. Elitismus - zachování nejlepšího jedince
  2. Selekce rodičů turnajovou selekcí
  3. Křížení rodičů (80% pravděpodobnost)
  4. Mutace potomků (20% pravděpodobnost)
  5. Nahrazení staré populace novou generací

🚀 Jak spustit

Požadavky

numpy
matplotlib

Spuštění

  1. Otevřete genetic_algorithm_tsp.ipynb v Jupyter Notebooku nebo VS Code
  2. Spusťte všechny buňky postupně (nebo všechny najednou)
  3. Notebook zobrazí:
    • Tabulku měst s jejich souřadnicemi
    • Ukázku matice vzdáleností
    • Průběžné výpisy optimalizace (každých 50 generací)
    • Vizualizaci počáteční trasy (červená)
    • Vizualizaci optimalizované trasy (zelená)

📊 Výsledky

Vizualizace

🔴 Počáteční trasa (před optimalizací)

  • Zobrazena červenou barvou
  • Reprezentuje nejhorší trasu z náhodné počáteční populace
  • Ukazuje kvalitu náhodného řešení

🟢 Optimalizovaná trasa (po GA)

  • Zobrazena zelenou barvou
  • Nejlepší nalezené řešení po 500 generacích
  • Výrazně kratší než počáteční řešení

Výstup algoritmu

Notebook zobrazí:

  • Nejlepší nalezenou vzdálenost v km
  • Zlepšení oproti nejhorší počáteční trase v km
  • Procentuální zlepšení (typicky 30-50%)
  • Průběh optimalizace po generacích

About

Genetic Algorithm for Travelling Saleslamn Problem


Languages

Language:Jupyter Notebook 100.0%