Advertisement
Guest User

Untitled

a guest
Nov 20th, 2017
72
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 8.34 KB | None | 0 0
  1. #include <iostream>
  2. #include <vector>
  3. using namespace std;
  4.  
  5. double eps = 0.0000001;
  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]);
  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.     setlocale(LC_CTYPE, "rus");
  28.     double m = 6, n = 11;
  29.  
  30.     cout << "Введите m: ";
  31.     cin >> m;
  32.     cout << "Введите n: ";
  33.     cin >> n;
  34.     //double **mas;
  35.  
  36.     //cin >> st; //Число строк
  37.     l = st + 1;
  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.  
  92.             cout << " " << mas[i][j] << " ";
  93.         }
  94.         cout << " " << endl;
  95.     }
  96.     cout << endl << "***********************************" << endl;
  97.  
  98.     int w = 0;
  99.     w = sv + 1;
  100.  
  101.     //определяем оптимальность решения
  102.     int kpol = 0;
  103.     for (int j = 0; j < k; j++)
  104.     {
  105.         if (mas[l - 1][j] > 0)
  106.             kpol++;
  107.     }
  108.     // cout<<"kpol="<<kpol<<"\n";если в последней строчке 4 положительных числа,то мы нашли решение
  109.     cout << "целевая функция равняется" << mas[l - 1][k - 1] << "\n";
  110.  
  111.     while (kpol<w)
  112.     {
  113.         kpol = 0;
  114.  
  115.         // поиск минимального
  116.         min = 0;
  117.         for (int j = 1; j < sv; j++)
  118.             if (mas[l - 1][j] < mas[l - 1][min]) min = j;
  119.         cout << " этот столбец ведущий " << mas[l - 1][min] << endl;
  120.         double t;
  121.  
  122.         t = mas[l - 1][min];
  123.  
  124.         // поиск столбца
  125.         cout << endl << "***********************************" << endl;
  126.         int myn = 0;
  127.         double r = 0, z = 0;
  128.         z = (mas[myn][k - 1]) / (mas[myn][min]);
  129.         for (int i = 1; i < st; i++)
  130.         {
  131.             r = (mas[i][k - 1]) / (mas[i][min]);
  132.             if (z>r) myn = i;
  133.         }
  134.         cout << "эта строка ведущая " << mas[myn][k - 1] << endl;
  135.         cout << "строка" << myn;
  136.         cout << endl << "***********************************" << "\n";
  137.         cout << "коэффицент" << mas[myn][min] << endl;
  138.  
  139.         //деление на выбранный элемент
  140.         double u = 0;
  141.         u = mas[myn][min];//для деления на коэффициент
  142.         for (int j = 0; j < k; j++)
  143.         {
  144.             mas[myn][j] = mas[myn][j] / u;
  145.         }
  146.         cout << endl;
  147.  
  148.         //вывод массива
  149.         cout << endl << "***********************************" << endl;
  150.         cout << endl;
  151.         for (int i = 0; i < l; i++)
  152.         {
  153.             for (int j = 0; j < k; j++)
  154.             {
  155.                 cout << " " << mas[i][j] << " ";
  156.             }
  157.             cout << " " << endl;
  158.         }
  159.  
  160.  
  161.         //из элеметов соответствующих строк вычитаем элементы найденной нам строки
  162.         double p = 0;
  163.         for (int i = 0; i < l; i++)
  164.         {
  165.             p = mas[i][min];
  166.             if (i != myn)
  167.             {
  168.                 for (int j = 0; j < k; j++)
  169.                 {
  170.                     mas[i][j] = mas[i][j] - mas[myn][j] * p;
  171.                 }
  172.             }
  173.         }
  174.  
  175.  
  176.         //вывод массива
  177.         cout << endl << "***********************************" << endl;
  178.         cout << endl;
  179.         for (int i = 0; i < l; i++)
  180.         {
  181.             for (int j = 0; j < k; j++)
  182.             {
  183.                 cout << " " << mas[i][j] << " ";
  184.             }
  185.             cout << " " << endl;
  186.         }
  187.  
  188.         cout << endl << "***********************************" << endl;
  189.         //cout<<"целевая функция равняется"<<mas[n-1][k-1]<<"\n";
  190.         for (int j = 0; j < k; j++)
  191.         {
  192.             if (mas[l - 1][j]>0)
  193.                 kpol++;
  194.         }
  195.         // cout<<"kpol="<<kpol<<"\n";если в последней строчке  положительных числа столько, сколько было x(+1 своб.член),то мы нашли решение
  196.     }
  197.     cout << "решение оптимально,целевая функция равняется" << mas[l - 1][k - 1] << "\n";
  198.     int ooo = 0; bool b = true;
  199.     while (bEndFlag)
  200.     {
  201.  
  202.         if (vec_is_int(mas, k - 1))
  203.             bEndFlag = false;
  204.         else
  205.         {
  206.  
  207.             ooo = 0;
  208.             for (int i = 0; i<2; i++)
  209.             {
  210.                 int w = k - 1;
  211.                 if (mas[i][w] != 0)
  212.                 {
  213.                     double xr = mas[i][w] - (float)((int)mas[i][w]),
  214.                         xz = mas[ooo][w] - (float)((int)mas[ooo][w]);
  215.                     if (abs(xr)>abs(xz))
  216.                         ooo = i;
  217.                 }
  218.             }
  219.             k++;
  220.             for (int i = 0; i < l; i++)
  221.             {
  222.                 mas[i].resize(k); //Выделение памяти для каждой строки по k-столбцов
  223.             }
  224.             vector<double> q(k);
  225.             for (int j = 0; j < k - 1; j++)
  226.             {
  227.                 q[j] = -mas[ooo][j] + floor(mas[ooo][j]);
  228.             }
  229.             q[k - 1] = 1;
  230.             mas.push_back(q); swap(mas[l - 1], mas[l]);
  231.             for (int i = 0; i <= l; i++)
  232.             {
  233.                 swap(mas[i][k - 1], mas[i][k - 2]);
  234.             }
  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.                     if (abs(mas[i][j]) < eps)
  252.                         mas[i][j] = 0;
  253.                     cout << " " << mas[i][j] << " ";
  254.                 }
  255.                 cout << " " << endl;
  256.             }
  257.  
  258.             cout << endl << "***********************************" << endl;
  259.             //system("pause");
  260.             vector<double> O(k - 1);
  261.  
  262.  
  263.             int myn = -1;
  264.             for (int i = 0; i < l - 1; i++)
  265.                 if (mas[i][k - 1]<-eps)
  266.                 {
  267.                     myn = i; break;
  268.                 }
  269.  
  270.             for (int i = 0; i < l - 1; i++)
  271.             {
  272.                 if (mas[i][k - 1]<-eps && mas[i][k - 1]<mas[myn][k - 1])
  273.                     myn = i;
  274.             }
  275.             for (int j = 0; j < k - 1; j++)
  276.             {
  277.                 if (mas[myn][j]<-eps)
  278.                 {
  279.                     O[j] = mas[l - 1][j] / mas[myn][j];
  280.                 }
  281.                 else
  282.                 {
  283.                     O[j] = 999999999999999999;
  284.                 }
  285.             }min = 0;
  286.             for (int j = 0; j < k - 1; j++)
  287.                 if (abs(O[j])>eps && O[j]<O[min]) min = j;
  288.             cout << " ведущий " << min << " | " << O[min] << endl;
  289.             double u = 0;
  290.             u = mas[myn][min];//для деления на коэффициент
  291.  
  292.                               //cout << " ведущий " << min << " | " << myn << endl;
  293.                               //из элеметов соответствующих строк вычитаем элементы найденной нам строки
  294.             double p = 0;
  295.             vector<vector<double>> temp(l);
  296.             for (int i = 0; i < l; i++)
  297.                 temp[i].resize(k);
  298.             for (int i = 0; i < l; i++)
  299.             {
  300.                 p = mas[i][min];
  301.                 for (int j = 0; j < k; j++)
  302.                 {
  303.                     if (i != myn)
  304.                     {
  305.                         temp[i][j] = mas[i][j] - (mas[myn][j] * p / u);
  306.                     }
  307.                     else
  308.                     {
  309.                         temp[i][j] = mas[i][j] / u;
  310.                     }
  311.                 }
  312.  
  313.             }
  314.             mas = temp;
  315.             //вывод массива
  316.             //cout << endl << "***********************************" << endl;
  317.             //cout << endl;
  318.             //for (int i = 0; i < l; i++)
  319.             //{
  320.             //  for (int j = 0; j < k; j++)
  321.             //  {
  322.             //      cout << " " << mas[i][j] << " ";
  323.             //  }
  324.             //  cout << " " << endl;
  325.             //}
  326.         }
  327.     }
  328.     double x1 = -17, x2 = -17;
  329.     for (int i = 0; i < l; i++)
  330.     {
  331.         if (mas[i][0] == 1)
  332.             x1 = mas[i][k - 1];
  333.         if (mas[i][1] == 1)
  334.             x2 = mas[i][k - 1];
  335.  
  336.     }
  337.     cout << endl << endl << "x1: "<< x1 << "x2: "<< x2;
  338.     system("pause");
  339.     return 0;
  340. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement