Cześć,
jestem w trakcie pisania (przyznam bez bicia, że przerobiłem gotowy algorytm z internetu) programu, który:
- z pliku wczyta punkty o danych współrzędnych i wagach
- za pomocą algorytmu z powrotami wyznaczy ścieżkę krótszą niż ileśtam (podane w pliku) o najwyższej sumie wag
- wypisze najwyższą sumę wag oraz indeksy kolejnych miast na ścieżce w sposób: start miasto1 miasto2 ... start
#include <iostream>
#include <stack>
#include <fstream>
#include <cmath>
using namespace std;
struct sWierzch{
int x;
int y;
int waga;
int indeks;
};
int n,m,najw_profit,aktual_profit,it,aktual_dlugosc; //n - il wierzch, m - max dlugosc, it - zlicza iteracje
bool *czyOdwiedz; // tab odwiedzin
sWierzch *W; // tab wierzcholkow
stack <sWierzch> najl_droga;
stack <sWierzch> aktual_droga;
int odleglosc(sWierzch w1, sWierzch w2)
{
return ( sqrt( (w1.x-w2.x)*(w1.x-w2.x) + (w1.y-w2.y)*(w1.y-w2.y) ) );
}
void TSP(sWierzch v)
{
int u;
it++; //zliczamy iteracje - elementy stosu?
aktual_droga.push(v); // zapamiętujemy na stosie bieżący wierzchołek
if(it < n) // jeśli brak ścieżki Hamiltona, to jej szukamy
{
czyOdwiedz[it] = true; // Oznaczamy bieżący wierzchołek jako odwiedzony
for(u = 0; u < n; u++) // Przeglądamy sąsiadów wierzchołka v
if(!czyOdwiedz[u] && ((aktual_dlugosc + odleglosc(v,W[u]) + odleglosc(W[u],W[0])) <= m) ) /* Szukamy nieodwiedzonego jeszcze sąsiada, sprawdzamy, czy droga bedzie miala odpowiednia dlugosc*/
{
aktual_profit += W[u].waga; // Dodajemy wagę u do profitu
aktual_dlugosc += odleglosc(v,W[u]); //Dodajemy odleglosc od aktualnego wierzcholka do nastepnego
TSP(W[u]); // Rekurencja
aktual_profit -= W[u].waga; // Usuwamy wagę u z sumy
}
czyOdwiedz[it] = false; // Zwalniamy bieżący wierzchołek
}
else if((aktual_dlugosc + odleglosc(v,W[it]) + odleglosc(W[it],W[0])) <= m) // Jeśli nie ma nieodwiedzonych sasiadow, a droga spelnia warunek
{
// to sprawdzamy, czy aktualny profit jest najwiekszy
if(aktual_profit > najw_profit) // Jeśli tak,
{
najw_profit = aktual_profit;
najl_droga = aktual_droga;
}
}
aktual_droga.pop();
it--; // Usuwamy bieżący wierzchołek ze ścieżki
}
int main()
{
int i;
ifstream in;
in.open("in.txt");
in >> n >> m; // Czytamy liczbę wierzchołków i ich wagi
// Inicjalizacja
czyOdwiedz = new bool [n];
W = new sWierzch [n];
for(i = 0; i < n; i++)
{
czyOdwiedz[i] = false;
W[i] = {0,0,0,0};
}
it = 0;
// Odczytujemy dane wejściowe
for(i = 0; i < n; i++)
{
in >> W[i].x >> W[i].y >> W[i].waga;
W[i].indeks = i;
}
// Rozpoczynamy algorytm
najw_profit = 0;
aktual_profit = 0;
aktual_dlugosc = 0;
TSP(W[0]);
cout <<W[0].indeks<<" ";
while(!najl_droga.empty())
{
cout << najl_droga.top().indeks << " ";
najl_droga.pop();
}
cout << "najw_profit = " << najw_profit << "\n";
// Sprzatamy
in.close();
delete [] czyOdwiedz;
delete [] W;
return 0;
}
Niestety, program nie działa, chociaż się kompiluje i zwraca jakieś wartości.
Błąd siedzi gdzieś w funkcji TSP (ponieważ nie nauczyli mnie/nauczyłem się debugować w cpp, sprawdziłem to cout'ami, więc mam nadzieję, że tylko tam), konkretnie zdaje mi się, że skopałem warunek na długość trasy albo odwołania do wierzchołków.
Z góry dziękuję za pomoc :)
PS. Uczę się pisać "czysty kod" - prosiłbym Was o krytykę również pod tym kątem.
odl_od_ost_do_pierw = ...
- zgubiłeśhipot