Advertisement
Guest User

Untitled

a guest
Mar 26th, 2019
77
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 5.24 KB | None | 0 0
  1. #include <iostream>
  2. #include <fstream>
  3. #include <windows.h>
  4. #include <process.h>
  5.  
  6. using namespace std;
  7.  
  8. int n;
  9. int k;
  10. int amount;
  11.  
  12. const int threads = 4;
  13.  
  14. unsigned int WINAPI ThreadFunction(LPVOID pvParam)
  15. {
  16.     int* values = new int[pow(k, n)];
  17.     int* incr = new int[n];
  18.     int* vars = new int[n];
  19.     int* maxValue = new int[k];
  20.     int* minValue = new int[k];
  21.     int* maxPoint = new int[k];
  22.     int* minPoint = new int[k];
  23.     int thread_id = (int)pvParam;
  24.     int index;
  25.     int incrDifference;
  26.     int iterations;
  27.     int real_k;
  28.     int linear;
  29.     bool algorithm;
  30.     bool found = false;
  31.     bool* exist = new bool[k];
  32.     string filename = "functions";
  33.     filename += (thread_id + '0');
  34.     filename += ".txt";
  35.     ifstream in(filename);
  36.     string outfile = "results";
  37.     outfile += (thread_id + '0');
  38.     outfile += ".txt";
  39.     ofstream out(outfile);
  40.     string shortname = "i";
  41.     shortname += (thread_id + '0');
  42.     shortname += ".txt";
  43.     ofstream iters(shortname);
  44.     while (!in.eof())
  45.     {
  46.         for (int i = 0; i < pow(k, n); i++)
  47.             in >> values[i];
  48.         for (int i = 0; i < n; i++)
  49.         {
  50.             incr[i] = 0;
  51.             for (int j = 0; j < pow(k, n - 1); j++)
  52.             {
  53.                 index = j;
  54.                 for (int l = n - 2; l >= 0; l--)
  55.                 {
  56.                     vars[l] = index % k;
  57.                     index -= vars[l];
  58.                     index /= k;
  59.                     if (l >= i)
  60.                         vars[l + 1] = vars[l];
  61.                 }
  62.                 for (int l = 0; l < k - 1; l++)
  63.                 {
  64.                     vars[i] = l;
  65.                     index = 0;
  66.                     for (int m = 0; m < n; m++)
  67.                         index += (vars[m] * pow(k, n - m - 1));
  68.                     incrDifference = values[index];
  69.                     index -= (vars[i] * pow(k, n - i - 1));
  70.                     for (int m = l + 1; m < k; m++)
  71.                     {
  72.                         vars[i] = m;
  73.                         index += (vars[i] * pow(k, n - i - 1));
  74.                         incr[i] += (values[index] - incrDifference);
  75.                         index -= (vars[i] * pow(k, n - i - 1));
  76.                     }
  77.                 }
  78.             }
  79.         }
  80.         algorithm = false;
  81.         iterations = 0;
  82.         while (!algorithm)
  83.         {
  84.             iterations++;
  85.             found = false;
  86.             for (int i = 0; i < k; i++)
  87.                 exist[i] = false;
  88.             for (int i = 0; i < pow(k, n); i++)
  89.             {
  90.                 index = i;
  91.                 linear = 0;
  92.                 for (int j = n - 1; j >= 0 ; j--)
  93.                 {
  94.                     vars[j] = index % k;
  95.                     linear += (vars[j] * incr[j]);
  96.                     index -= vars[j];
  97.                     index /= k;
  98.                 }
  99.                 if (!exist[values[i]])
  100.                 {
  101.                     exist[values[i]] = true;
  102.                     maxPoint[values[i]] = i;
  103.                     maxValue[values[i]] = linear;
  104.                     minPoint[values[i]] = i;
  105.                     minValue[values[i]] = linear;
  106.                 }
  107.                 else
  108.                 {
  109.                     if (maxValue[values[i]] < linear)
  110.                     {
  111.                         maxPoint[values[i]] = i;
  112.                         maxValue[values[i]] = linear;
  113.                     }
  114.                     if (minValue[values[i]] > linear)
  115.                     {
  116.                         minPoint[values[i]] = i;
  117.                         minValue[values[i]] = linear;
  118.                     }
  119.                 }
  120.             }
  121.             real_k = k;
  122.             for (int i = k - 1; i >= 0; i--)
  123.                 if (!exist[i])
  124.                 {
  125.                     for (int j = i + 1; j < real_k; j++)
  126.                     {
  127.                         maxPoint[j - 1] = maxPoint[j];
  128.                         maxValue[j - 1] = maxValue[j];
  129.                         minPoint[j - 1] = minPoint[j];
  130.                         minValue[j - 1] = minValue[j];
  131.                     }
  132.                     real_k--;
  133.                 }
  134.             for(int i = 0; i < real_k - 1; i++)
  135.                 if (maxValue[i] > minValue[i + 1])
  136.                 {
  137.                     found = true;
  138.                     index = maxPoint[i];
  139.                     for (int j = n - 1; j >= 0; j--)
  140.                     {
  141.                         vars[j] = index % k;
  142.                         incr[j] -= vars[j];
  143.                         index -= vars[j];
  144.                         index /= k;
  145.                     }
  146.                     index = minPoint[i + 1];
  147.                     for (int j = n - 1; j >= 0; j--)
  148.                     {
  149.                         vars[j] = index % k;
  150.                         incr[j] += vars[j];
  151.                         index -= vars[j];
  152.                         index /= k;
  153.                     }
  154.                     break;
  155.                 }
  156.             if (!found)
  157.             {
  158.                 for(int i = real_k - 1; i >= 0; i--)
  159.                     if (!exist[i])
  160.                     {
  161.                         real_k++;
  162.                         for (int j = real_k - 1; j > i; j--)
  163.                         {
  164.                             maxPoint[values[j + 1]] = maxPoint[values[j]];
  165.                             maxValue[values[j + 1]] = maxValue[values[j]];
  166.                             minPoint[values[j + 1]] = minPoint[values[j]];
  167.                             minValue[values[j + 1]] = minValue[values[j]];
  168.                         }
  169.                         minValue[i] = maxValue[i - 1] + 1;
  170.                         maxValue[i] = minValue[i + 1] - 1;
  171.                     }
  172.                 out << "coeffs = {";
  173.                 for (int i = 0; i < n - 1; i++)
  174.                     out << incr[i] << ", ";
  175.                 out << incr[n - 1] << "}\tborders = {";
  176.                 for (int i = 1; i < k; i++)
  177.                     out << minValue[i] << ", ";
  178.                 out << "infinity}\titerations = " << iterations << ".\n";
  179.                 algorithm = true;
  180.                 iters << iterations << "\n";
  181.             }
  182.         }
  183.     }
  184.     delete[] values;
  185.     delete[] incr;
  186.     delete[] vars;
  187.     delete[] maxValue;
  188.     delete[] minValue;
  189.     delete[] maxPoint;
  190.     delete[] minPoint;
  191.     delete[] exist;
  192.     out.close();
  193.     iters.close();
  194.     in.close();
  195. }
  196.  
  197. int readInfo()
  198. {
  199.     int tmpThreads = 0;
  200.     ifstream info("info.txt");
  201.     info >> n >> k >> amount >> tmpThreads;
  202.     info.close();
  203.     if (tmpThreads != threads)
  204.     {
  205.         printf("[x] threads amount doesn't match. change the value at line 12.\n");
  206.         return 0;
  207.     }
  208.     return 1;
  209. }
  210.  
  211. int main()
  212. {
  213.     int starttime = GetTickCount();
  214.     if (!readInfo())
  215.         return 0;
  216.     HANDLE hThreads[threads];
  217.     for (int i = 0; i < threads; i++)
  218.     {
  219.         hThreads[i] = (HANDLE)_beginthreadex(NULL, 0, ThreadFunction, (LPVOID)i, 0, NULL);
  220.         if (hThreads[i] == NULL)
  221.         {
  222.             printf("[x] thread #%d cannot be created, error %d", i, GetLastError());
  223.             return 1;
  224.         }
  225.     }
  226.     WaitForMultipleObjects(threads, hThreads, TRUE, INFINITE);
  227.     //ThreadFunction((LPVOID)3);
  228.     printf("program is finished in %d ms\n", (GetTickCount() - starttime));
  229.     system("pause");
  230.     return 0;
  231. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement