• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

Pomoc w zrozumieniu algorytmu

0 głosów
207 wizyt
pytanie zadane 3 maja 2019 w Programowanie przez BinaryMan Stary wyjadacz (12,620 p.)

Cześć ! 
Prosił bym o pomoc w zrozumieniu fragmentu pewnego algorytmu.
Chodzi mi o problem Kominwojażera. Załóżmy, że mam strukturę: 
 

struct points
{
    int ordinal_number;
    int x_cordinate;
    int y_cordinate;
};

2. vector na tą strukturę, który przechowuje jakieś rozwiązanie problemu (drogę po wszystkich punktach).
3. Drogę początkową (suma odległości między punktami w vector).
Czytałem o algorytmie który zamienia parami poszczególne wierzchołki i sprawdza czy droga jest krótsza, problem w tym że nie wiem za bardzo jak to ugryźć od strony technicznej.  

int number_of_points = point_s.size();
        for (int i = 0; i < number_of_points - 2; i++)
            {
                for (int j = i + 2; j < number_of_points; j++)
                {
                    // obliczanie kosztu zmiany sasiadow
                    double change =
                    calculate_cost(point_s[i].ordinal_number, point_s[i].x_cordinate, point_s[i].y_cordinate, point_s[j].ordinal_number, point_s[j].x_cordinate, point_s[j].y_cordinate) +
                    calculate_cost(point_s[i+1].ordinal_number, point_s[i+1].x_cordinate, point_s[i+1].y_cordinate, point_s[j+1].ordinal_number, point_s[j+1].x_cordinate, point_s[j+1].y_cordinate) -
                    calculate_cost(point_s[i].ordinal_number, point_s[i].x_cordinate, point_s[i].y_cordinate, point_s[i+1].ordinal_number, point_s[i+1].x_cordinate, point_s[i+1].y_cordinate) -
                    calculate_cost(point_s[j].ordinal_number, point_s[j].x_cordinate, point_s[j].y_cordinate, point_s[j+1].ordinal_number, point_s[j+1].x_cordinate, point_s[j+1].y_cordinate);
}

Napisałem coś takiego i dalej  nie wiem jak to ma działać, żeby było dobrze. Funkcja która tu jest to po prostu obliczanie odległości z pkt A do B. 
Proszę o jakieś objaśnienie lub naprowadzenie jak to powinno wyglądać.

Z góry dziękuję i pozdrawiam ! :)  

komentarz 10 maja 2019 przez k222 Nałogowiec (30,150 p.)

Rozwiązania ci nie podam, bo długo by pisać, ale coś co cie może nakierować, to poczytaj o metodzie simulated annealing

Jest to probabilistyczna metoda szukania najlepszego rozwiązania problemu - brzmi może strasznie, ale jest ona bardzo prosta - po prostu masz strukturę z pewnym rozwiązaniem, taką jak w pkt. 2, zmieniasz jeden element, jeżeli poprawiło to rozwiązanie to zapisujesz zmianę, a jeżeli nie to czasem zapisujesz a czasem nie.

Jest to metoda która nadaje się idealnie do problemu komiwojażera i w sumie twoje wymagania (w sumie na połowie stron ją tłumaczących jest jakiś gif jak ten właśnie problem jest nią rozwiązywany), a jednocześnie jest bardzo prosta. Kod w C++ może już troszkę straszyć, więc najpierw o niej poczytaj i zrozum jak działa, a potem powinieneś dać radę.

Zaloguj lub zarejestruj się, aby odpowiedzieć na to pytanie.

Podobne pytania

0 głosów
1 odpowiedź 534 wizyt
pytanie zadane 9 czerwca 2019 w C i C++ przez dodo070 Nowicjusz (140 p.)
0 głosów
1 odpowiedź 360 wizyt
0 głosów
1 odpowiedź 713 wizyt
pytanie zadane 19 lipca 2021 w Algorytmy przez wojtek_suchy Mądrala (6,880 p.)

93,742 zapytań

142,678 odpowiedzi

323,297 komentarzy

63,328 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj

Twierdza Linux. Bezpieczeństwo dla dociekliwych

Aby uzyskać rabat -10%, użyjcie kodu pasja-linux, wpisując go w specjalne pole w koszyku.

...