Advertisement
Guest User

Untitled

a guest
Nov 20th, 2017
76
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 8.41 KB | None | 0 0
  1. #include <iostream>
  2. #include <vector>
  3. using namespace std;
  4.  
  5. double eps = 0.00000001;
  6. bool vec_is_int(vector<vector<double>> v, int j)
  7. {
  8.     double k;
  9.     for (int i = 0; i < v.size() - 2; i++)
  10.     {
  11.     if (v[i][j]<0)
  12.         return false;
  13.     }
  14.     for (int i = 0; i<v.size() - 1; i++)
  15.     {
  16.         k = abs(round(v[i][j]) - v[i][j]);//(v[i][j] > 0) ? abs(v[i][j] - floor(v[i][j])) :abs(abs(v[i][j])-floor(abs(v[i][j])));
  17.         if (k >eps)
  18.             return false;
  19.     }
  20.     return true;
  21. }
  22.  
  23. int main()
  24. {
  25.     int l, k, st = 2, sv = 2;
  26.     bool bEndFlag = true;
  27.  
  28.     double m = 6, n = 11;
  29.     //double **mas;
  30.  
  31.     setlocale(LC_CTYPE, "rus");
  32.  
  33.     cout << "Введите количесво строк массива(к-во у-й): ";
  34.     //cin >> st; //Число строк
  35.     l = st + 1;
  36.  
  37.     cout << "Введите количесво столбцов массива(к-во х): ";
  38.     //cin >> sv; //Число столбцов
  39.     k = sv + l;
  40.  
  41.     //mas = new double*[n]; //Выделение памяти под n-строк
  42.  
  43.     //for (i = 0; i < n; i++)
  44.     //{
  45.     //  mas[i] = new double[k]; //Выделение памяти для каждой строки по k-столбцов
  46.     //}
  47.     vector<vector<double>> mas(l);
  48.  
  49.     for (int i = 0; i < l; i++)
  50.     {
  51.         mas[i].resize(k); //Выделение памяти для каждой строки по k-столбцов
  52.     }
  53.     mas[0][0] = m;
  54.     mas[0][1] = m;
  55.     mas[0][2] = 1;
  56.     mas[0][3] = 0;
  57.     mas[0][4] = 53;
  58.     mas[1][0] = n + 1;
  59.     mas[1][1] = 1;
  60.     mas[1][2] = 0;
  61.     mas[1][3] = 1;
  62.     mas[1][4] = 23;
  63.     mas[2][0] = -n;
  64.     mas[2][1] = -n + 1;
  65.     mas[2][2] = 0;
  66.     mas[2][3] = 0;
  67.     mas[2][4] = 0;
  68.  
  69.  
  70.     //for (i = 0; i < l; i++)
  71.     //{
  72.     //  if (i<l - 1)
  73.     //      cout << "Введите коэффициенты(значения базисных переменных,свободные члены) " << i + 1 << " -го ур-ия" << endl;
  74.     //  else
  75.     //      cout << "Введите целевую функцию с ОТРИЦАТЕЛЬНЫМ ЗНАКОМ: " << endl;
  76.     //  for (j = 0; j < k; j++)
  77.     //  {
  78.     //      cout << "mas[" << i << "][" << j << "]="; //Ввод массива
  79.     //      cin >> mas[i][j];
  80.     //  }
  81.     //}
  82.     //вывод массива
  83.     cout << endl;
  84.     cout << endl << "***********************************" << endl;
  85.     cout << " Таблица: " << endl;
  86.     int min;
  87.     for (int i = 0; i < l; i++)
  88.     {
  89.         for (int j = 0; j < k; j++)
  90.         {
  91.             cout << " " << mas[i][j] << " ";
  92.         }
  93.         cout << " " << endl;
  94.     }
  95.     cout << endl << "***********************************" << endl;
  96.  
  97.     int w = 0;
  98.     w = sv + 1;
  99.  
  100.     //определяем оптимальность решения
  101.     int kpol = 0;
  102.     for (int j = 0; j < k; j++)
  103.     {
  104.         if (mas[l - 1][j] > 0)
  105.             kpol++;
  106.     }
  107.     // cout<<"kpol="<<kpol<<"\n";если в последней строчке 4 положительных числа,то мы нашли решение
  108.     cout << "целевая функция равняется" << mas[l - 1][k - 1] << "\n";
  109.  
  110.     while (kpol<w)
  111.     {
  112.         kpol = 0;
  113.  
  114.         // поиск минимального
  115.         min = 0;
  116.         for (int j = 1; j < sv; j++)
  117.             if (mas[l - 1][j] < mas[l - 1][min]) min = j;
  118.         cout << " этот столбец ведущий " << mas[l - 1][min] << endl;
  119.         double t;
  120.  
  121.         t = mas[l - 1][min];
  122.  
  123.         // поиск столбца
  124.         cout << endl << "***********************************" << endl;
  125.         int myn = 0;
  126.         double r = 0, z = 0;
  127.         z = (mas[myn][k - 1]) / (mas[myn][min]);
  128.         for (int i = 1; i < st; i++)
  129.         {
  130.             r = (mas[i][k - 1]) / (mas[i][min]);
  131.             if (z>r) myn = i;
  132.         }
  133.         cout << "эта строка ведущая " << mas[myn][k - 1] << endl;
  134.         cout << "строка" << myn;
  135.         cout << endl << "***********************************" << "\n";
  136.         cout << "коэффицент" << mas[myn][min] << endl;
  137.  
  138.         //деление на выбранный элемент
  139.         double u = 0;
  140.         u = mas[myn][min];//для деления на коэффициент
  141.         for (int j = 0; j < k; j++)
  142.         {
  143.             mas[myn][j] = mas[myn][j] / u;
  144.         }
  145.         cout << endl;
  146.  
  147.         //вывод массива
  148.         cout << endl << "***********************************" << endl;
  149.         cout << endl;
  150.         for (int i = 0; i < l; i++)
  151.         {
  152.             for (int j = 0; j < k; j++)
  153.             {
  154.                 cout << " " << mas[i][j] << " ";
  155.             }
  156.             cout << " " << endl;
  157.         }
  158.  
  159.  
  160.         //из элеметов соответствующих строк вычитаем элементы найденной нам строки
  161.         double p = 0;
  162.         for (int i = 0; i < l; i++)
  163.         {
  164.             p = mas[i][min];
  165.             if (i != myn)
  166.             {
  167.                 for (int j = 0; j < k; j++)
  168.                 {
  169.                     mas[i][j] = mas[i][j] - mas[myn][j] * p;
  170.                 }
  171.             }
  172.         }
  173.  
  174.  
  175.         //вывод массива
  176.         cout << endl << "***********************************" << endl;
  177.         cout << endl;
  178.         for (int i = 0; i < l; i++)
  179.         {
  180.             for (int j = 0; j < k; j++)
  181.             {
  182.                 cout << " " << mas[i][j] << " ";
  183.             }
  184.             cout << " " << endl;
  185.         }
  186.  
  187.         cout << endl << "***********************************" << endl;
  188.         //cout<<"целевая функция равняется"<<mas[n-1][k-1]<<"\n";
  189.         for (int j = 0; j < k; j++)
  190.         {
  191.             if (mas[l - 1][j]>0)
  192.                 kpol++;
  193.         }
  194.         // cout<<"kpol="<<kpol<<"\n";если в последней строчке  положительных числа столько, сколько было x(+1 своб.член),то мы нашли решение
  195.     }
  196.     cout << "решение оптимально,целевая функция равняется" << mas[l - 1][k - 1] << "\n";
  197.     int ooo = 0; bool b = true;
  198.     while (bEndFlag)
  199.     {
  200.  
  201.         if (vec_is_int(mas, k - 1))
  202.             bEndFlag = false;
  203.         else
  204.         {
  205.  
  206.             ooo = 0;
  207.             for (int i = 0; i<2; i++)
  208.             {
  209.                 int w = k - 1;
  210.                 if(mas[i][w]!=0)
  211.                 {
  212.                 double xr = mas[i][w] - (float)((int)mas[i][w]),
  213.                     xz =  mas[ooo][w] - (float)((int)mas[ooo][w]);
  214.                 if (abs(xr)>abs(xz))
  215.                     ooo = i;
  216.                 }
  217.             }
  218.             k++;
  219.             for (int i = 0; i < l; i++)
  220.             {
  221.                 mas[i].resize(k); //Выделение памяти для каждой строки по k-столбцов
  222.             }
  223.             vector<double> q(k);
  224.             for (int j = 0; j < k - 1; j++)
  225.             {
  226.                 q[j] = -mas[ooo][j] + floor(mas[ooo][j]);
  227.             }
  228.             q[k - 1] = 1;
  229.             mas.push_back(q);
  230.             for (int i = 0; i <= l; i++)
  231.             {
  232.                 swap(mas[i][k - 1], mas[i][k - 2]);
  233.             }
  234.             swap(mas[l - 1], mas[l]);
  235.             if (b)
  236.             {
  237.                 b = false;
  238.                 for (int i = 0; i < k; i++)
  239.                 {
  240.                         mas[l][i] = -mas[l][i];
  241.                 }
  242.             }
  243.             l++;
  244.             //вывод массива
  245.             cout << endl << "***********************************" << endl;
  246.             cout << endl;
  247.             for (int i = 0; i < l; i++)
  248.             {
  249.                 for (int j = 0; j < k; j++)
  250.                 {
  251.                    
  252.                     cout << " " << mas[i][j] << " ";
  253.                 }
  254.                 cout << " " << endl;
  255.             }
  256.  
  257.             cout << endl << "***********************************" << endl;
  258.             //system("pause");
  259.             vector<double> O(k - 1);
  260.            
  261.            
  262.             int myn = -1;
  263.             for(int i = 0; i < l - 1; i++)
  264.                 if(mas[i][k - 1]<0 )
  265.                 {
  266.                     myn = i; break;
  267.                 }
  268.  
  269.             for (int i = 0; i < l - 1; i++)
  270.             {
  271.                 if (mas[i][k - 1]<0&&mas[i][k - 1]<mas[myn][k - 1])
  272.                     myn = i;
  273.             }
  274.             for (int j = 0; j < k - 1; j++)
  275.             {
  276.                 if (mas[myn][j]<0)
  277.                 {
  278.                     O[j] = mas[l - 1][j] / mas[myn][j];
  279.                 }
  280.                 else
  281.                 {
  282.                     O[j] = numeric_limits<double>::max() - 10;
  283.                 }
  284.             }min = 0;
  285.             for (int j = 0; j < k - 1; j++)
  286.                 if (O[j]!=-0&&O[j]<O[min]) min = j;
  287.             cout << " ведущий " << min << " | " << O[min] << endl;
  288.             double u = 0;
  289.             u = mas[myn][min];//для деления на коэффициент
  290.  
  291.             //cout << " ведущий " << min << " | " << myn << endl;
  292.             //из элеметов соответствующих строк вычитаем элементы найденной нам строки
  293.             double p = 0;
  294.             vector<vector<double>> temp(l);
  295.             for (int i = 0; i < l; i++)
  296.                 temp[i].resize(k);
  297.             for (int i = 0; i < l; i++)
  298.             {
  299.                 p = mas[i][min];
  300.                 for (int j = 0; j < k; j++)
  301.                 {
  302.                     if (i != myn)
  303.                     {
  304.                         temp[i][j] =mas[i][j] - (mas[myn][j] * p/ u);
  305.                     }
  306.                     else
  307.                     {
  308.                         temp[i][j] = mas[i][j] / u;
  309.                     }
  310.                 }
  311.  
  312.             }
  313.             mas = temp;
  314.             //вывод массива
  315.             //cout << endl << "***********************************" << endl;
  316.             //cout << endl;
  317.             //for (int i = 0; i < l; i++)
  318.             //{
  319.             //  for (int j = 0; j < k; j++)
  320.             //  {
  321.             //      cout << " " << mas[i][j] << " ";
  322.             //  }
  323.             //  cout << " " << endl;
  324.             //}
  325.         }
  326.     }
  327.     double x1=-17, x2=-17;
  328.     for (int i = 0; i < l; i++)
  329.     {
  330.         if (mas[i][0]==1)
  331.             x1 = mas[i][k-1];
  332.         if (mas[i][1] == 1)
  333.             x2 = mas[i][k - 1];
  334.  
  335.     }
  336.     cout << endl << endl << x1 << x2;
  337.     system("pause");
  338.     return 0;
  339. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement