Advertisement
mamamaria

Untitled

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