Prośba o opisanie działania kodu (Problem Komiwojazera)

0

Witam serdecznie, jest to mój pierwszy post na tym forum :) Potrzebuje o dodatkowe opisanie jak działa algorytm, który umieszczam. Zaznaczam że nie jestem jego autorem, ale potrzebuje zrozumieć co do czego służy. Umieściłem w poszczególnych komentarzach to czego nie wiem.

#include <iostream> 
#include <math.h>
#include <iomanip> // potrzebne do precyzji
using namespace std;

int main()
{
//Zmienne
int
miasto_start,
miasto_nr,
sasiad = 0; // dlaczego sąsiad = 0 ?

//deklaracja tablcy dwuwymiarowej dla wspolrzednych
float droga_calkowita;
float SUM = 0;

cout << "Ilosc miast: ";
cin >> miasto_nr;
float tab[miasto_nr][2];

//wpisanie danch do tablicy
for (int i=0, j=1; i<miasto_nr; i++,j++)
{
cout << "Pozycja x miasta "<< j << " na osi xy\t";
cin >> tab[i][0];
cout << "Pozycja y miasta "<< j << " na osi xy\t";  // dane są wprowadzane do dwóch oddzielnych tablic?
cin >> tab[i][1];
cout << "\n";
}

// wybór miasta startowego
while(miasto_start <= 0 || miasto_start > miasto_nr){
cout << "\nMiasto startowe: ";
cin >> miasto_start;
}

miasto_start --; //dopasowanie do pozyji w tablicy
cout<<"\n\nTrasa wg. algorytmu najblizszego sasiada:\n";
// stwozenie tablicy dla odwiedzonych miast
bool odwiedzone_tab[miasto_nr];
for(int i=0; i<miasto_nr; i++) odwiedzone_tab[i] = false;
odwiedzone_tab[miasto_start] = true;

cout<<miasto_start+1;
//OBLICZENIA
int temp = miasto_start; // tablica pomocnicza
for(int i=0; i<miasto_nr-1; i++)
{

float miasto_x = tab[temp][0]; //wartość x miasta w którym jestem wyciagnieta z tablicy miast
float miasto_y = tab[temp][1]; //wartość y miasta w którym jestem wyciagnieta z tablicy miast

float dystans=0, najblizsza_odleglosc=0;
bool first = true;

for(int i=0; i<miasto_nr; i++)
{
if(odwiedzone_tab[i] == false)
{
cout<<setprecision(2); // Ustawienie precyzji wyniku
dystans = sqrt(pow((miasto_x - tab[i][0]), 2) + pow((miasto_y - tab[i][1]),2)); //obiczneie odleglosci (x1-x2)^2 + (y1-y2)^2 [pierwiatek z wartosci]
if(first == true)

{
najblizsza_odleglosc = dystans+1; // dlaczego jest dystans +1
first = false;
}
if(dystans != 0 && dystans < najblizsza_odleglosc) // sprawdzenie czy odleglosc jest najmniejsza
{
najblizsza_odleglosc = dystans; //przypisanie wartosci dystans do najblizsza_odlegosc
sasiad = i; // numer miast do ktorego odleglosc jest najmniejsza
}
}
}
SUM += najblizsza_odleglosc; // suma odleglosci przebytej drogi
temp = sasiad;
odwiedzone_tab[temp] = true;
cout<<" -> "<<sasiad+1;
}
cout<<" -> "< droga_calkowita = sqrt(pow((tab[miasto_start][0] - tab[sasiad][0]), 2) + pow((tab[miasto_start][1] - tab[sasiad][1]),2)); // powrot do miasta startowego
SUM += droga_calkowita;
cout<<"\n\nCalkowita dlugosc trasy: "<<SUM<<"\n";
return 0;
}
0

float tab[miasto_nr][2];

//wpisanie danch do tablicy
for (int i=0, j=1; i<miasto_nr; i++,j++)
{
cout << "Pozycja x miasta "<< j << " na osi xy\t";
cin >> tab[i][0];
cout << "Pozycja y miasta "<< j << " na osi xy\t"; // dane są wprowadzane do dwóch oddzielnych tablic?
cin >> tab[i][1];
cout << "\n";
}


Ja tam widzę jedną, alem trochę ślepawy, więc mogę się mylić. Ma ona miasto_nr rzędów i dwie kolumny.
0
Oskar8876 napisał(a):

if(first == true)

first jest wartością logiczną więc sprawdzamy czy jest prawdą, ale wynik first == true znowu jest wartością logiczną więc, if((first == true) == true)
ale ten wyraz znowu jest wartością logiczną, więc, if(((first == true) == true) == true)
ale ... więc, if((((first == true) == true) == true) == true)
daj znać jak skończysz z naprawianiem niekonsekwencji.

0

#include <iostream>

#include <math.h>

#include <iomanip> // potrzebne do precyzji

using namespace std;

