Advertisement
Guest User

Untitled

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