Giter Club home page Giter Club logo

aisd-euler-and-hamilton's Introduction

Algorytmy z powracaniem

Wstęp

Algorytmy z powracaniem to typ algorytmów, który stopniowo generuje kandydatów na rozwiązanie, jednak gdy znaleziony kandydat nie nadaje się na rozwiązanie, algorytm powraca do punktu gdzie może znaleźć inne rozwiązanie. Projekt skupia się na dwóch algorytmach z powracaniem: algorytmie znajdowania ścieżki Hamiltona i algorytmie znajdowania cyklu Eulera. Celem ćwiczenia jest wyjaśnienie ich działania, analiza efektywności, złożoności obliczeniowej oraz zrozumienie ograniczeń w ich wykorzystaniu. Testy benchmark zostały wykonane na komputerze Apple Macbook Air z procesorem M2.

Projekt dostępny jest w całości na platofrmie Github.

Tworzenie grafu

Graf można utworzyć na dwa sposoby. Dostępne są opcje generowania grafu hamiltonowskiego $-hamilton$ i niehamiltonowskiego $-nonhamilton$. Przy tworzeniu grafu zdefiniować możemy liczbę jego wierzchołków oraz saturację.

nodes> 5
saturation>40

action> print
1> 2 4
2> 1 3
3> 2 4
4> 1 3
5>
nodes> 5
saturation>70

action> print
1> 2 4 5
2> 1 5
3> 4 5
4> 1 3 5
5> 1 2 3 4

Badanie efektywności algorytmów

W programie zaimplementowane są reprezentacje macierzy incydencji oraz listy następników. Reprezentacja macierzowa jest przydatna przy algorytmie szukania scieżki Hamiltona, ponieważ łatwo możemy operować na krawędziach. Reprezentacja listowa zaś, znajduje zastosowanie w szukaniu cyklu Eulera. Printowanie grafu zaimplementowane jest dla obu reprezentacji. Eksportowanie do TiKZ opiera się jednak na postaci macierzowej.




Benchmark został zaimplementowany w języku Bash oraz za pomocą biblioteki std::chrono, zaś sama wizualizacja została wykonana za pomocą biblioteki Matplotlib. Implementacja mierzenia czasu została przesatawiona poniżej.

    const auto start{std::chrono::high_resolution_clock::now()};
    // ALGORITHM HERE
    const auto end{std::chrono::high_resolution_clock::now()};
    auto measureTime = std::chrono::duration_cast<std::chrono::microseconds>(end - start);

Analiza badanych algorytmów

Algorytm jest silnie zależny od nasycenia grafu. Wraz ze wzrostem saturacji, rośnie czas działania algorytmu. W gęstszym grafie istnieje więcej możliwości wyboru ścieżek i algorytmy muszą rozważyć więcej opcji.
Analizując wykresy, możemy zauważyć, że czas wykonywania algorytmów bardzo szybko rośnie powyżej 12 nodów. Zgadza się to z założeniami teoretycznymi, ponieważ algorytm znajdowania ścieżki Hamiltona jest problemem NP-trudnym. Warto zwrócić uwagę na wartości na osiach Y przy znajdowaniu ścieżki Hamlitona w zależności od saturacji.
Niestety nie udało się przeanalizować algorytmu Eulera, dlatego wykresy obejmują jedynie znajdowanie scieżki Hamiltona dla grafów o róznej saturacji.
Analizie poddany został również mechanizm generowania danego grafu. Widoczny jest wzrost czasu przy generowaniu grafu hamiltonowskiego dla większych instancji.

Rozważania teoretyczne, wnioski

Algorytm hamiltona:

  • W rzadkich grafach (niskie nasycenie) algorytm może stosunkowo szybko znajdować rozwiązania, ponieważ istnieje mniej możliwości wyboru ścieżek.

  • W gęstych grafach (wysokie nasycenie) algorytm może napotykać problemy z powodu dużej liczby alternatywnych ścieżek, co wydłuża czas działania i zwiększa ryzyko nieznalezienia rozwiązania.

Algorytm eulera:

  • W rzadkich grafach algorytm może nie znajdować rozwiązania, ponieważ grafy te mogą nie zawierać cykli Eulera (wierzchołki o nieparzystym stopniu).

  • W grafach pełnego nasycenia algorytm Eulera zawsze znajdzie rozwiązanie, o ile graf jest spójny.

Podsumowanie

Algorytmy z powracaniem są potężnymi narzędziami, które można stosować do rozwiązywania różnych problemów algorytmicznych. Zrozumienie ich działania, złożoności obliczeniowej i wpływu nasycenia grafu jest ważne dla doboru odpowiedniego algorytmu do danego problemu i optymalizacji jego wydajności. Ponieważ algorytmy z powracaniem często generują duzą liczbę przypadków, optymalizacja jest szczególnie ważnym kryterium. Wykonany program pozwolił zauważyć jak dużym ograniczeniem staje się moc obliczeniowa, pamięć a także czas w przypadku problemów NP.

aisd-euler-and-hamilton's People

Contributors

skamlo avatar ogrodowskijedrzej avatar

Stargazers

Dominik Witczak avatar  avatar

Watchers

 avatar

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.