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

TSP - Pomoc w przerobieniu programu

VPS Starter Arubacloud
0 głosów
137 wizyt
pytanie zadane 28 kwietnia 2019 w C i C++ przez BinaryMan Stary wyjadacz (12,620 p.)

Witam !
Mam następujący problem, nie mam pomysłu jak przerobić rozwiązanie Traveling Salesman Problem-u tak aby sprawdzał mi możliwe drogi z każdego dostępnego miasta :( Na razie zrobiłem tak że sprawdza mi tylko z miasta o pozycji 0 0 w macierzy i wyświetla przebytą drogę i koszt.
Liczę na jakąś podpowiedź, bo siedzę już 2 dzień nad tym i nic mi nie przychodzi do głowy.

#include <iostream>
#include <vector>
#include <algorithm>
#include <fstream>
#include <cstdlib>
#include <string>
#include <bits/stdc++.h>
#include <math.h>

using namespace std;

int real_cost = 0;
int cost_before_swapping = 0;

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

int calculate_cost(int point1, int x_point1, int y_point1, int point2, int x_point2, int y_point2) // liczymy koszt(dystans) przej�cia z jednego wierzcho�ka do drugiego, koszt to odleglosc miedzy nimi
{
    int distance;

    distance = (pow((x_point2 - x_point1), 2) + pow((y_point2 - y_point1), 2));
    distance = sqrt(distance);
    distance = abs(distance);

    //cout << "Distance between " << point1 << " and " << point2 << " = " << distance << endl;
    return distance;
}

int main()
{
    vector<points> point_s; // tworzenie vectora struktur

    // operacje na pliku z danymi
    fstream file;
    file.open("test_point.txt", ios::in);

    if (file.good())
    {
        // zmienne pomocnicze do wyciagania danych z poszczegolnych linii o punktach
        int order = 0;
        int xcoordinate = 0;
        int ycoordinate = 0;
        while (!file.eof())
        {
            file >> order;
            file >> xcoordinate;
            file >> ycoordinate;
            point_s.push_back({order, xcoordinate, ycoordinate}); // wpisywanie punktow do wektora
        }
        point_s.pop_back(); // UWAGA OSTATNI PUNKT JEST ZDUBLOWANY I MUSIMY GO USUNAC !!!
    }
    else
    {
        cout << "File error!" << endl;
    }
    file.close();

    /* Algorytm naiwny "Znajdowanie Najblizszego Sasiada"
    Tylko ten algorytm strtuje od iasta 0/0 i tylko dla tego wyznacza trase 
    */

    // 1. Tworzenie macierzy kwadratowej miast i wypelnienie jej odleglosciami

    int grid[point_s.size()][point_s.size()]; //macierz miast wraz z odleglosciami miedzy punktami
    int visited_points[point_s.size()];
    for (int i = 0; i < point_s.size(); i++)
        visited_points[i] = 0; // 0 - nieodwiedzone, 1 - odwiedzone

    for (int i = 0; i < point_s.size(); i++) // obliczanie drogi(kosztu) z punktu do punktu
    {
        for (int y = 0; y < point_s.size(); y++)
        {
            grid[i][y] = calculate_cost(point_s[i].ordinal_number, point_s[i].x_cordinate, point_s[i].y_cordinate, point_s[y].ordinal_number, point_s[y].x_cordinate, point_s[y].y_cordinate);
        }
    }

    
    int number_of_points = point_s.size();
    visited_points[0] = 1;
    int min_cost = 2000000;
    int current=0; // ten ktory ogladamy teraz (dokladniej ten wiersz)
    int next = 0; // nastepny punkt (majmniejsza trasa do tego punktu)
    while (number_of_points--)
    {
        for(int i=0; i<point_s.size(); i++)
        {
            if((min_cost > grid[current][i]) && (visited_points[i] == 0))
            {
                min_cost = grid[current][i];
                next = i;
            }

        }
        visited_points[next]=1;
        cout<<current<<" --> "; // wyswietlanie trasy
        current = next;
        real_cost += min_cost;        
        min_cost = 20000000;
        if(number_of_points == 0)
        {
        real_cost += grid[current][0];
        }
    }
    cout<<"0 ";
    cout<<"Cost: "<<real_cost-20000000<<endl;


    return 0;
}

Zawartość pliku z punktami:
 

1 0 15
2 0 33
3 0 51
4 0 60
5 2 21
6 5 40
7 0 11 
8 10 10 
9 9 9 
10 14 56

 

1
komentarz 28 kwietnia 2019 przez j23 Mędrzec (195,220 p.)

Nawiasem:

point_s.pop_back(); // UWAGA OSTATNI PUNKT JEST ZDUBLOWANY I MUSIMY GO USUNAC !!!

Wystarczy, że zrobisz poprawnie pętlę czytającą:

while (file >> order >> xcoordinate >> ycoordinate) {
        point_s.push_back({order, xcoordinate, ycoordinate}); 
}

i nic Ci się nie będzie dublować na końcu ;)

komentarz 29 kwietnia 2019 przez BinaryMan Stary wyjadacz (12,620 p.)
o dzięki :D

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

Podobne pytania

0 głosów
2 odpowiedzi 1,472 wizyt
pytanie zadane 20 października 2018 w Java przez Kamyyylo Początkujący (460 p.)
–1 głos
0 odpowiedzi 190 wizyt
pytanie zadane 10 lutego 2020 w C i C++ przez Nabuchadonozor Gaduła (3,120 p.)
+1 głos
2 odpowiedzi 574 wizyt
pytanie zadane 12 czerwca 2019 w C i C++ przez k222 Nałogowiec (30,150 p.)

92,958 zapytań

141,920 odpowiedzi

321,149 komentarzy

62,291 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.

Wprowadzenie do ITsec, tom 2

Można już zamawiać tom 2 książki "Wprowadzenie do bezpieczeństwa IT" - będzie to około 650 stron wiedzy o ITsec (17 rozdziałów, 14 autorów, kolorowy druk).

Planowana premiera: 30.09.2024, zaś planowana wysyłka nastąpi w drugim tygodniu października 2024.

Warto preorderować, tym bardziej, iż mamy dla Was kod: pasja (użyjcie go w koszyku), dzięki któremu uzyskamy dodatkowe 15% zniżki! Dziękujemy zaprzyjaźnionej ekipie Sekuraka za kod dla naszej Społeczności!

...