Advertisement
migonne

heurystyka najnowsza

Feb 20th, 2018
75
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 15.06 KB | None | 0 0
  1. #include <iostream>
  2. #include <cstdlib>
  3. #include <stdio.h>
  4. #include <string>
  5. #include <fstream>
  6. #include <vector>
  7. #include <sstream>
  8. #include <algorithm>
  9. #include <iterator>
  10. #include <cstring>
  11.  
  12. using namespace std;
  13.  
  14. vector < string > sekwencje; // vektor zawierajacy sekwencje
  15. vector < string > jakosc; // vektor zawierajacy oceny jakosci sekwencjonowania
  16.  
  17. class wierzcholek // klasa wierzcholek
  18. {
  19. public:
  20. string sekwierzch; // nazwa wierzcholka
  21. int nrsek; // sekwencja zrodlowa od 0 do 7
  22. int pozycja; // pozycja w sekwencji
  23. vector < int > jakosc_w; // vektor jakosci sekwencjonowania
  24. };
  25.  
  26. vector < wierzcholek > wierzcholki; // vektor wszystkich wierzcholkow
  27. vector < int > stopnie; // vektor przechowujacy stopien kazdego wierzcholka
  28. vector < vector < int > > macierz; // macierz incydencji
  29.  
  30. vector < int > klika; // znaleziona klika
  31. vector < int > maxklika; // najwieksza znaleziona do tej pory klika
  32. vector <vector < int > > wektor_kliki; // lista w ktorej znajduje sie kazda znaleziona klika
  33.  
  34. int okno,wiarygodnosc; // wartosci pobierane od uzytkownika
  35.  
  36.  
  37.  
  38. void show()
  39. {
  40. /*
  41. for(int i=0; i<vertex_list.size(); i++)
  42. {
  43. cout<<vertex_list[i].vert<<" ";
  44. cout<<vertex_list[i].sequence_in<<endl;
  45. for(int j=0; j<window; j++)
  46. cout<<vertex_list[i].qual[j]<<" ";
  47. }
  48. cout<<endl<<endl;
  49. */
  50. }
  51.  
  52. vector < string > split( char * napis) // dzieli string na czesci
  53. {
  54. const char * ograniczniki = " ";
  55. vector < string > podzielony_napis;
  56.  
  57. for( char * pch = strtok( napis, ograniczniki ); pch != NULL; pch = strtok( NULL, ograniczniki ) )
  58. podzielony_napis.push_back( pch );
  59.  
  60. return podzielony_napis;
  61. }
  62.  
  63. void wczytaj_plik() // funkcja wczytuje dane z plikow do dwoch vektorow, sequence i quality
  64. {
  65. string line = "";
  66. string line2 = "";
  67. fstream plik;
  68. fstream plik2;
  69.  
  70. plik.open("sample1.fasta");
  71. plik2.open("sample1.qual");
  72.  
  73. while(getline(plik,line) && getline(plik2,line2))
  74. {
  75. if(line[0] != '>' && line2[0] != '>')
  76. {
  77. sekwencje.push_back(line);
  78. jakosc.push_back(line2);
  79. }
  80. }
  81. plik.close();
  82. plik2.close();
  83. }
  84.  
  85. void tworzenie_wierzcholkow()
  86. {
  87.  
  88. for(int i = 0; i < sekwencje.size(); i++)
  89. {
  90. string tmp = sekwencje[i];
  91. char str [1024];
  92. char *p = str;
  93. strcpy(str, jakosc[i].c_str());
  94. vector < string > tmp2 = split(p);
  95.  
  96. for(int j=0; j<(tmp.length() - okno + 1); j++)
  97. {
  98. wierzcholek *nowy = new wierzcholek();
  99. nowy->sekwierzch = tmp.substr(j,okno);
  100. nowy->nrsek = i;
  101. nowy->pozycja = j;
  102.  
  103. for(int y=j; y<(okno+j); y++)
  104. {
  105. int var = atoi( tmp2[y].c_str() );
  106. nowy->jakosc_w.push_back(var);
  107. }
  108. wierzcholki.push_back(*nowy);
  109. }
  110. }
  111.  
  112. macierz.resize(wierzcholki.size());
  113. for(int i=0; i<macierz.size(); i++) // wypelniamy macierz zerami
  114. for(int j=0; j<macierz.size(); j++)
  115. macierz[i].push_back(0);
  116. }
  117.  
  118. void polacz()
  119. {
  120. int delmax;
  121. if(okno == 4)
  122. delmax = 1;
  123. if(okno == 5)
  124. delmax = 1;
  125. if(okno == 6)
  126. delmax = 2;
  127. if(okno == 7)
  128. delmax = 2;
  129.  
  130. for(int i=0; i<wierzcholki.size(); i++)
  131. for(int j=i+1; j<wierzcholki.size(); j++)
  132. {
  133. if(wierzcholki[i].sekwierzch == wierzcholki[j].sekwierzch && wierzcholki[i].nrsek != wierzcholki[j].nrsek)
  134. {
  135. macierz[i][j] = 1;
  136. macierz[j][i] = 1;
  137. }
  138. else
  139. {
  140. if(wierzcholki[i].nrsek != wierzcholki[j].nrsek)
  141. {
  142. // zakladamy ze delecja
  143. macierz[i][j] = 1;
  144. macierz[j][i] = 1;
  145.  
  146. int tmp = 0;
  147. for(int y=0; y<okno; y++)
  148. {
  149. tmp++;
  150. if(wierzcholki[i].sekwierzch[y] != wierzcholki[j].sekwierzch[y]) // dla nukleotydu ktory sie nie zgadza
  151. {
  152. if(wierzcholki[i].jakosc_w[y] > wiarygodnosc || wierzcholki[j].jakosc_w[y] > wiarygodnosc )
  153. {
  154. macierz[i][j] = 0;
  155. macierz[j][i] = 0;
  156. }
  157. if(tmp > delmax)
  158. {
  159. macierz[i][j] = 0;
  160. macierz[j][i] = 0;
  161. }
  162. }
  163. }
  164. }
  165. }
  166. }
  167. }
  168.  
  169. void stopnie_w() // oblicza stopnie kazdego wierzcholka
  170. {
  171. for(int i=0; i<wierzcholki.size(); i++)
  172. stopnie.push_back(0);
  173.  
  174. for(int i=0; i<wierzcholki.size(); i++)
  175. for(int j=0; j<wierzcholki.size(); j++)
  176. if(macierz[i][j]==1)
  177. stopnie[i]++;
  178.  
  179. // for(int i=0; i<wierzcholki.size(); i++)
  180. // cout<<stopnie[i]<<" ";
  181. }
  182.  
  183. vector <int> znajdz_sasiadow(int wierzch_index) // znajduje sasiadow danego wierzcholka i zwraca ich vektor
  184. {
  185. vector <int> sasiedzi;
  186. for(int i = 0; i < wierzcholki.size(); i++)
  187. {
  188. if(macierz[wierzch_index][i] == 1)
  189. sasiedzi.push_back(i);
  190. }
  191. return sasiedzi;
  192. }
  193.  
  194.  
  195. int wierzcholek_o_naj_st(vector<int> sasiedzi) // znajduje wierzcholek o najwyzszym stopniu
  196. {
  197. int naj_st_w;
  198. int st = 0;
  199.  
  200. for (int i = 0; i <sasiedzi.size(); i++)
  201. {
  202. int tmp_index = sasiedzi[i];
  203. if(stopnie[tmp_index] > st)
  204. {
  205. st = stopnie[tmp_index];
  206. naj_st_w = tmp_index;
  207. }
  208. }
  209. return naj_st_w;
  210. }
  211.  
  212. vector <int> sasiedzi_wierzch_o_najst(int wierzch_index, int st)
  213. {
  214. vector <int> sasiedzi_wierzch_o_najst;
  215.  
  216. for(int i = 0; i < wierzcholki.size(); i++)
  217. {
  218. if(macierz[wierzch_index][i] == 1 && stopnie[i] >= st)
  219. {
  220. sasiedzi_wierzch_o_najst.push_back(i);
  221. }
  222. }
  223. return sasiedzi_wierzch_o_najst;
  224. }
  225.  
  226. vector <int> znajdz_wspolnych_sasiadow(vector <int> _wybrani_sasiedzi, vector <int> _sasiedzi_wierzch_o_najst) // zwraca czesc wspolna
  227. {
  228. vector <int> wspolni_sasiedzi;
  229. set_intersection(_wybrani_sasiedzi.begin(),_wybrani_sasiedzi.end(), _sasiedzi_wierzch_o_najst.begin(), _sasiedzi_wierzch_o_najst.end(), back_inserter(wspolni_sasiedzi));
  230.  
  231. return wspolni_sasiedzi;
  232. }
  233.  
  234. vector <int> &clique_heu(vector <int> &mozliwe_do_kliki, vector<int> &sasiedzi, int size, int &max)
  235. {
  236. if(sasiedzi.empty()) // warunek zakonczenia rekurencji
  237. {
  238. if(size > max)
  239. max = size;
  240.  
  241. return mozliwe_do_kliki;
  242. }
  243. int wierzcholek_o_najst = wierzcholek_o_naj_st(sasiedzi); // znajdujemy sasiada o najwiekszym stopniu
  244. mozliwe_do_kliki.push_back(wierzcholek_o_najst); // dodajemy go do kliki
  245.  
  246. for (int i = 0; i < sasiedzi.size(); i++) // znajdujemy i usuwamy go z vektora sąsiadow
  247. {
  248. if(sasiedzi[i] == wierzcholek_o_najst)
  249. sasiedzi.erase(sasiedzi.begin() + i);
  250. }
  251.  
  252. vector <int> wierzch_o_najst_sasiedzi = sasiedzi_wierzch_o_najst(wierzcholek_o_najst, max);
  253. vector <int> wspolni_sasiedzi = znajdz_wspolnych_sasiadow(sasiedzi, wierzch_o_najst_sasiedzi);
  254.  
  255. clique_heu(mozliwe_do_kliki, wspolni_sasiedzi, size + 1, max);
  256.  
  257. return mozliwe_do_kliki;
  258. }
  259.  
  260. void max_clique(int max)
  261. {
  262. vector <int> mozliwe_do_kliki; // wektor wierzcholkow bedacych kandydatami do wyszukania kliki
  263.  
  264. for (int i = 0; i < wierzcholki.size(); i++) // dla kazdego wierzcholka w grafie
  265. {
  266. mozliwe_do_kliki.push_back(i);//dodajemy wierzcholek
  267. if(stopnie[i] >= max) // jesli stopien wiekszy lub rowny od najwiekszej znalezionej do tej pory kliki
  268. {
  269. vector<int> sasiedzi = znajdz_sasiadow(i); // szuka sasiadow badanego wierzcholka i dodaje ich do vektora
  270. vector<int> wybrani_sasiedzi;
  271.  
  272. for (int j = 0; j < sasiedzi.size(); j++) // dla kazdego sasiada wierzcholka i
  273. {
  274. int tmp_index = sasiedzi[j];
  275.  
  276. if(stopnie[tmp_index] >= max) // jesli stopien sasiada wiekszy lub rowny od najwiekszej znalezionej kliki
  277. {
  278. wybrani_sasiedzi.push_back(tmp_index);
  279. }
  280. }
  281. if(!wybrani_sasiedzi.empty()) //jesli wektor nie jest pusty
  282. klika = clique_heu(mozliwe_do_kliki, wybrani_sasiedzi, 1, max);
  283.  
  284. if(klika.size() >= maxklika.size())
  285. {
  286. //wektor_kliki.push_back(klika);
  287. maxklika = klika;
  288. }
  289. }
  290. mozliwe_do_kliki.clear();
  291. }
  292. }
  293.  
  294. void lewo(vector<int> &lewa)
  295. {
  296.  
  297. for(int i = 0; i < lewa.size(); i++)
  298. {
  299. if(lewa[i] <= 0) // nie moze, bo jesli wierzcholek zerowy to nie mozna przejscdalej w lewo
  300. {
  301. return;
  302. }
  303. }
  304.  
  305. for (int i = 0; i < lewa.size(); i++)
  306. {
  307. for (int j = i + 1; j < lewa.size(); j++)
  308. {
  309. if(macierz[lewa[i] - 1][lewa[j] - 1] != 1)
  310. {
  311. return;
  312. }
  313. }
  314. }
  315.  
  316. for(int i = 0; i < lewa.size(); i++){
  317. lewa[i]--;
  318. }
  319.  
  320. lewo(lewa);
  321.  
  322. return;
  323.  
  324. }
  325.  
  326.  
  327.  
  328.  
  329.  
  330.  
  331. void prawo(vector<int> &prawa)
  332. {
  333.  
  334. for(int i = 0; i < prawa.size(); i++)
  335. {
  336. if(prawa[i] >= macierz.size() - 2) //nie mozna poszerzyc, bo ktorys z wierzcholkow jest tym ostatnim
  337. {
  338. return;
  339. }
  340. }
  341.  
  342.  
  343. for(int i = 0; i < prawa.size(); i++)
  344. {
  345. for(int j = i + 1; j < prawa.size(); j++)
  346. {
  347. if(macierz[prawa[i] + 1][prawa[j] + 1] != 1)
  348. {
  349. return;
  350. }
  351. }
  352. }
  353.  
  354. for(int i = 0; i < prawa.size(); i++)
  355. {
  356. prawa[i]++;
  357. }
  358.  
  359. prawo(prawa);
  360.  
  361. return;
  362.  
  363. }
  364.  
  365.  
  366.  
  367.  
  368.  
  369.  
  370. void rozszerz()
  371. {
  372.  
  373. vector<int> lewa = maxklika;
  374. vector<int> prawa = maxklika;
  375.  
  376. lewo(lewa);
  377. prawo(prawa);
  378.  
  379. /* show_c(left_clique);
  380. show_c(right_clique);*/
  381.  
  382. cout<<endl;
  383. cout<<"Motyw: "<<endl;
  384. for(int i=0; i< maxklika.size(); i++){
  385. int start = wierzcholki[lewa[i]].pozycja+1;
  386. int length = (wierzcholki[prawa[i]].pozycja+okno)-wierzcholki[lewa[i]].pozycja;
  387. int seq_number = wierzcholki[maxklika[i]].nrsek;
  388.  
  389. for(int j=0; j<sekwencje.size(); j++)
  390. {
  391. if(j == seq_number)
  392. {
  393. //cout << "nr sekwencji: " << j << " na pozycji " << start << "-" << start+length << " znaleziono motyw po rozszerzeniu: " << endl;
  394. for(int g=0; g<length; g++){
  395. cout << sekwencje[j][start+g];
  396. }
  397. //cout << "nr sekwencji: " << j << "pozycja " << start << "-" << start+length << " znaleziono motyw po rozszerzeniu: " << endl;
  398. cout <<" nr sekwencji: "<< j<<" pozycja: "<< start<< endl;
  399.  
  400. // cout << endl;
  401. }
  402. }
  403. }
  404.  
  405. }
  406.  
  407.  
  408.  
  409. //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  410. //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  411. //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  412. //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  413. //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  414. //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  415. //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  416. //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  417. //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  418. //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  419. //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  420.  
  421.  
  422.  
  423.  
  424. int main()
  425. {
  426.  
  427.  
  428. cout << "Okno (4-7): ";
  429. cin >> okno;
  430. while(1){
  431. if(okno < 4 || okno > 7){
  432. cout << "Wartosc nie nalezy do zakresu. Prosze podac prawidlowa wartosc: ";
  433. cin >> okno;
  434. }else{
  435. break;
  436. }
  437. }
  438.  
  439. cout << "Wiarygodnosc (0-40): ";
  440. cin >> wiarygodnosc;
  441.  
  442. while(1){
  443. if(wiarygodnosc > 40 || wiarygodnosc<0){
  444. cout << "Wartosc nie nalezy do zakresu. Prosze podac prawidlowa wartosc: ";
  445. cin >> wiarygodnosc;
  446. }else{
  447. break;
  448. }
  449. }
  450.  
  451. cout<<endl;
  452.  
  453.  
  454.  
  455. wczytaj_plik();
  456. tworzenie_wierzcholkow();
  457. polacz();
  458. stopnie_w();
  459. // show();
  460. max_clique(3); // zmiana parametu na wiekszy, zmniejszy liczbe operacji!
  461.  
  462. if(maxklika.size() == 0)
  463. cout<<"Nie znaleziono zadnej kliki"<<endl;
  464.  
  465. // wyswietlanie
  466. else
  467. {
  468. //cout<<endl<<endl;
  469. //cout<<"Seria klik:"<<endl<<endl;
  470. cout<<"Maxklika: "<<endl;
  471.  
  472. sort(wektor_kliki.begin(), wektor_kliki.end());
  473. for(int i=0; i<wektor_kliki.size(); i++) //clique_list.size()
  474. {
  475. if(wektor_kliki[i].size()>= 4) // wyswietlamy kliki rozpiete conajmniej na czterech sekwencjach
  476. {
  477. cout<<wektor_kliki[i].size()<<":"<<endl;
  478. for(int j=0; j<wektor_kliki[i].size(); j++)
  479. {
  480. int tmp = wektor_kliki[i][j];
  481. cout<<wierzcholki[tmp].sekwierzch<<" ";
  482. cout<<"nr sekwencji: "<<wierzcholki[tmp].nrsek<<" ";
  483. cout<<"pozycja: "<<wierzcholki[tmp].pozycja<<endl;
  484. }
  485. // cout<<endl;
  486. }
  487. }
  488.  
  489. cout<<"Rozmiar: "<<maxklika.size()<<endl<<endl;
  490. cout<<"Motyw: "<<endl;
  491. for(int i=0; i<maxklika.size(); i++)
  492. {
  493. int tmp = maxklika[i];
  494. cout<<wierzcholki[tmp].sekwierzch<<" ";
  495. cout<<"nr sekwencji: "<<wierzcholki[tmp].nrsek<<" ";
  496. cout<<"pozycja: "<<wierzcholki[tmp].pozycja<<endl;
  497. }
  498.  
  499.  
  500.  
  501. sort(maxklika.begin(), maxklika.end());
  502.  
  503. // vector<int> lewa = maxklika;
  504. // vector<int> prawa = maxklika;
  505.  
  506. rozszerz();
  507.  
  508.  
  509. }
  510.  
  511. return 0;
  512. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement