Advertisement
mamamaria

BetterNearestNeighborSearch.cpp

Nov 2nd, 2021
499
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 3.03 KB | None | 0 0
  1. // NearestNeighborSearch.cpp : Этот файл содержит функцию "main". Здесь начинается и заканчивается выполнение программы.
  2. //
  3.  
  4. #include <iostream>
  5. #include <vector>
  6. #include <ctime>
  7. #include <random>
  8.  
  9. const int N = 30;
  10.  
  11. using namespace std;
  12. //default_random_engine eng(time(0));
  13. default_random_engine eng;
  14.  
  15. using Graph = vector<vector<double>>;
  16. using Visit = vector <bool>;
  17. using VisitedPoints = vector<int>;
  18.  
  19. Graph GraphGenerator() {
  20.     Graph graph(N);
  21.     for (int i = 0; i < graph.size(); i++) {
  22.         graph[i].resize(N);
  23.     }
  24.     uniform_real_distribution<double> distr(1, 10);
  25.     for (int i = 0; i < graph.size(); i++) {
  26.         for (int j = 0; j <= i; j++) {
  27.             if (i == j) {
  28.                 graph[i][j] = 0;
  29.                 graph[j][i] = 0;
  30.                 continue;
  31.             }
  32.             double dist = distr(eng);
  33.             graph[i][j] = dist;
  34.             graph[j][i] = graph[i][j];
  35.         }
  36.     }
  37.     return graph;
  38. }
  39. Visit VisitGenerator() {
  40.     Visit visit(N);
  41.     for (int i = 0; i < N; i++)
  42.         visit[i] = false;
  43.     return visit;
  44. }
  45. void GraphPrinter(Graph graph) {
  46.     for (int i = 0; i < graph.size(); i++) {
  47.         for (int j = 0; j < graph.size(); j++)
  48.             cout << graph[i][j] << " ";
  49.         cout << endl;
  50.     }
  51.     cout << endl;
  52. }
  53. void VisitPrinter(Visit visit) {
  54.     for (int i = 0; i < visit.size(); i++)
  55.         cout << visit[i] << " ";
  56.     cout << endl;
  57. }
  58.  
  59. int NearestWayFinder(Graph graph, int index, double& wayLength, Visit& visit) {
  60.     double minimalWay = INFINITY;
  61.     int minimalWayIndex = 0;
  62.     for (int i = 0; i < N; i++)
  63.         if (graph[index][i] < minimalWay && visit[i] == false) {
  64.             minimalWay = graph[index][i];
  65.             minimalWayIndex = i;
  66.         }
  67.     wayLength += minimalWay;
  68.     return (minimalWayIndex);
  69. }
  70.  
  71. double TravelingSalesmanNeighbour(Graph& graph, Visit& visit,int i, VisitedPoints &Visited) {
  72.  
  73.     int visitedCounter = 1;
  74.     int nearestIndex = i;  double wayLength = 0;
  75.     visit[i] = true; Visited.push_back(i);
  76.     while (visitedCounter != N) {
  77.         nearestIndex = NearestWayFinder(graph, nearestIndex, wayLength, visit);
  78.         visitedCounter++;
  79.         visit[nearestIndex] = true; Visited.push_back(nearestIndex);
  80.     }
  81.     wayLength += graph[i][nearestIndex];
  82.     return wayLength;
  83. }
  84.  
  85. int main() {
  86.     srand(time(0));
  87.     Graph graph = GraphGenerator();
  88.     Visit visit = VisitGenerator();
  89.     GraphPrinter(graph);
  90.     //VisitPrinter(visit);
  91.  
  92.     vector< VisitedPoints> allVisitedPoints;
  93.     double minWaylen = INFINITY;
  94.     int minWayLenIndex = 0;
  95.     for (int i = 0; i < N; i++) {
  96.         Visit visit = VisitGenerator();
  97.         VisitedPoints Visited;
  98.         double wayLen = TravelingSalesmanNeighbour(graph, visit, i, Visited);
  99.         //cout << "wayLen: " << wayLen << endl;
  100.         if (wayLen < minWaylen) {
  101.             minWaylen = wayLen;
  102.             minWayLenIndex = i;
  103.         }
  104.         /*VisitPrinter(visit);*/
  105.         allVisitedPoints.push_back(Visited);
  106.         //cout << "Visited points: " << endl;
  107.         /*for (int i = 0; i < Visited.size(); i++)
  108.             cout << Visited[i] << " ";
  109.         cout << endl;*/
  110.     }
  111.     cout << "minlenWay: " << minWaylen << endl;
  112.     cout << "minLenWay way:" << endl;
  113.     for (int j = 0; j < N; j++)
  114.         cout << allVisitedPoints[minWayLenIndex][j] <<" ";
  115.  
  116. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement