Advertisement
Guest User

Untitled

a guest
Apr 21st, 2018
71
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 2.53 KB | None | 0 0
  1. #define _CRT_SECURE_NO_WARNINGS
  2. #include <iostream>
  3. #include<math.h>
  4. #include<vector>
  5. #include<climits>
  6. #include <queue>
  7. #include<string>
  8. #include <iomanip>
  9. #include <algorithm>
  10. #include <random>  
  11. using namespace std;
  12. int n;
  13.  
  14. struct gtip {
  15.     vector <int> g;
  16.     double f;
  17.  
  18. };
  19. vector <gtip> pop(20);
  20.  
  21. double put[31][31];
  22.  
  23.  
  24.  
  25.  
  26.  
  27. gtip dirtyfuck(int x, int y)
  28. {
  29.     gtip C;
  30.     bool u[31]{ 0 };
  31.     double h = 1 - (pop[x].f / (pop[x].f + pop[y].f));
  32.  
  33.     for (int i = 0; i < n; i++)
  34.     {
  35.         int j = i;
  36.         double l = (double)(rand()) / RAND_MAX;
  37.         if (l <= h)
  38.         {
  39.             while (u[pop[x].g[j]] == 1)
  40.             {
  41.                 if (j == n - 1)
  42.                     j = 0;
  43.                 else
  44.                     j++;
  45.             }
  46.             C.g.push_back(pop[x].g[j]);
  47.             u[pop[x].g[j]] = 1;
  48.  
  49.  
  50.         }
  51.         else
  52.         {
  53.             while (u[pop[y].g[j]] == 1)
  54.             {
  55.                 if (j == n - 1)
  56.                     j = 0;
  57.                 else
  58.                     j++;
  59.             }
  60.             C.g.push_back(pop[y].g[j]);
  61.             u[pop[y].g[j]] = 1;
  62.         }
  63.     }
  64.     return C;
  65.  
  66. }
  67.  
  68. bool comp(gtip x, gtip y)
  69. {
  70.     if (x.f < y.f)
  71.         return true;
  72.     return false;
  73. }
  74.  
  75. double fitness(gtip C)
  76. {
  77.     double s = 0;
  78.     for (int i = 0; i < n - 1; i++)
  79.     {
  80.         s += put[C.g[i]][C.g[i + 1]];
  81.     }
  82.     s += put[C.g[0]][C.g[n-1]];
  83.     return s;
  84. }
  85.  
  86. gtip mut(gtip C)
  87. {
  88.     int a1, a2;
  89.     a1 = rand() % n;
  90.     a2 = rand() % n;
  91.     swap(C.g[a1], C.g[a2]);
  92.     return C;
  93. }
  94.  
  95. void genetic()
  96. {
  97.     int c = 0;
  98.     gtip det[191];
  99.     for (int i = 0; i < 20; i++)
  100.         for (int j = i + 1; j < 20; j++)
  101.         {
  102.             det[c] = dirtyfuck(i, j);
  103.             det[c] = mut(det[c]);
  104.             det[c].f = fitness(det[c]);
  105.             c++;
  106.         }
  107.     det[c] = pop[0];
  108.     sort(det, det + 191, comp);
  109.     for (int i = 0; i < 20; i++)
  110.         pop[i] = det[i];
  111.  
  112. }
  113.  
  114.  
  115.  
  116.  
  117. int main() {
  118.     freopen("input.txt", "r", stdin);
  119.     freopen("output.txt", "w", stdout);
  120.     cin >> n;
  121.     srand(time(NULL));
  122.     cout.precision(6);
  123.  
  124.     vector <pair<int, int>> v(n);
  125.     for (int i = 0; i < n; i++)
  126.     {
  127.         cin >> v[i].first >> v[i].second;
  128.     }
  129.     for (int i = 0; i<n - 1; i++)
  130.         for (int j = i + 1; j < n; j++)
  131.         {
  132.             int a1, a2;
  133.             a1 = (v[i].first - v[j].first)*(v[i].first - v[j].first);
  134.             a2 = (v[i].second - v[j].second)*(v[i].second - v[j].second);
  135.             put[i][j] = sqrt(a1 + a2);
  136.             put[j][i] = put[i][j];
  137.         }
  138.  
  139.     for (int i = 0; i < 20; i++)
  140.     {
  141.         for (int j = 0; j < n; j++)
  142.         {
  143.             pop[i].g.push_back(j);
  144.  
  145.         }
  146.         random_shuffle(pop[i].g.begin(), pop[i].g.end());
  147.     }
  148.     for (int i = 0; i < 20; i++)
  149.     {
  150.         pop[i].f = fitness(pop[i]);
  151.  
  152.     }
  153.  
  154.  
  155.    
  156.     for (int i = 0; i < 200; i++)
  157.     {
  158.         genetic();
  159.     }
  160.    
  161.     cout << fixed << pop[0].f << endl;
  162.     for (int i = 0; i < n; i++)
  163.         cout << pop[0].g[i] + 1 << " ";
  164.  
  165.  
  166.  
  167.     return 0;
  168. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement