Advertisement
Guest User

MMVSS optimisation

a guest
Dec 13th, 2019
112
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 5.79 KB | None | 0 0
  1. #include <iostream>
  2. #include <iomanip>
  3. #include <string>
  4. #include <cmath>
  5.  
  6. using namespace std;
  7.  
  8. struct matrix_elem
  9. {
  10.     double value;
  11.     int i;
  12.     int j;
  13. };
  14.  
  15. template<typename T>
  16. T ** alloc_matrix(int nrows, int ncols)
  17. {
  18.     T ** temp_matrix = new T*[nrows];
  19.     for (int i = 0; i < nrows; ++i)
  20.     {
  21.         temp_matrix[i] = new T[ncols];
  22.         for (int j = 0; j < ncols; ++j)
  23.         {
  24.             temp_matrix[i][j] = 0;
  25.         }
  26.     }
  27.  
  28.     return temp_matrix;
  29. }
  30.  
  31. template<typename T>
  32. void delete_matrix(T ** matrix, int nrows)
  33. {
  34.     for (int i = 0; i < nrows; ++i)
  35.     {
  36.         delete[] matrix[i];
  37.     }
  38.     delete[] matrix;
  39. }
  40.  
  41. template<typename T>
  42. T read_value()
  43. {
  44.     T result;
  45.     if (cin >> result)
  46.         return result;
  47.  
  48.     cout << "wrong value" << endl;
  49.     return read_value<T>();
  50. }
  51.  
  52. template<typename T>
  53. void read_matrix(T ** matrix, int nrows, int ncols)
  54. {
  55.     if (ncols != 1)
  56.     {
  57.         for (int i = 0; i < nrows; ++i)
  58.         {
  59.             for (int j = 0; j < ncols; ++j)
  60.             {
  61.                 matrix[i][j] = read_value<T>();
  62.             }
  63.         }
  64.     }
  65.     else
  66.     {
  67.         for (int i = 0; i < nrows; i++)
  68.         {
  69.             *matrix[i] = read_value<T>();
  70.         }
  71.     }
  72. }
  73.  
  74. template<typename T>
  75. void print_matrix(T ** matrix, int nrows, int ncols)
  76. {
  77.     for (int i = 0; i < nrows; ++i)
  78.     {
  79.         for (int j = 0; j < ncols; ++j)
  80.         {
  81.             cout << setw(9) << matrix[i][j] << " ";
  82.         }
  83.         cout << endl;
  84.     }
  85. }
  86.  
  87. void calculate_DEL(double ** DEL,
  88.                     double ** A,
  89.                     double ** b0,
  90.                     int nrows,
  91.                     int ncols,
  92.                     int L,
  93.                     int dc,
  94.                     int Optimal_i,
  95.                     int Optimal_j)
  96. {
  97.     double Bm = 0.0;
  98.     double Am = 0.0;
  99.  
  100.     for (int i = 0; i < nrows; ++i)
  101.     {
  102.         for (int j = 0; j < ncols; ++j)
  103.         {
  104.             Bm = b0[i][j];
  105.             Am = A[i][j];
  106.  
  107.             if (Optimal_i == i && Optimal_j == j)
  108.                 Bm += dc;
  109.  
  110.             DEL[i][j] = L / (Bm - Am);
  111.         }
  112.     }
  113. }
  114.  
  115. void calculate_dl(double ** dl,
  116.                     double ** DEL,
  117.                     int ** R,
  118.                     int nrows,
  119.                     int ncols)
  120. {
  121.     double sum = 0.0;
  122.  
  123.     for (int i = 1; i <= nrows; ++i)
  124.     {
  125.         for (int j = 1; j <= ncols; ++j)
  126.         {
  127.             sum = 0.0;
  128.  
  129.             if (i == j)
  130.             {
  131.                 sum = DEL[i - 1][j - 1];
  132.             }
  133.             else
  134.             {
  135.                 int vert = i;
  136.                 int next_vert = j;
  137.  
  138.                 while (vert != j) {
  139.                     next_vert = R[vert - 1][j - 1];
  140.  
  141.                     sum += DEL[vert - 1][next_vert - 1];
  142.  
  143.                     vert = next_vert;
  144.                 }
  145.             }
  146.  
  147.             dl[i - 1][j - 1] = sum;
  148.         }
  149.     }
  150. }
  151.  
  152. double calculate_sum(double ** dl,
  153.                     int nrows,
  154.                     int ncols,
  155.                     double Topt)
  156. {
  157.     double sum = 0.0;
  158.  
  159.     for (int i = 0; i < nrows; ++i)
  160.     {
  161.         for (int j = 0; j < ncols; ++j)
  162.         {
  163.             sum += (dl[i][j] - Topt) * (dl[i][j] - Topt);
  164.         }
  165.     }
  166.  
  167.     return sum;
  168. }
  169.  
  170. matrix_elem find_min_O(double ** O,
  171.                                 int nrows,
  172.                                 int ncols,
  173.                                 double pred_min_value)
  174. {
  175.     matrix_elem new_min = {pred_min_value, 0, 0};
  176.  
  177.     for (int i = 0; i < nrows; ++i)
  178.     {
  179.         for (int j = 0; j < ncols; ++j)
  180.         {
  181.             if (O[i][j] != 0)
  182.             {
  183.                 double temp_min = O[i][j];
  184.  
  185.                 if (temp_min < pred_min_value)
  186.                 {
  187.                     new_min.value = temp_min;
  188.                     new_min.i = i;
  189.                     new_min.j = j;
  190.                 }
  191.             }
  192.         }
  193.     }
  194.     return new_min;
  195. }
  196.  
  197. void calculate_optimal(double ** O,
  198.                         double ** dl,
  199.                         double ** b0,
  200.                         double ** A,
  201.                         double ** B,
  202.                         int ** R,
  203.                         double ** DEL,
  204.                         int nrows,
  205.                         int ncols,
  206.                         double Topt,
  207.                         int dc,
  208.                         int L)
  209. {
  210.     for (int i = 0; i < nrows; ++i)
  211.     {
  212.         for (int j = 0; j < ncols; ++j)
  213.         {
  214.             if (b0[i][j] != 0)
  215.             {
  216.                 calculate_DEL(DEL, A, b0, nrows, ncols, L, dc, i, j);
  217.             }
  218.             calculate_dl(dl, DEL, R, nrows, ncols);
  219.  
  220.             O[i][j] = calculate_sum(dl, nrows, ncols, Topt);
  221.         }
  222.     }
  223. }
  224.  
  225. void start_optimisation(double ** O,
  226.                         double ** dl,
  227.                         double ** b0,
  228.                         double ** A,
  229.                         double ** B,
  230.                         double ** DEL,
  231.                         int ** R,
  232.                         int nrows,
  233.                         int ncols,
  234.                         double Topt,
  235.                         int L,
  236.                         int dc)
  237. {
  238.     double O_pred = 10E16;
  239.     matrix_elem min = { 10E16, 0, 0 };
  240.  
  241.     int iteration = 0;
  242.    
  243.     do
  244.     {
  245.         cout << "iteration: " << ++iteration << endl;
  246.         O_pred = min.value;
  247.  
  248.         calculate_optimal(O, dl, b0,
  249.                             A, B, R,
  250.                             DEL, nrows, ncols,
  251.                             Topt, dc, L);
  252.  
  253.         min = { O[0][0], 0, 0 };
  254.  
  255.         min = find_min_O(O, nrows, ncols, min.value);
  256.  
  257.         b0[min.i][min.j] += dc;
  258.  
  259.     } while (min.value < O_pred);
  260. }
  261.  
  262. int main()
  263. {
  264.     double T0 = 0.1;    //seconds
  265.     int L = 200 * 8;        //byte
  266.     int a0 = 85600;     //kbit/s
  267.     double q = 98.0;    //probability
  268.  
  269.     int nverts = 20;    //number of graph verts
  270.     double y0 = 0.1;    //Erlang
  271.  
  272.     double Topt = T0 / 2;   //optimal delay
  273.     int dc = 10000;         //step
  274.  
  275.     int ** R = alloc_matrix<int>(nverts, nverts);
  276.     double ** A = alloc_matrix<double>(nverts, nverts);
  277.     double ** B = alloc_matrix<double>(nverts, nverts);
  278.     double ** b0 = alloc_matrix<double>(nverts, nverts);
  279.     double ** DEL = alloc_matrix<double>(nverts, nverts);
  280.     double ** dl = alloc_matrix<double>(nverts, nverts);
  281.     double ** O = alloc_matrix<double>(nverts, nverts);
  282.  
  283.     cout << "R" << endl;
  284.     read_matrix(R, nverts, nverts);
  285.     cout << "A" << endl;
  286.     read_matrix(A, nverts, nverts);
  287.     cout << "B" << endl;
  288.     read_matrix(B, nverts, nverts);
  289.  
  290.     for (int i = 0; i < nverts; ++i)
  291.     {
  292.         for (int j = 0; j < nverts; ++j)
  293.         {
  294.             b0[i][j] = B[i][j];
  295.         }
  296.     }
  297.  
  298.     cout << "START OPTIMISATION" << endl;
  299.  
  300.     start_optimisation(O, dl, b0,
  301.                         A, B, DEL,
  302.                         R, nverts, nverts,
  303.                         Topt, L, dc);
  304.  
  305.     cout << "B0" << endl;
  306.     print_matrix<double>(b0, nverts, nverts);
  307.     cout << "DEL" << endl;
  308.     print_matrix<double>(DEL, nverts, nverts);
  309.     cout << "DL" << endl;
  310.     print_matrix<double>(dl, nverts, nverts);
  311.     cout << "O" << endl;
  312.     print_matrix<double>(O, nverts, nverts);
  313.  
  314.     cout << "press any key to exit..." << endl;
  315.     string exit;
  316.     cin >> exit;
  317.  
  318.     delete_matrix(R, nverts);
  319.     delete_matrix(A, nverts);
  320.     delete_matrix(B, nverts);
  321.     delete_matrix(b0, nverts);
  322.     delete_matrix(DEL, nverts);
  323.     delete_matrix(dl, nverts);
  324.     delete_matrix(O, nverts);
  325.     return 0;
  326. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement