Algorytm najbliższego sąsiada
Ilustracja
Przykładowe wykonanie algorytmu
Rodzaj

algorytm zachłanny

Złożoność
Czasowa

Algorytm najbliższego sąsiada (ang. nearest neighbour algorithm, NN) – algorytm zachłanny służący do rozwiązywania problemu komiwojażera polegający na odwiedzaniu, począwszy od wybranego wierzchołka, wierzchołka znajdującego się najbliżej wierzchołka ostatnio odwiedzonego. Dla grafu pełnego o n wierzchołkach złożoność czasowa algorytmu wynosi [1].

Działanie

edytuj

Algorytm działa w następujący sposób[2]:

  1. Ustaw wybrany wierzchołek jako aktualny, oznacz go jako odwiedzony.
  2. Znajdź ten spośród nieodwiedzonych wierzchołków, który jest połączony z aktualnym krawędzią o najmniejszej wadze.
  3. Dołącz do rozwiązania krawędź łączącą aktualny wierzchołek z wierzchołkiem znalezionym w punkcie 2.
  4. Oznacz wierzchołek znaleziony w punkcie 2 jako odwiedzony i ustaw go jako aktualny.
  5. Jeśli pozostały jeszcze nieodwiedzone wierzchołki, przejdź do punktu 2.
  6. Dołącz do rozwiązania krawędź łączącą aktualny wierzchołek z wierzchołkiem wybranym w punkcie 1, aby zamknąć cykl.

Jakość otrzymanych rozwiązań

edytuj

Algorytm nie daje gwarancji znalezienia rozwiązania optymalnego (problem komiwojażera jest problemem NP-trudnym, zatem nie jest znany dokładny algorytm działający w czasie co najwyżej wielomianowym). Rozwiązania wyznaczone przez algorytm są średnio o około 25% gorsze od optymalnych[1].

Istnieją dane, dla których algorytm najbliższego sąsiada zwraca najgorsze możliwe rozwiązanie[3]. Wynik działania algorytmu może różnić się w zależności od wyboru wierzchołka, od którego rozpoczyna się wyznaczanie cyklu.

Ulepszenie

edytuj

Istnieje ulepszona wersja tego algorytmu o nazwie powtarzalny algorytm najbliższego sąsiada (ang. repetitive nearest neighbour algorithm, RNN), która polega na uruchomieniu algorytmu najbliższego sąsiada dla każdego możliwego wierzchołka startowego i wybraniu najmniejszego z rozwiązań. Złożoność takiego algorytmu to I ten algorytm nie daje gwarancji znalezienia optymalnego rozwiązania, ale rozwiązania wyznaczone przez algorytm RNN są średnio o około 15% gorsze od optymalnych[1].

Zobacz też

edytuj

Przypisy

edytuj
  1. a b c D.S. Johnson, L.A. McGeoch, The Traveling Salesman Problem: A Case Study in Local Optimization [online] [dostęp 2016-10-12] (ang.).
  2. Algorytm najbliższego sąsiada – Encyklopedia Algorytmów. algorytmy.ency.pl. [dostęp 2016-10-12]. [zarchiwizowane z tego adresu]. (pol.).
  3. G. Gutin, A. Yeo, A. Zverovich, Traveling salesman should not be greedy: domination analysis of greedy-type heuristics for the TSP [online] [dostęp 2016-10-12] (ang.).

📚 Artikel Terkait di Wikipedia

Szczelina odbytu

Schouten WR., Sebastian AA., Pescatori M. An evidence-based treatment algorithm for anal fissure.. „Techniques in coloproctology”. 3 (10), s. 177–80,

Lista skrótów i skrótowców używanych w informatyce

Video Input/Output VIO – Virtual Input/Output VLAN – Virtual Local Area Network VLB – Vesa Local Bus VLF – Very Low Frequency VLIW – Very Large Instruction

Grzegorz Sierpiński

Transport, 2023). DOI: 10.20858/sjsutst.2023.120.11. Application of a genetic algorithm with a fuzzy objective function for optimized siting of electric vehicle

Border Gateway Protocol

Press, kwiecień 2001, s. 138. ISBN 1-57870-233-X. BGP Best Path Selection Algorithm, IP Routing Design Technotes, www.cisco.com Istotne RFC BGP T.T. Bates T

Modele mieszanin Gaussowskich

Models, Wiley, 2000. Geoffrey J. McLachlan, Thriyambakam Krishnan, The EM Algorithm and Extensions, Wiley, 2008. Sylvia Frühwirth-Schnatter, Finite Mixture

Monte-Carlo Tree Search

Enzenberger, Martin Müller: A Lock-free Multithreaded Monte-Carlo Tree Search Algorithm. W: Advances in Computer Games: 12th International Conference, ACG 2009

Katar sienny

 Krzych-Fałta EdytaE. i inni, Gold standard diagnostic algorithm for the differential diagnosis of local allergic rhinitis, „Advances in Dermatology and Allergology/Postępy

C++11

jeden z dwóch proponowanych algorytmów (algorithm.do_it): // Pierwszy sposób. template< bool B > struct algorithm { template< class T1, class T2 > int do_it(