int main() {
  //Zmienne
  int
  miasto_start,
  miasto_nr,
  sasiad = 0; // dlaczego sąsiad = 0 ?

  //deklaracja tablcy dwuwymiarowej dla wspolrzednych
  float droga_calkowita;
  float SUM = 0;

  cout << "Ilosc miast: ";
  cin >> miasto_nr;
  float tab[miasto_nr][2];

  //wpisanie danch do tablicy
  for (int i = 0, j = 1; i < miasto_nr; i++, j++) {
    cout << "Pozycja x miasta " << j << " na osi xy\t";
    cin >> tab[i][0];
    cout << "Pozycja y miasta " << j << " na osi xy\t"; 
    cin >> tab[i][1];
    cout << "\n";
  }

  // wybór miasta startowego
  while (miasto_start <= 0 || miasto_start > miasto_nr) {
    cout << "\nMiasto startowe: ";
    cin >> miasto_start;
  }

  miasto_start--; //dopasowanie do pozyji w tablicy
  cout << "\n\nTrasa wg. algorytmu najblizszego sasiada:\n";
  // stwozenie tablicy dla odwiedzonych miast
  bool odwiedzone_tab[miasto_nr];
  for (int i = 0; i < miasto_nr; i++) odwiedzone_tab[i] = false; // w tym miejscu co się odbywa?
  odwiedzone_tab[miasto_start] = true;

  cout << miasto_start + 1;
  //OBLICZENIA
  int temp = miasto_start; // tablica pomocnicza
  for (int i = 0; i < miasto_nr - 1; i++) {

    float miasto_x = tab[temp][0]; //wartość x miasta w którym jestem wyciagnieta z tablicy miast
    float miasto_y = tab[temp][1]; //wartość y miasta w którym jestem wyciagnieta z tablicy miast

    float dystans = 0, najblizsza_odleglosc = 0;
    bool first = true;

    for (int i = 0; i < miasto_nr; i++) {
      if (odwiedzone_tab[i] == false) {
        cout << setprecision(2); // Ustawienie precyzji wyniku
        dystans = sqrt(pow((miasto_x - tab[i][0]), 2) + pow((miasto_y - tab[i][1]), 2)); //obliczneie odleglosci (x1-x2)^2 + (y1-y2)^2 [pierwiatek z wartosci]
        if (first == true) // nawiązując do pooprzedniej odpowiedzi to można usunać tą linijke? i program bedzie działać bez problemów?

        {
          najblizsza_odleglosc = dystans + 1; // dlaczego jest dystans +1 ???
          first = false;
        }
        if (dystans != 0 && dystans < najblizsza_odleglosc) // sprawdzenie czy odleglosc jest najmniejsza
        {
          najblizsza_odleglosc = dystans; //przypisanie wartosci dystans do najblizsza_odlegosc
          sasiad = i; // numer miast do ktorego odleglosc jest najmniejsza
        }
      }
    }
    SUM += najblizsza_odleglosc; // suma odleglosci przebytej drogi
    temp = sasiad;
    odwiedzone_tab[temp] = true;
    cout << " -> " << sasiad + 1;  // Dlaczego do wartości sąsiad jest dodawana jedynka?
  }
  cout << " -> " < droga_calkowita = sqrt(pow((tab[miasto_start][0] - tab[sasiad][0]), 2) + pow((tab[miasto_start][1] - tab[sasiad][1]), 2)); // powrot do miasta startowego
  SUM += droga_calkowita;
  cout << "\n\nCalkowita dlugosc trasy: " << SUM << "\n";
  return 0;
}

Wstawiam sformatowany kod. Oraz proszę o wytłumaczenie działania algorytmu. Z tego co ja widze:

  1. Program deklaruje dwuwymiarową tablice dla współrzędnych, o wybranej przez nas wielkości bo podajemy ilość miast.
  2. Współrzędne są wprowadzane do dwóch kolumn.
  3. Wybieramy miasto początkowe.
  4. Program oblicza najkrótszą trasę.

Jedyne co potrzebuje wiedzieć to opis jak program dokonuje tychże obliczeń. Zadałem kilka pytań w kodzie jako komentarze.

1
Oskar8876 napisał(a):

Witam serdecznie, jest to mój pierwszy post na tym forum :) Potrzebuje o dodatkowe opisanie jak działa algorytm, który umieszczam. Zaznaczam że nie jestem jego autorem, ale potrzebuje zrozumieć co do czego służy. Umieściłem w poszczególnych komentarzach to czego nie wiem.

Problem polega na tym, że autor tego kodu za bardzo nie zna na programowaniu.
Wszystko jest w funkcji main, a to znaczy, że nie tylko ty będziesz miał problemy ze zrozumieniem co robi ten kod.
Dlatego nie wzoruj się na tym kodzie, a jak musisz go zmienić/poprawić itp, to najlepiej jak systematycznie będziesz wydzielał mniejsze funkcje z tego kodu.

0

dzięki za pomoc wszystkim :P

1 użytkowników online, w tym zalogowanych: 0, gości: 1