Advertisement
migonne

heurystyka (bez poszerzania)

Feb 20th, 2018
90
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 13.38 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 > sekwencja; // 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. sekwencja.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 < sekwencja.size(); i++)
  89. {
  90. string tmp = sekwencja[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);
  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())
  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. /*
  295.  
  296. int expand_to_left()
  297. {
  298. int to_left = 0;
  299. int tmp_poz = 1;
  300. vector < char > nucleotides;
  301.  
  302. while(true)
  303. {
  304. for(int i=0; i<max_found_clique.size(); i++)
  305. {
  306. int tmp = max_found_clique[i];
  307. int id_seq = vertex_list[tmp].sequence_in;
  308. int position = vertex_list[tmp].poz;
  309. char nucleotide = sequence[id_seq][position-tmp_poz];
  310. nucleotides.push_back(nucleotide);
  311. }
  312.  
  313. char tmp = nucleotides[0];
  314. for(int i=0 ; i<nucleotides.size(); i++)
  315. {
  316. if(tmp != nucleotides[i])
  317. return to_left;
  318. }
  319.  
  320. to_left = tmp_poz;
  321. tmp_poz++;
  322. nucleotides.clear();
  323. }
  324. }
  325.  
  326. int expand_to_right()
  327. {
  328. int to_right = 0;
  329. int tmp_poz = 1;
  330. vector < char > nucleotides;
  331.  
  332. while(true)
  333. {
  334. for(int i=0; i<max_found_clique.size(); i++)
  335. {
  336. int tmp = max_found_clique[i];
  337. int id_seq = vertex_list[tmp].sequence_in;
  338. int position = vertex_list[tmp].poz;
  339. position = position+vertex_list[tmp].vert.size();
  340. char nucleotide = sequence[id_seq][position+tmp_poz-1];
  341. nucleotides.push_back(nucleotide);
  342. }
  343.  
  344. char tmp = nucleotides[0];
  345. for(int i=0 ; i<nucleotides.size(); i++)
  346. {
  347. if(tmp != nucleotides[i])
  348. return to_right;
  349. }
  350.  
  351. to_right = tmp_poz;
  352. tmp_poz++;
  353. nucleotides.clear();
  354. }
  355. }
  356.  
  357. */
  358.  
  359.  
  360. int main()
  361. {
  362.  
  363.  
  364. cout << "Dlugosc okna (4-7): ";
  365. cin >> okno;
  366. while(1){
  367. if(okno < 4 || okno > 7){
  368. cout << "Wartosc nie nalezy do zakresu. Prosze podac prawidlowa wartosc: ";
  369. cin >> okno;
  370. }else{
  371. break;
  372. }
  373. }
  374.  
  375. cout << "Wiarygodnosc (wartosc ponizej ktorej nukleotyd moze ulegac delecji (0-40): ";
  376. cin >> wiarygodnosc;
  377.  
  378. while(1){
  379. if(wiarygodnosc > 40 || wiarygodnosc<0){
  380. cout << "Wartosc nie nalezy do zakresu. Prosze podac prawidlowa wartosc: ";
  381. cin >> wiarygodnosc;
  382. }else{
  383. break;
  384. }
  385. }
  386.  
  387. cout<<endl;
  388.  
  389.  
  390.  
  391. wczytaj_plik();
  392. tworzenie_wierzcholkow();
  393. polacz();
  394. stopnie_w();
  395. // show();
  396. max_clique(3); // zmiana parametu na wiekszy, zmniejszy liczbe operacji!
  397.  
  398. if(maxklika.size() == 0)
  399. cout<<"Nie znaleziono zadnej kliki"<<endl;
  400.  
  401. // wyswietlanie
  402. else
  403. {
  404. cout<<endl<<endl;
  405. cout<<"Seria klik:"<<endl<<endl;
  406.  
  407. sort(wektor_kliki.begin(), wektor_kliki.end());
  408. for(int i=0; i<wektor_kliki.size(); i++) //clique_list.size()
  409. {
  410. if(wektor_kliki[i].size()>= 4) // wyswietlamy kliki rozpiete conajmniej na czterech sekwencjach
  411. {
  412. cout<<wektor_kliki[i].size()<<":"<<endl;
  413. for(int j=0; j<wektor_kliki[i].size(); j++)
  414. {
  415. int tmp = wektor_kliki[i][j];
  416. cout<<wierzcholki[tmp].sekwierzch<<" ";
  417. cout<<"sekwencja: "<<wierzcholki[tmp].nrsek<<" ";
  418. cout<<"pozycja: "<<wierzcholki[tmp].pozycja<<endl;
  419. }
  420. cout<<endl;
  421. }
  422. }
  423.  
  424. cout<<"\n\nNajwieksza znaleziona klika ma rozmiar: "<<maxklika.size()<<endl<<endl;
  425. cout<<"Motyw: "<<endl;
  426. for(int i=0; i<maxklika.size(); i++)
  427. {
  428. int tmp = maxklika[i];
  429. cout<<wierzcholki[tmp].sekwierzch<<" ";
  430. cout<<"numer sekwencji: "<<wierzcholki[tmp].nrsek<<" ";
  431. cout<<"na pozycji od: "<<wierzcholki[tmp].pozycja<<endl;
  432. }
  433.  
  434. // poszerzamy w lewo i w prawo
  435. // int pos_to_left = expand_to_left();
  436. // int pos_to_right = expand_to_right();
  437.  
  438. // cout<<"\n\nMaksymalna klika po poszerzeniu: "<<endl<<endl;
  439. // cout<<"Motyw: "<<endl;
  440. // for(int i=0; i<max_found_clique.size(); i++)
  441. // {
  442. // int tmp = max_found_clique[i];
  443. // string new_vert = sequence[vertex_list[tmp].sequence_in].substr((vertex_list[tmp].poz - pos_to_left),(pos_to_left + vertex_list[tmp].vert.size() + pos_to_right));
  444. // cout<<new_vert<<" ";
  445. // cout<<"numer sekwencji: "<<vertex_list[tmp].sequence_in<<" ";
  446. // cout<<"na pozycji od: "<<vertex_list[tmp].poz - pos_to_left<<endl;
  447. // }
  448.  
  449. //for(int i=0; i<vertex_degrees.size(); i++)
  450. //cout<<vertex_degrees[i];
  451. }
  452.  
  453. return 0;
  454. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement