Advertisement
hugol

Untitled

Apr 13th, 2015
227
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 10.72 KB | None | 0 0
  1. #include <vector>
  2. #include <iostream>
  3. #include <map>
  4. #include <list>
  5. using namespace std;
  6.  
  7. const double eps = 1e-12; // stała przybliżenia zera
  8. double d = 0.85;
  9.  
  10. double getXY(map<int, map<int, double>> &macierz_sasiedztwa, int x, int y)
  11. {
  12.     if ((macierz_sasiedztwa.find(x) != macierz_sasiedztwa.end())
  13.         && (macierz_sasiedztwa[x].find(y) != macierz_sasiedztwa[x].end()) )
  14.     {
  15.         return macierz_sasiedztwa[x][y];
  16.     }
  17.     else
  18.         return 0;
  19.  
  20. }
  21.  
  22. double getXYRazyMacierzDiag(vector <double> &ilosc, map<int, map<int, double>> &macierz_sasiedztwa, int x, int y)
  23. {
  24.     if (y>=ilosc.size())
  25.         return getXY(macierz_sasiedztwa, x, y);
  26.  
  27.  
  28.     double ret = 0;
  29.     if ((macierz_sasiedztwa.find(x) != macierz_sasiedztwa.end())
  30.         && (macierz_sasiedztwa[x].find(y) != macierz_sasiedztwa[x].end()) )
  31.     {
  32.         // jezeli jest polaczenie
  33.         ret = ret - macierz_sasiedztwa[x][y];
  34.         ret = ret * (double)d/(double)ilosc[y];
  35.         ret = ret + (x==y ? 1.0 : 0.0);
  36.         // return -(double)macierz_sasiedztwa[x][y] * (double)d/(double)ilosc[y] + x==y;
  37.     }
  38.     else
  39.     {
  40.         if (!(ilosc[x] > 0))
  41.         {
  42.                 //return double(0.0-(1.0 * d/(double)ilosc.size()) + x==y);
  43.                 ret = ret - (1.0 * d/(double)ilosc.size());
  44.                 ret = ret + (double)x==y;
  45.         }
  46.         else
  47.             //return double(0.0 + x==y);
  48.             ret = (double)x==y;
  49.     }
  50.  
  51.     return ret;
  52.  
  53. }
  54.  
  55. void setXY(map<int, map<int, double>> &macierz_sasiedztwa, int x, int y, double val)
  56. {
  57.     if (fabs(val) >= eps)
  58.         macierz_sasiedztwa[x][y]= val;
  59. }
  60.  
  61. void setXYRazyMacierzDiag(vector <double> &ilosc, map<int, map<int, double>> &macierz_sasiedztwa, int x, int y, double val)
  62. {
  63.     if (fabs(val) < eps)
  64.         return;
  65.  
  66.  
  67.     if (y>=ilosc.size())
  68.     {
  69.         setXY(macierz_sasiedztwa, x, y, val);
  70.         return;
  71.     }
  72.  
  73.     double set;
  74.  
  75.     // jezeli jest polaczenie
  76.     //ret = ret - macierz_sasiedztwa[x][y];
  77.     //ret = ret * (double)d/(double)ilosc[y];
  78.     //ret = ret + (x==y ? 1.0 : 0.0);
  79.  
  80.     set = val;
  81.     set = set - (x==y ? 1.0 : 0.0);
  82.     set = set / ((double)d/(double)ilosc[y]);
  83.     macierz_sasiedztwa[x][y] = -set;
  84.  
  85.  
  86. }
  87.  
  88. bool gauss0(list<int> &cols, vector <double> &ilosc, map<int, map<int, double>> &AB, vector<double> &X)
  89. {
  90.     int i,j,k,n;
  91.     double m,s;
  92.     n=X.size(); // ilosc wierszy
  93.  
  94.     // eliminacja
  95.     for(i = 0; i < n - 1; i++)
  96.     //for(map<int, map<int, double>>::iterator it=AB.begin(); it!=AB.end(); ++it)
  97.     {
  98.         /*if (ilosc[it->first]<1)
  99.             continue;*/
  100.  
  101.        
  102.         // musi iterowac zawsze gdy jakikolwiek element dla kazdych wierszy nie tylko dla danego
  103.         //list<int>::iterator it3= cols.begin();
  104.         //advance (it3, it->first);
  105.         //for(it3 ; it3 != cols.end(); ++it3)
  106.         for(j = i + 1; j < n; j++)
  107.         {
  108.             /*j = *it3;
  109.             if (j==n || j == it->first)
  110.                 continue;*/
  111.             // zero na przekatnej
  112.             //if(fabs(AB[i][i]) < eps) return false;
  113.             if(fabs(getXYRazyMacierzDiag(ilosc, AB, i,i)) < eps)
  114.                 return false;
  115.  
  116.             //m = -AB[j][i] / AB[i][i];
  117.             m = -getXYRazyMacierzDiag(ilosc, AB, j, i) / getXYRazyMacierzDiag(ilosc, AB, i, i);
  118.             if (fabs(m) < eps)
  119.                 continue;
  120.             for(k = i + 1; k <= n; k++)
  121.             //for(map<int, double>::iterator it2=it->second.begin(); it2!=it->second.end(); ++it2)
  122.                 //AB[j][k] += m * AB[i][k];
  123.                 setXYRazyMacierzDiag(ilosc, AB, j, k, getXYRazyMacierzDiag(ilosc, AB, j, k) + (m*getXYRazyMacierzDiag(ilosc, AB, i, k)));
  124.         }
  125.     }
  126.  
  127.     // wyliczanie niewiadomych
  128.     for(i = n - 1; i >= 0; i--)
  129.     {
  130.         /*if (ilosc[i]<1)
  131.             continue;*/
  132.  
  133.         //s = AB[i][n];
  134.         s = getXYRazyMacierzDiag(ilosc, AB, i, n);
  135.  
  136.         for(j = n - 1; j >= i + 1; j--)
  137.             //s -= AB[i][j] * X[j];
  138.             s -= getXYRazyMacierzDiag(ilosc, AB, i, j) * X[j];
  139.         // zero na przekatnej
  140.         //if(fabs(AB[i][i]) < eps) return false;
  141.         if(fabs( getXYRazyMacierzDiag(ilosc, AB, i, i) ) < eps) return false;
  142.         X[i] = s / getXYRazyMacierzDiag(ilosc, AB, i, i);
  143.     }
  144.     return true;
  145. }
  146.  
  147. bool gauss(vector <vector<double>> &AB, vector<double> &X)
  148. {
  149.     int i,j,k,n;
  150.     double m,s;
  151.     n=AB.size(); // ilosc wierszy
  152.  
  153.     // usuwanie zer z przekatnej
  154.     for(i = 0; i < n - 1; i++)
  155.     {
  156.         if(abs(AB[i][i]) < eps) // 0
  157.         {
  158.             for(j = 0; j < n - 1; j++)
  159.             {
  160.                 if (j==i)
  161.                     continue;
  162.                 if (AB[j][i] >= eps && AB[i][j] >= eps)
  163.                 {
  164.                     vector<double> tmp = AB[i];
  165.                     AB[i] = AB[j];
  166.                     AB[j] = tmp;
  167.                     i = 0;
  168.                 }
  169.             }
  170.         }
  171.     }
  172.  
  173.  
  174.     // eliminacja
  175.     for(i = 0; i < n - 1; i++)
  176.     {
  177.         for(j = i + 1; j < n; j++)
  178.         {
  179.             // zero na przekatnej
  180.             if(fabs(AB[i][i]) < eps) return false;
  181.             m = -AB[j][i] / AB[i][i];
  182.             for(k = i + 1; k <= n; k++)
  183.                 AB[j][k] += m * AB[i][k];
  184.         }
  185.     }
  186.  
  187.     // wyliczanie niewiadomych
  188.     for(i = n - 1; i >= 0; i--)
  189.     {
  190.         s = AB[i][n];
  191.         for(j = n - 1; j >= i + 1; j--)
  192.             s -= AB[i][j] * X[j];
  193.         // zero na przekatnej
  194.         if(fabs(AB[i][i]) < eps) return false;
  195.         X[i] = s / AB[i][i];
  196.     }
  197.     return true;
  198. }
  199.  
  200.  
  201. bool wczytaj0(list<int> &cols, vector <double> &ilosc, map<int, map<int, double>> &macierz_sasiedztwa)
  202. {
  203.     int currId = 0;
  204.     int src, dst;
  205.     int count = 0;
  206.  
  207.     while (!cin.eof())
  208.     {
  209.         cin >> src >> dst;
  210.         if (cin.eof())
  211.             break;
  212.  
  213.  
  214.         if (src > count)
  215.             count = src;
  216.         if (dst > count)
  217.             count = dst;
  218.         while(ilosc.size() <= count)
  219.             ilosc.push_back( 0 );
  220.         ilosc[src]++;
  221.         cols.push_back(src);
  222.  
  223.         setXY(macierz_sasiedztwa, dst, src, 1);
  224.     }
  225.  
  226.     cols.sort();
  227.     cols.unique();
  228.     return true;
  229. }
  230.  
  231.  
  232. bool wczytaj1()
  233. {
  234.     std::multimap<unsigned int, unsigned int> pairs;
  235.  
  236.     unsigned int left, right, max=0;
  237.     while (std::cin >> left >> right)
  238.     {
  239.         if (max < left)
  240.         {
  241.             max = left;
  242.         }
  243.         if (max < right)
  244.         {
  245.             max = right;
  246.         }
  247.         pairs.insert( pair<unsigned int,unsigned int> (left, right) );
  248.  
  249.     }
  250.  
  251.     //return pairs;
  252.     return true;
  253. }
  254.  
  255. bool wczytaj(vector <double> &ilosc, vector< vector<double> > &macierz_sasiedztwa)
  256. {
  257.     int currId = 0;
  258.  
  259.     int src, dst;
  260.     int count = 0;
  261.     while (!cin.eof())
  262.     {
  263.         int idSrc, idDst;
  264.  
  265.         cin >> src >> dst;
  266.         if (cin.eof() || src == -1)
  267.             break;
  268.  
  269.         /* powiekszanie wektorow*/
  270.  
  271.         if (src > count)
  272.             count = src;
  273.         if (dst > count)
  274.             count = dst;
  275.         while(ilosc.size() <= count)
  276.             ilosc.push_back( 0 );
  277.         while(macierz_sasiedztwa.size() <= count)
  278.         {
  279.             macierz_sasiedztwa.push_back(vector<double>());
  280.         }
  281.         for(int i=0; i<macierz_sasiedztwa.size(); i++)
  282.         {
  283.             while (macierz_sasiedztwa[i].size() <= count)
  284.             {
  285.                 macierz_sasiedztwa[i].push_back( 0 );
  286.             }
  287.         }
  288.  
  289.  
  290.         ilosc[src]++;
  291.         macierz_sasiedztwa[dst][src] = 1;
  292.  
  293.     }
  294.  
  295.     return true;
  296. }
  297.  
  298. void wypisz_macierz(vector< vector<double> > &sasiedztwo)
  299. {
  300.     for(int i=0; i<sasiedztwo.size(); i++)
  301.     {
  302.         for(int j=0; j<sasiedztwo[i].size(); j++)
  303.         {
  304.             cout << sasiedztwo[i][j] << "\t";
  305.         }
  306.         cout << endl;
  307.     }
  308. }
  309.  
  310. void wypisz_macierz1(vector<double> &ilosc, map<int, map<int, double>> &sasiedztwo)
  311. {
  312.     for(int i=0; i<ilosc.size(); i++)
  313.     {
  314.         for(int j=0; j<ilosc.size()+1; j++)
  315.         {
  316.             //cout << getxsasiedztwo[i][j] << "\t";
  317.             cout << getXYRazyMacierzDiag(ilosc, sasiedztwo, i, j) << "\t";
  318.         }
  319.         cout << endl;
  320.     }
  321. }
  322.  
  323. void wypisz_macierz0(vector<double> &ilosc, map<int, map<int, double>> &sasiedztwo)
  324. {
  325.     for(int i=0; i<ilosc.size(); i++)
  326.     {
  327.         for(int j=0; j<ilosc.size()+1; j++)
  328.         {
  329.             //cout << getxsasiedztwo[i][j] << "\t";
  330.             cout << getXY(sasiedztwo, i, j) << "\t";
  331.         }
  332.         cout << endl;
  333.     }
  334. }
  335.  
  336. vector <vector<double>> do_wektora(vector<double> &ilosc, map<int, map<int, double>> &sasiedztwo)
  337. {
  338.     vector <vector<double>>  ret;
  339.     vector<double> wers;
  340.     for(int i=0; i<ilosc.size(); i++)
  341.     {
  342.         wers.clear();
  343.         ret.push_back(wers);
  344.         for(int j=0; j<ilosc.size()+1; j++)
  345.         {
  346.             ret[i].push_back(getXY(sasiedztwo, i, j) );
  347.         }
  348.         cout << endl;
  349.     }
  350.  
  351.     return ret;
  352. }
  353.  
  354. void pomnoz_razy_macierz_diagonalna0(vector<double> &ilosc, map<int, map<int, double>>  &sasiedztwo)
  355. {
  356.    
  357.     for(int i=0; i<ilosc.size(); i++)
  358.     {
  359.         // dodanie krawedzi do wszystkich
  360.         if (!(ilosc[i] > 0))
  361.         {
  362.             ilosc[i] = ilosc.size()-1;
  363.             for (int j=0; j<ilosc.size(); j++)
  364.             {
  365.                 if (i==j)
  366.                     continue;
  367.                 //sasiedztwo[j][i] = 1;
  368.                 setXY(sasiedztwo, j, i, 1);
  369.             }
  370.         }
  371.  
  372.         for(int j=0; j<ilosc.size(); j++)
  373.         {
  374.             //sasiedztwo[j][i] *= d/ilosc[i];
  375.             setXY(sasiedztwo, j, i, (getXY(sasiedztwo, j, i) * d)/ilosc[i]);
  376.         }
  377.     }
  378. }
  379.  
  380. void pomnoz_razy_macierz_diagonalna(vector<double> &ilosc, vector< vector<double> > &sasiedztwo)
  381. {
  382.    
  383.     for(int i=0; i<ilosc.size(); i++)
  384.     {
  385.         // dodanie krawedzi do wszystkich
  386.         if (!(ilosc[i] > 0))
  387.         {
  388.             ilosc[i] = sasiedztwo[i].size()-1;
  389.             for (int j=0; j<sasiedztwo[i].size(); j++)
  390.             {
  391.                 if (i==j)
  392.                     continue;
  393.                 sasiedztwo[j][i] = 1;
  394.             }
  395.         }
  396.  
  397.         for(int j=0; j<sasiedztwo[i].size(); j++)
  398.         {
  399.             sasiedztwo[j][i] *= d/ilosc[i];
  400.         }
  401.     }
  402. }
  403.  
  404. void dodaj_kolumne(vector< vector<double> > &sasiedztwo)
  405. {
  406.     for(int i=0; i<sasiedztwo.size(); i++)
  407.     {
  408.         sasiedztwo[i].push_back( (1.0-d) / double(sasiedztwo.size()) );
  409.     }
  410. }
  411.  
  412. void dodaj_kolumne0(vector<double> &ilosc, map<int, map<int, double>> &sasiedztwo)
  413. {
  414.     for(int i=0; i<ilosc.size(); i++)
  415.     {
  416.         //sasiedztwo[i].push_back( (1.0-d) / double(sasiedztwo.size()) );
  417.         setXY(sasiedztwo, i, ilosc.size(),  (1.0-d) / double(ilosc.size()));
  418.     }
  419. }
  420.  
  421. void I_odj_macierz(vector< vector<double> > &sasiedztwo)
  422. {
  423.     for(int i=0; i<sasiedztwo.size(); i++)
  424.     {
  425.         for(int j=0; j<sasiedztwo[i].size(); j++)
  426.         {
  427.             sasiedztwo[i][j] = 0-sasiedztwo[i][j];
  428.             sasiedztwo[i][j] += i==j;
  429.         }
  430.     }
  431. }
  432.  
  433. void I_odj_macierz0(vector<double> &ilosc, map<int, map<int, double>> &sasiedztwo)
  434. {
  435.     for(int i=0; i<ilosc.size(); i++)
  436.     {
  437.         for(int j=0; j<ilosc.size(); j++)
  438.         {
  439.             //sasiedztwo[i][j] = 0-sasiedztwo[i][j];
  440.             setXY(sasiedztwo, i, j, 0-getXY(sasiedztwo, i, j));
  441.  
  442.             //sasiedztwo[i][j] += i==j;
  443.             setXY(sasiedztwo, i, j, getXY(sasiedztwo, i, j) + i==j);
  444.  
  445.         }
  446.     }
  447. }
  448.  
  449. int main()
  450. {
  451.  
  452.    
  453.     vector<double> ilosc2;
  454.     vector< vector<double> > sasiedztwo;
  455.    
  456.  
  457.     vector<double> ilosc;
  458.     map<int, map<int, double>> macierz_sasiedztwa;
  459.     list<int> cols;
  460.  
  461.     //wczytaj(ilosc2, sasiedztwo);
  462.    
  463.     wczytaj0(cols, ilosc, macierz_sasiedztwa);
  464.    
  465.  
  466.     //pomnoz_razy_macierz_diagonalna0(ilosc, macierz_sasiedztwa);
  467.  
  468.  
  469.     //pomnoz_razy_macierz_diagonalna(ilosc2, sasiedztwo);
  470.  
  471.  
  472.     //I_odj_macierz0(ilosc, macierz_sasiedztwa);
  473.  
  474.     //I_odj_macierz(sasiedztwo);
  475.  
  476.  
  477.     dodaj_kolumne0(ilosc, macierz_sasiedztwa);
  478.  
  479.     //dodaj_kolumne(sasiedztwo);
  480.  
  481.  
  482.     /*wypisz_macierz(sasiedztwo);
  483.     cout << endl;
  484.     wypisz_macierz1(ilosc, macierz_sasiedztwa);*/
  485.     //wypisz_macierz0(ilosc, macierz_sasiedztwa);
  486.  
  487.     //vector<vector<double>> AB= do_wektora(ilosc, macierz_sasiedztwa);
  488.     //wypisz_macierz(AB);
  489.  
  490.    
  491.     //vector<double> X;
  492.     //for(int i=0; i<macierz_sasiedztwa.size(); i++)
  493.     //  X.push_back( 0 );
  494.  
  495.     vector<double> Y;
  496.     for(int i=0; i<ilosc.size(); i++)
  497.         Y.push_back( 0 );
  498.  
  499.  
  500.     bool done;
  501.     done = gauss0(cols, ilosc, macierz_sasiedztwa, Y);
  502.  
  503.     //wypisz_macierz(sasiedztwo);
  504.  
  505.     //done = gauss( sasiedztwo, Y);
  506.  
  507.     int abc = 0;
  508.    
  509.  
  510.  
  511.  
  512.  
  513.  
  514.  
  515.     return 0;
  516. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement