gggp.cpp 42 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188118911901191119211931194119511961197119811991200120112021203120412051206120712081209121012111212121312141215121612171218121912201221122212231224122512261227122812291230123112321233123412351236123712381239124012411242124312441245124612471248
  1. /**
  2. * @file tests/boost_graph/partitioning/gggp.cpp
  3. * @author The PARADEVS Development Team
  4. * See the AUTHORS or Authors.txt file
  5. */
  6. /*
  7. * PARADEVS - the multimodeling and simulation environment
  8. * This file is a part of the PARADEVS environment
  9. *
  10. * Copyright (C) 2013-2015 ULCO http://www.univ-litoral.fr
  11. *
  12. * This program is free software: you can redistribute it and/or modify
  13. * it under the terms of the GNU General Public License as published by
  14. * the Free Software Foundation, either version 3 of the License, or
  15. * (at your option) any later version.
  16. *
  17. * This program is distributed in the hope that it will be useful,
  18. * but WITHOUT ANY WARRANTY; without even the implied warranty of
  19. * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
  20. * GNU General Public License for more details.
  21. *
  22. * You should have received a copy of the GNU General Public License
  23. * along with this program. If not, see <http://www.gnu.org/licenses/>.
  24. */
  25. #include <tests/boost_graph/partitioning/gggp.hpp>
  26. #include <boost/timer.hpp>
  27. #include <algorithm>
  28. #include <iostream>
  29. #include <fstream>
  30. namespace paradevs { namespace tests { namespace boost_graph {
  31. extern UnorientedGraph::vertex_iterator vertexIt, vertexEnd;
  32. extern UnorientedGraph::adjacency_iterator neighbourIt, neighbourEnd;
  33. extern OrientedGraph::vertex_iterator vertexIto, vertexEndo;
  34. extern OrientedGraph::adjacency_iterator neighbourIto, neighbourEndo;
  35. void ggp(UnorientedGraph *g, Entiers *sommetsSource,
  36. Entiers *sommetsDestination, EntiersEntiers &Partition, int rand, int &index_partition, int distance)
  37. {
  38. Entiers sommets_adj;
  39. if(sommetsSource->size()==1){
  40. Entiers tailles;
  41. for(uint i=0;i<Partition.size();i++){
  42. tailles.push_back(Partition.at(i)->size());
  43. }
  44. uint tmp=*max_element(tailles.begin(),tailles.end());
  45. for(uint i=0; i<Partition.size();i++){
  46. if(Partition.at(i)->size() == tmp)
  47. {
  48. sommetsSource->clear();
  49. for(uint id = 0; id < Partition.at(i)->size();id++){
  50. sommetsSource->push_back(Partition.at(i)->at(id));
  51. }
  52. index_partition = i;
  53. if(distance != -1){
  54. ggp(g, sommetsSource, sommetsDestination, Partition,
  55. Partition.at(i)->at(rand_fini(0,Partition.at(i)->size())),
  56. index_partition, distance);
  57. }else{
  58. ggp(g, sommetsSource, sommetsDestination, Partition,
  59. rand_fini(0,Partition.at(i)->size()),
  60. index_partition, distance);
  61. }
  62. return;
  63. }
  64. }
  65. }
  66. double poids_max=0;
  67. for(uint i=0;i<sommetsSource->size();i++){
  68. poids_max+=(*g)[sommetsSource->at(i)]._weight;
  69. }
  70. poids_max/=2.;
  71. double poids;
  72. if(distance == -1){
  73. poids=(*g)[sommetsSource->at(rand)]._weight;
  74. sommetsDestination->push_back(sommetsSource->at(rand));
  75. sommetsSource->erase(sommetsSource->begin() + rand);
  76. }else{
  77. poids=(*g)[rand]._weight;
  78. sommetsDestination->push_back(rand);
  79. suprim_val(*sommetsSource,rand);
  80. }
  81. uint cpt = 0;
  82. while(poids<poids_max && sommetsSource->size()>1)
  83. {
  84. if(cpt<sommetsDestination->size()){
  85. adjacence_ggp(sommetsDestination->at(cpt),sommets_adj,g);
  86. } else{
  87. int val=rand_fini(0,sommetsSource->size()-1);
  88. sommetsDestination->push_back(sommetsSource->at(val));
  89. sommetsSource->erase(sommetsSource->begin() + val);
  90. adjacence_ggp(sommetsDestination->at(cpt),sommets_adj,g);
  91. }
  92. if(sommets_adj.size() == 0)
  93. {
  94. sort(sommetsDestination->begin(), sommetsDestination->end());
  95. return;
  96. }
  97. else{
  98. for(uint i =0; i<sommets_adj.size(); i++){
  99. if(In_tab(*sommetsDestination,sommets_adj.at(i)) != 1 && sommetsSource->size()!=1){
  100. sommetsDestination->push_back(sommets_adj.at(i));
  101. poids+=(*g)[sommets_adj.at(i)]._weight;
  102. suprim_val(*sommetsSource, sommets_adj[i]);
  103. }
  104. else if(poids>=poids_max || sommetsSource->size() == 1){
  105. sort(sommetsDestination->begin(), sommetsDestination->end());
  106. return;
  107. }
  108. }
  109. /*std::cout<<"Sommets_source :"<<std::endl;
  110. for(uint i =0; i<sommetsSource->size();i++){
  111. std::cout<<sommetsSource->at(i)<<",";
  112. }
  113. std::cout<<std::endl;
  114. std::cout<<"Sommets_destination :"<<std::endl;
  115. for(uint i =0; i<sommetsDestination->size();i++){
  116. std::cout<<sommetsDestination->at(i)<<",";
  117. }
  118. std::cout<<std::endl;*/
  119. }
  120. sommets_adj.clear();
  121. cpt++;
  122. }
  123. sort(sommetsDestination->begin(), sommetsDestination->end());
  124. }
  125. void Transfert_vertex_bissection(UnorientedGraph *g, Entiers *sommetsSource, Entiers *sommetsDestination, Entiers &sommets_adj, const std::string &name, double &poids, double &cut){
  126. std::vector<double> sommets_cut;
  127. sort(sommets_adj.begin(), sommets_adj.end());
  128. for(uint i=0;i<sommets_adj.size();i++)
  129. {
  130. double tmp_cut = cut;
  131. if(name == "cut"){
  132. sommets_cut.push_back(modif_Cout_coupe(*sommetsDestination,sommets_adj.at(i),tmp_cut,g));
  133. }else if(name == "ratio"){
  134. //std::cout<<"adj : "<<(*g)[sommets_adj.at(i)]._index<<" cut = "<<Modif_ratio_cut(g, sommetsSource, sommetsDestination, sommets_adj.at(i), tmp_cut)<<std::endl;
  135. sommets_cut.push_back(Modif_ratio_cut(g, sommetsSource, sommetsDestination, sommets_adj.at(i), tmp_cut));
  136. }
  137. }
  138. cut = *min_element(sommets_cut.begin(),sommets_cut.end());
  139. //std::cout<<"*** Passage 3 cut ***** : "<<cut<<std::endl;
  140. //std::cout<<"Meilleur voisin : "<<(*g)[sommets_adj.at(recherche_val_double(sommets_cut,*min_element(sommets_cut.begin(),sommets_cut.end())))]._index<<std::endl;
  141. sommetsDestination->push_back(sommets_adj[recherche_val_double(sommets_cut,*min_element(sommets_cut.begin(),sommets_cut.end()))]);
  142. //std::cout<<"*** Passage 3 cuta ***"<<std::endl;
  143. poids+=(*g)[sommets_adj[recherche_val_double(sommets_cut,*min_element(sommets_cut.begin(),sommets_cut.end()))]]._weight;
  144. //std::cout<<"*** Passage 3 cutb ***"<<std::endl;
  145. suprim_val(*sommetsSource, sommets_adj[recherche_val_double(sommets_cut,*min_element(sommets_cut.begin(),sommets_cut.end()))]);
  146. suprim_val(sommets_adj, sommets_adj[recherche_val_double(sommets_cut,*min_element(sommets_cut.begin(),sommets_cut.end()))]);
  147. //std::cout<<"*** Passage 3 fin ***"<<std::endl;
  148. }
  149. void Tirage_transfert_vertex_bissection(UnorientedGraph *g, Entiers *sommetsSource, Entiers *sommetsDestination, const std::string &name, double &poids, double &cut){
  150. double diff = -100.;
  151. uint tmp_tir;
  152. while(diff != 0){
  153. tmp_tir = sommetsSource->at(rand_fini(0,sommetsSource->size()));
  154. diff = Diff_cut_ratio_bissection(g, sommetsSource, tmp_tir, name);
  155. }
  156. poids += (*g)[tmp_tir]._weight;
  157. if(name == "cut"){
  158. cut = modif_Cout_coupe(*sommetsDestination,tmp_tir,cut,g);
  159. }else{
  160. cut = Modif_ratio_cut(g, sommetsSource, sommetsDestination, tmp_tir, cut);
  161. }
  162. sommetsDestination->push_back(tmp_tir);
  163. suprim_val(*sommetsSource,tmp_tir);
  164. }
  165. bool Best_transfert_vertex_bissection(UnorientedGraph *g, Entiers *sommetsSource, Entiers *sommetsDestination, Entiers &sommets_adj,
  166. const std::string &name, double &poids, double poids_max, double PC, int stop, int &cpt, double &cut){
  167. Liste_Voisin(*sommetsDestination,sommets_adj,*g);
  168. //sort(sommets_adj.begin(), sommets_adj.end());
  169. if((sommets_adj.size() == 0) & (cpt<stop) & (sommetsSource->size()>1))
  170. {
  171. cpt++;
  172. //std::cout<<"*** Passage 1 ***"<<std::endl;
  173. if(poids < (poids_max - poids_max*PC/100)){
  174. //std::cout<<"*** Passage 1a ***"<<std::endl;
  175. Tirage_transfert_vertex_bissection(g, sommetsSource, sommetsDestination, name, poids, cut);
  176. if((poids < (poids_max - poids_max*PC/100)) & (sommetsSource->size()>1)){
  177. Best_transfert_vertex_bissection(g, sommetsSource, sommetsDestination, sommets_adj,
  178. name, poids, poids_max, PC, stop, cpt, cut);
  179. }else{
  180. //std::cout<<"*** Passage 1ac ***"<<std::endl;
  181. return true;
  182. }
  183. }else{
  184. //std::cout<<"*** Passage 1b ***"<<std::endl;
  185. return true;
  186. }
  187. }
  188. else if ((sommets_adj.size() == 0) & (cpt>=stop)){
  189. //std::cout<<"*** Passage 2 ***"<<std::endl;
  190. return true;
  191. }else if (sommetsSource->size()==1){
  192. //std::cout<<"*** Passage 4 ***"<<std::endl;
  193. return true;
  194. }else{
  195. //std::cout<<"*** Passage 3 *** : "<<cut<<std::endl;
  196. Transfert_vertex_bissection(g, sommetsSource, sommetsDestination, sommets_adj, name, poids, cut);
  197. return false;
  198. }
  199. }
  200. void gggp_pond(UnorientedGraph *g, Entiers *sommetsSource, Entiers *sommetsDestination,
  201. EntiersEntiers &Partition, int rand, int &index_partition, const std::string &name, int distance)
  202. {
  203. Entiers sommets_adj;
  204. double poids_max = 0;
  205. double poids, cut;
  206. if(sommetsSource->size()==1){
  207. Entiers tailles;
  208. for(uint i=0;i<Partition.size();i++){
  209. tailles.push_back(Partition.at(i)->size());
  210. }
  211. uint tmp=*max_element(tailles.begin(),tailles.end());
  212. for(uint i=0; i<Partition.size();i++){
  213. if(Partition.at(i)->size()==tmp)
  214. {
  215. sommetsSource->clear();
  216. for(uint id = 0; id < Partition.at(i)->size();id++){
  217. sommetsSource->push_back(Partition.at(i)->at(id));
  218. }
  219. index_partition = i;
  220. if(distance != -1)
  221. gggp_pond(g,sommetsSource,sommetsDestination,Partition,
  222. Partition.at(i)->at(rand_fini(0,Partition.at(i)->size())),
  223. index_partition, name, distance);
  224. else
  225. gggp_pond(g, sommetsSource, sommetsDestination,
  226. Partition, rand_fini(0,Partition.at(i)->size()),
  227. index_partition, name ,distance);
  228. return;
  229. }
  230. }
  231. }
  232. for(uint i=0;i<sommetsSource->size();i++){
  233. poids_max+=(*g)[sommetsSource->at(i)]._weight;
  234. }
  235. poids_max/=2.;
  236. if(distance == -1){
  237. poids=(*g)[sommetsSource->at(rand)]._weight;
  238. if(name == "cut"){
  239. cut = Degree(*g,sommetsSource->at(rand));
  240. }else if(name == "ratio"){
  241. cut = Degree(*g,sommetsSource->at(rand));
  242. double tmp_cut = cut/2./(*g)[sommetsSource->at(rand)]._weight
  243. + cut/2./(Cluster_Weight(*g,*sommetsSource)-(*g)[sommetsSource->at(rand)]._weight);
  244. cut = tmp_cut;
  245. }
  246. sommetsDestination->push_back(sommetsSource->at(rand));
  247. sommetsSource->erase(sommetsSource->begin() + rand);
  248. }else{
  249. poids=(*g)[rand]._weight;
  250. cut = Degree(*g,rand);
  251. if(name == "ratio"){
  252. double tmp_cut = cut/2./(*g)[rand]._weight + cut/2./(Cluster_Weight(*g,*sommetsSource)-(*g)[rand]._weight);
  253. cut = tmp_cut;
  254. }
  255. sommetsDestination->push_back(rand);
  256. suprim_val(*sommetsSource,rand);
  257. }
  258. while(poids<poids_max && sommetsSource->size()>1)
  259. {
  260. int cpt = 0;
  261. bool next = Best_transfert_vertex_bissection(g, sommetsSource, sommetsDestination, sommets_adj,
  262. name, poids, poids_max, 20, 2, cpt, cut);
  263. if(next == true){
  264. sort(sommetsDestination->begin(), sommetsDestination->end());
  265. return;
  266. }
  267. }
  268. sort(sommetsDestination->begin(), sommetsDestination->end());
  269. }
  270. /*Liste_Voisin(*sommetsDestination,sommets_adj,*g);
  271. if(sommets_adj.size()==0)
  272. {
  273. std::cout<<"*** Passage ***"<<std::endl;
  274. if(poids < (poids_max - poids_max*40/100)){
  275. Tirage_transfert_vertex_bissection(g, sommetsSource, sommetsDestination, name, poids);
  276. Liste_Voisin(*sommetsDestination,sommets_adj,*g);
  277. if(sommets_adj.size() != 0){
  278. Transfert_vertex_bissection(g, sommetsSource, sommetsDestination, sommets_adj, name, poids);
  279. }else{
  280. sort(sommetsDestination->begin(), sommetsDestination->end());
  281. return;
  282. }
  283. }else{
  284. sort(sommetsDestination->begin(), sommetsDestination->end());
  285. return;
  286. }
  287. }
  288. else{
  289. Transfert_vertex_bissection(g, sommetsSource, sommetsDestination, sommets_adj, name, poids);
  290. }*/
  291. void Iter_2l(EntiersEntiers &part, int nbr_parties, UnorientedGraph *g,
  292. const std::string &nom_cut, int nbr_tirage,
  293. const std::string &nom_strat, bool rec, int distance)
  294. {
  295. UnorientedGraph copy_graph;
  296. boost::copy_graph(*g,copy_graph);
  297. int cpt = 0;
  298. for(int i = 0; i<floor(log(nbr_parties)/log(2)); i++){
  299. for(int j = 0; j< pow(2,i);j++) {
  300. if(distance == -1){
  301. if(nbr_tirage != 0)
  302. Optimisation_method_neighbour(g,part,j,nbr_tirage, nom_cut, nom_strat);
  303. else
  304. Optimisation_method_neighbour_minweight(g,part,j, nom_cut, nom_strat);
  305. }else
  306. Optimisation_method_neighbour_distance(g,part,j,nbr_tirage, distance, nom_cut, nom_strat);
  307. if(rec){
  308. std::vector<std::string> color;
  309. color.push_back("[color=blue2, fontcolor=blue2];");
  310. color.push_back("[color=red, fontcolor=red];");
  311. color.push_back("[color=green, fontcolor=green];");
  312. color.push_back("[color=turquoise, fontcolor=turquoise];");
  313. color.push_back("[color=saddlebrown, fontcolor=saddlebrown];");
  314. color.push_back("[color=indigo, fontcolor=indigo];");
  315. color.push_back("[color=yellow, fontcolor=yellow2];");
  316. color.push_back("[color=orange, fontcolor=orange];");
  317. color.push_back("[color=olivedrab, fontcolor=olivedrab];");
  318. color.push_back("[color=gold, fontcolor=gold];");
  319. color.push_back("[color=slateblue2, fontcolor=slateblue2];");
  320. color.push_back("[color=dimgrey, fontcolor=dimgrey];");
  321. color.push_back("[color=cyan, fontcolor=cyan];");
  322. color.push_back("[color=purple1, fontcolor=purpule1];");
  323. color.push_back("[color=crimson, fontcolor=crimson];");
  324. color.push_back("[color=black, fontcolor=black];");
  325. std::vector<char* > nom;
  326. char * tmp_nom1 = "../../sortie_graphe/Tests/Graphes/Bissection/txt/bissection_1.txt";
  327. nom.push_back(tmp_nom1);
  328. char * tmp_nom2 = "../../sortie_graphe/Tests/Graphes/Bissection/txt/bissection_2.txt";
  329. nom.push_back(tmp_nom2);
  330. char * tmp_nom3 = "../../sortie_graphe/Tests/Graphes/Bissection/txt/bissection_3.txt";
  331. nom.push_back(tmp_nom3);
  332. char * tmp_nom4 = "../../sortie_graphe/Tests/Graphes/Bissection/txt/bissection_4.txt";
  333. nom.push_back(tmp_nom4);
  334. char * tmp_nom5 = "../../sortie_graphe/Tests/Graphes/Bissection/txt/bissection_5.txt";
  335. nom.push_back(tmp_nom5);
  336. char * tmp_nom6 = "../../sortie_graphe/Tests/Graphes/Bissection/txt/bissection_6.txt";
  337. nom.push_back(tmp_nom6);
  338. char * tmp_nom7 = "../../sortie_graphe/Tests/Graphes/Bissection/txt/bissection_7.txt";
  339. nom.push_back(tmp_nom7);
  340. char * tmp_nom8 = "../../sortie_graphe/Tests/Graphes/Bissection/txt/bissection_8.txt";
  341. nom.push_back(tmp_nom8);
  342. char * tmp_nom9 = "../../sortie_graphe/Tests/Graphes/Bissection/txt/bissection_9.txt";
  343. nom.push_back(tmp_nom9);
  344. char * tmp_nom10 = "../../sortie_graphe/Tests/Graphes/Bissection/txt/bissection_10.txt";
  345. nom.push_back(tmp_nom10);
  346. std::ofstream GRAPH2 (nom.at(cpt), std::ios::out);
  347. GRAPH2<<"graph G {"<<std::endl;
  348. tie(vertexIt, vertexEnd) = vertices(copy_graph);
  349. for (; vertexIt != vertexEnd; ++vertexIt) {
  350. GRAPH2<<(copy_graph)[*vertexIt]._index<<" -- {";
  351. tie(neighbourIt, neighbourEnd) = adjacent_vertices(*vertexIt,
  352. copy_graph);
  353. for (; neighbourIt != neighbourEnd; ++neighbourIt){
  354. if((copy_graph)[*neighbourIt]._index>(copy_graph)[*vertexIt]._index)
  355. GRAPH2<<(copy_graph)[*neighbourIt]._index<<";";
  356. }
  357. GRAPH2<<"}"<<std::endl;
  358. }
  359. for(uint k=0; k<part.size(); k++){
  360. for(uint t=0; t<part.at(k)->size(); t++)
  361. {
  362. GRAPH2<<(copy_graph)[part.at(k)->at(t)]._index<<color.at(k)<<std::endl;
  363. }
  364. }
  365. GRAPH2<<"}";
  366. GRAPH2.close();
  367. }
  368. cpt ++;
  369. }
  370. }
  371. }
  372. void bissectionRec(UnorientedGraph *g, EntiersEntiers &Partition,
  373. int nbr_parties, const std::string &nom_cut,
  374. int nbr_tirage, const std::string &nom_strat,
  375. int distance)
  376. {
  377. if((nbr_parties&(nbr_parties-1)) == 0)
  378. Iter_2l(Partition, nbr_parties, g, nom_cut, nbr_tirage,
  379. nom_strat, false, distance);
  380. else{
  381. int puissance_2=0;
  382. Entiers tailles;
  383. while(pow(2,puissance_2)<nbr_parties)
  384. puissance_2++;
  385. Iter_2l(Partition, pow(2,puissance_2-1), g,
  386. nom_cut, nbr_tirage, nom_strat, false, distance);
  387. for(unsigned int i = 0; i< Partition.size() -1 ; i++)
  388. {
  389. for(EntiersEntiers::iterator it1 = Partition.begin() + i ;
  390. it1!=Partition.end(); it1++)
  391. {
  392. if((*it1)->size() > Partition.at(i)->size())
  393. Partition.at(i)->swap(**it1);
  394. }
  395. }
  396. for(int j = 0; j<nbr_parties-pow(2,puissance_2-1);j++)
  397. {
  398. if(distance == -1){
  399. if(nbr_tirage != 0){
  400. Optimisation_method_neighbour(g, Partition, j,
  401. nbr_tirage, nom_cut,
  402. nom_strat);
  403. }else{
  404. Optimisation_method_neighbour_degree(g, Partition, j,
  405. nom_cut, nom_strat);
  406. }
  407. }else{
  408. Optimisation_method_neighbour_distance(g, Partition, j,
  409. nbr_tirage, distance,
  410. nom_cut, nom_strat);
  411. }
  412. }
  413. }
  414. }
  415. /**
  416. * Fonction réalisant un partitionnement pseudo aléatoire suivant un voisinage.
  417. * @param *g : adresse d'un graphe de type boost graphe undirected
  418. * @param Partition : vecteur contenant des vecteurs d'entiers [tableau contenant les parties de la partition]
  419. * @param nbr_partie : entier correspondant au nombre de parties voulues pour la partition
  420. * @return
  421. */
  422. void Pseudo_random_partitioning(UnorientedGraph *g, EntiersEntiers &Partition,
  423. uint nbr_parties)
  424. {
  425. /*
  426. * Principe : distribution des sommets de la première partie en plusieurs autres parties
  427. * Le partitionnement étant pseudo aléatoire il n'y a pas de contrainte stricte sur le nombre
  428. * de sommets par partie
  429. */
  430. uint size = Partition.at(0)->size();
  431. uint cpt_sommets=1;
  432. int val;
  433. uint cpt;
  434. if(nbr_parties==size){
  435. for(uint i = 0; i < nbr_parties;i++){
  436. if(Partition.at(0)->size()!=1)
  437. {
  438. val=rand_fini(0,Partition.at(0)->size()-1);//tirage aléatoire d'un sommets
  439. }
  440. else
  441. val=0;
  442. int vertex = Partition.at(0)->at(val);
  443. Entiers *part = new Entiers();
  444. part->push_back(vertex);// ajout du sommet tiré
  445. suprim_val(*Partition.at(0),vertex);//suppression du sommet dans la premiere partie
  446. }
  447. }
  448. /*
  449. * Boucle sur le nombre de partie à réaliser
  450. */
  451. for(uint i = 0; i < nbr_parties-1;i++){
  452. if(Partition.at(0)->size()!=1)
  453. {
  454. val=rand_fini(0,Partition.at(0)->size()-1);//tirage aléatoire d'un sommets
  455. }
  456. else
  457. val=0;
  458. int vertex = Partition.at(0)->at(val);
  459. /*
  460. * Initialisation d'un pointeur sur un vecteur d'entier, dans notre cas
  461. * la n+1 ième partie de la partition
  462. */
  463. Entiers *part = new Entiers();
  464. part->push_back(vertex);// ajout du sommet tiré
  465. suprim_val(*Partition.at(0),vertex);//suppression du sommet dans la premiere partie
  466. cpt=1;
  467. /*
  468. * Pour chaque element de la nouvelle partie faire
  469. */
  470. for(uint j = 0; j<part->size();j++){
  471. /*
  472. * Détermination des voisins de chacun des sommets de cette nouvelle
  473. * partie et ajoue de ce voisin si celui-ci est présent dans la première partie (Partition[0])
  474. */
  475. tie(neighbourIt, neighbourEnd) = adjacent_vertices(part->at(j),*g);
  476. for (; neighbourIt != neighbourEnd; ++neighbourIt){
  477. if(In_tab(*Partition.at(0),*neighbourIt)==1){
  478. // std::cout<<"le voisin déplacé est : "<<*neighbourIt<<std::endl;
  479. part->push_back(*neighbourIt);
  480. cpt_sommets++;
  481. suprim_val(*Partition.at(0),*neighbourIt);
  482. cpt++;
  483. }
  484. /*
  485. * Si le nombre moyen de sommets est atteind dans la partie on sort de la boucle des voisins
  486. * Même chose si l'on a rencontré le nombre total de sommets
  487. */
  488. if(cpt==(size/nbr_parties)+1)
  489. break;
  490. if(cpt_sommets==size)
  491. break;
  492. }
  493. /*
  494. * Même chose
  495. */
  496. if(cpt==(size/nbr_parties)+1)
  497. break;
  498. if(cpt_sommets==size)
  499. break;
  500. }
  501. Partition.push_back(part);// ajoue de la nouvelle partie à la partition
  502. if(cpt_sommets==size)
  503. break;
  504. }
  505. }
  506. EntiersEntiers Random_equal_weight_partitioning(UnorientedGraph *g,
  507. uint parts_number)
  508. {
  509. EntiersEntiers Partition;
  510. Entiers random_order = Random_Sort_Vector(num_vertices(*g));
  511. uint cpt = 0;
  512. for(uint j = 0 ; j < parts_number ; j++){
  513. Entiers *part = new Entiers();
  514. Partition.push_back(part);
  515. }
  516. for(uint id = 0; id < random_order.size(); id++){
  517. Partition.at(cpt)->push_back(random_order.at(id));
  518. cpt++;
  519. if(cpt == parts_number)
  520. cpt = 0;
  521. }
  522. for(uint i = 0 ; i < Partition.size() ; i++){
  523. sort(Partition.at(i)->begin(),Partition.at(i)->end());
  524. }
  525. return Partition;
  526. }
  527. EntiersEntiers Random_partitioning(UnorientedGraph *g,
  528. uint parts_number)
  529. {
  530. EntiersEntiers Partition;
  531. uint nbr_vertices = num_vertices(*g);
  532. Entiers random_order = Random_Sort_Vector(nbr_vertices);
  533. uint cpt = 0;
  534. std::vector<int> taille;
  535. int tmp_size = nbr_vertices;
  536. for(uint i = 0; i < parts_number - 1; i++){
  537. int t1;
  538. if(parts_number < 10){
  539. if(floor(tmp_size*0.5/10) != 0)
  540. t1 = rand_fini(floor(tmp_size*0.5/100), floor(tmp_size*(60-10*i/2)/100));
  541. else
  542. t1 = rand_fini(1, floor(tmp_size*(60-10*i/2)/100));
  543. }else{
  544. if(floor(tmp_size*0.5/100) != 0)
  545. t1 = rand_fini(floor(tmp_size*0.5/100), floor(tmp_size*(60-10*i/4)/100));
  546. else
  547. t1 = rand_fini(1, floor(tmp_size*(60-10*i/4)/100));
  548. }
  549. tmp_size -= t1;
  550. taille.push_back(t1);
  551. }
  552. taille.push_back(tmp_size);
  553. for(uint id_size = 0; id_size < taille.size(); id_size ++){
  554. Entiers *part = new Entiers();
  555. uint cpt_taille = 0;
  556. while(cpt_taille < taille.at(id_size)){
  557. part->push_back(random_order.at(cpt));
  558. cpt_taille++;
  559. cpt++;
  560. }
  561. Partition.push_back(part);
  562. }
  563. for(uint i = 0 ; i < Partition.size() ; i++){
  564. sort(Partition.at(i)->begin(),Partition.at(i)->end());
  565. }
  566. return Partition;
  567. }
  568. void Coarsening_Phase(Base_Graph &baseg, ListEntiersEntiers &liste_corr,
  569. uint niveau, int nbr_vertex,
  570. std::string parameter){
  571. uint cpt = 0;
  572. bool stop = false;
  573. while(!stop){
  574. if(parameter == "HEM")
  575. stop = contraction_HEM(baseg.at(cpt), baseg,
  576. liste_corr, niveau, nbr_vertex);
  577. else if(parameter == "HEM_degree")
  578. stop = contraction_HEM_degree(baseg.at(cpt), baseg,
  579. liste_corr, niveau, nbr_vertex);
  580. else
  581. stop = contraction_Random_Maching(baseg.at(cpt), baseg,
  582. liste_corr, niveau, nbr_vertex);
  583. cpt++;
  584. }
  585. // std::cout<<std::endl;
  586. }
  587. EntiersEntiers Partitioning_Phase(const Base_Graph &baseg,
  588. const std::vector<uint> &numeric_parameters,
  589. const std::vector<std::string> &parameters,
  590. int distance){
  591. EntiersEntiers Partition;
  592. if(parameters.at(1) == "gggp" || parameters.at(1) == "ggp"){
  593. Entiers *part = new Entiers();
  594. for(uint i = 0; i<num_vertices(*baseg.at(baseg.size() - 1)); i++)
  595. part->push_back(i);
  596. Partition.push_back(part);
  597. bissectionRec(baseg.at(baseg.size()-1), Partition,
  598. numeric_parameters.at(1), parameters.at(3),
  599. numeric_parameters.at(2), parameters.at(1),
  600. distance);
  601. }
  602. else if(parameters.at(1) == "rand")
  603. Partition = Random_partitioning(baseg.at(baseg.size()-1),
  604. numeric_parameters.at(1));
  605. else
  606. Partition = Random_equal_weight_partitioning(baseg.at(baseg.size()-1),
  607. numeric_parameters.at(1));
  608. return Partition;
  609. }
  610. void Uncoarsening_Phase(const Base_Graph &baseg,
  611. EntiersEntiers &Partition,
  612. const std::vector<std::string> &parameters,
  613. ListEntiersEntiers &liste_corr,
  614. double poids_moy, bool rec){
  615. ListEntiersEntiers::iterator lit(liste_corr.end());
  616. bool proj;
  617. uint taille_list = liste_corr.size();
  618. if(liste_corr.size()==0){
  619. taille_list = 1;
  620. proj = true;
  621. }
  622. else{
  623. lit--;
  624. proj = false;
  625. }
  626. std::vector<const char* > nom;
  627. std::vector<const char* > nom_a;
  628. if(rec){
  629. const char * tmp_nom1 = "../../sortie_graphe/Tests/Graphes/Multiniveau/txt/projection_partition_1.txt";
  630. nom.push_back(tmp_nom1);
  631. const char * tmp_nom_a1 = "../../sortie_graphe/Tests/Graphes/Multiniveau/txt/projection_partition_affine_1.txt";
  632. nom_a.push_back(tmp_nom_a1);
  633. const char * tmp_nom2 = "../../sortie_graphe/Tests/Graphes/Multiniveau/txt/projection_partition_2.txt";
  634. nom.push_back(tmp_nom2);
  635. const char * tmp_nom_a2 = "../../sortie_graphe/Tests/Graphes/Multiniveau/txt/projection_partition_affine_2.txt";
  636. nom_a.push_back(tmp_nom_a2);
  637. const char * tmp_nom3 = "../../sortie_graphe/Tests/Graphes/Multiniveau/txt/projection_partition_3.txt";
  638. nom.push_back(tmp_nom3);
  639. const char * tmp_nom_a3 = "../../sortie_graphe/Tests/Graphes/Multiniveau/txt/projection_partition_affine_3.txt";
  640. nom_a.push_back(tmp_nom_a3);
  641. const char * tmp_nom4 = "../../sortie_graphe/Tests/Graphes/Multiniveau/txt/projection_partition_4.txt";
  642. nom.push_back(tmp_nom4);
  643. const char * tmp_nom_a4 = "../../sortie_graphe/Tests/Graphes/Multiniveau/txt/projection_partition_affine_4.txt";
  644. nom_a.push_back(tmp_nom_a4);
  645. const char * tmp_nom5 = "../../sortie_graphe/Tests/Graphes/Multiniveau/txt/projection_partition_5.txt";
  646. nom.push_back(tmp_nom5);
  647. const char * tmp_nom_a5 = "../../sortie_graphe/Tests/Graphes/Multiniveau/txt/projection_partition_affine_5.txt";
  648. nom_a.push_back(tmp_nom_a5);
  649. const char * tmp_nom6 = "../../sortie_graphe/Tests/Graphes/Multiniveau/txt/projection_partition_6.txt";
  650. nom.push_back(tmp_nom6);
  651. const char * tmp_nom_a6 = "../../sortie_graphe/Tests/Graphes/Multiniveau/txt/projection_partition_affine_6.txt";
  652. nom_a.push_back(tmp_nom_a6);
  653. const char * tmp_nom7 = "../../sortie_graphe/Tests/Graphes/Multiniveau/txt/projection_partition_7.txt";
  654. nom.push_back(tmp_nom7);
  655. const char * tmp_nom_a7 = "../../sortie_graphe/Tests/Graphes/Multiniveau/txt/projection_partition_affine_7.txt";
  656. nom_a.push_back(tmp_nom_a7);
  657. const char * tmp_nom8= "../../sortie_graphe/Tests/Graphes/Multiniveau/txt/projection_partition_8.txt";
  658. nom.push_back(tmp_nom8);
  659. const char * tmp_nom_a8 = "../../sortie_graphe/Tests/Graphes/Multiniveau/txt/projection_partition_affine_8.txt";
  660. nom_a.push_back(tmp_nom_a8);
  661. const char * tmp_nom9 = "../../sortie_graphe/Tests/Graphes/Multiniveau/txt/projection_partition_9.txt";
  662. nom.push_back(tmp_nom9);
  663. const char * tmp_nom_a9 = "../../sortie_graphe/Tests/Graphes/Multiniveau/txt/projection_partition_affine_9.txt";
  664. nom_a.push_back(tmp_nom_a9);
  665. const char * tmp_nom10 = "../../sortie_graphe/Tests/Graphes/Multiniveau/txt/projection_partition_10.txt";
  666. nom.push_back(tmp_nom10);
  667. const char * tmp_nom_a10 = "../../sortie_graphe/Tests/Graphes/Multiniveau/txt/projection_partition_affine_10.txt";
  668. nom_a.push_back(tmp_nom_a10);
  669. const char * tmp_nom11 = "../../sortie_graphe/Tests/Graphes/Multiniveau/txt/projection_partition_11.txt";
  670. nom.push_back(tmp_nom11);
  671. const char * tmp_nom_a11 = "../../sortie_graphe/Tests/Graphes/Multiniveau/txt/projection_partition_affine_11.txt";
  672. nom_a.push_back(tmp_nom_a11);
  673. const char * tmp_nom12 = "../../sortie_graphe/Tests/Graphes/Multiniveau/txt/projection_partition_12.txt";
  674. nom.push_back(tmp_nom12);
  675. const char * tmp_nom_a12 = "../../sortie_graphe/Tests/Graphes/Multiniveau/txt/projection_partition_affine_12.txt";
  676. nom_a.push_back(tmp_nom_a12);
  677. const char * tmp_nom13 = "../../sortie_graphe/Tests/Graphes/Multiniveau/txt/projection_partition_13.txt";
  678. nom.push_back(tmp_nom13);
  679. const char * tmp_nom_a13 = "../../sortie_graphe/Tests/Graphes/Multiniveau/txt/projection_partition_affine_13.txt";
  680. nom_a.push_back(tmp_nom_a13);
  681. const char * tmp_nom14 = "../../sortie_graphe/Tests/Graphes/Multiniveau/txt/projection_partition_14.txt";
  682. nom.push_back(tmp_nom14);
  683. const char * tmp_nom_a14 = "../../sortie_graphe/Tests/Graphes/Multiniveau/txt/projection_partition_affine_14.txt";
  684. nom_a.push_back(tmp_nom_a14);
  685. const char * tmp_nom15 = "../../sortie_graphe/Tests/Graphes/Multiniveau/txt/projection_partition_15.txt";
  686. nom.push_back(tmp_nom15);
  687. const char * tmp_nom_a15 = "../../sortie_graphe/Tests/Graphes/Multiniveau/txt/projection_partition_affine_15.txt";
  688. nom_a.push_back(tmp_nom_a15);
  689. const char * tmp_nom16 = "../../sortie_graphe/Tests/Graphes/Multiniveau/txt/projection_partition_16.txt";
  690. nom.push_back(tmp_nom16);
  691. const char * tmp_nom_a16 = "../../sortie_graphe/Tests/Graphes/Multiniveau/txt/projection_partition_affine_16.txt";
  692. nom_a.push_back(tmp_nom_a16);
  693. }
  694. for(uint y =0 ; y < taille_list ; y++){
  695. if(!proj){
  696. projection(Partition,lit);
  697. if(rec)
  698. Plot_UnorientedGraph_All(baseg.at(baseg.size()-2-y),
  699. Partition,nom.at(y), true);
  700. double cut = Cut_cluster(Partition,
  701. *baseg.at(baseg.size()-2-y),
  702. parameters.at(3));
  703. if(parameters.at(2) == "charge")
  704. Affinage_equilibrage_charge(baseg.at(baseg.size()-2-y),
  705. Partition);
  706. else if(parameters.at(2) == "locale"){
  707. Affinage_recherche_locale(baseg.at(baseg.size()-2-y),
  708. Partition, cut, parameters.at(3));}
  709. else
  710. Affinache_gain_diff(baseg.at(baseg.size()-2-y),
  711. Partition, cut,
  712. parameters.at(3), poids_moy);
  713. if(rec)
  714. Plot_UnorientedGraph_All(baseg.at(baseg.size()-2-y),
  715. Partition, nom_a.at(y), true);
  716. lit--;
  717. }
  718. }
  719. }
  720. /* std::vector<std::string> parameters :
  721. * 0 -> contraction : nom de la méthode de contraction
  722. * 1 -> type_methode : nom de la méthode de partitionnement
  723. * 2 -> choix_affinage : nom de la méthode d'affinage
  724. * 3 -> type_cut : nom de la fonction objectif étudiée
  725. *
  726. * std::vector<uint> numeric_parameters :
  727. * 0 -> niveau_contraction : niveau de contraction à atteindre
  728. * 1 -> nbr_parties : nombre de parties de la partition
  729. * 2 -> nbr_tirage : nombre de tirage de sommet de depart
  730. * 3 -> distance : distance minimum de selection de sommet
  731. * de depart par default -1
  732. */
  733. OrientedGraphs Multiniveau(OrientedGraph *go,
  734. const std::vector<uint> &numeric_parameters,
  735. const std::vector<std::string> &parameters,
  736. Edges& /* edge_partie */,
  737. OutputEdgeList& outputedgelist,
  738. InputEdgeList& inputedgelist,
  739. Connections& connections,
  740. bool rec, int distance)
  741. {
  742. boost::timer t;
  743. double t1, t2, t3, t4;
  744. UnorientedGraph *g = new UnorientedGraph();
  745. make_unoriented_graph(*go, *g);
  746. UnorientedGraph *copie = new UnorientedGraph();
  747. boost::copy_graph(*g,*copie);
  748. //Plot_UnorientedGraph(copie,"lifegame.txt");
  749. Base_Graph baseg;
  750. //baseg.push_back(g);
  751. ListEntiersEntiers liste_corr;
  752. OrientedGraphs Graphes;
  753. int val_cpt = num_vertices(*g);
  754. bool time = true;
  755. /*Eigen::MatrixXd Madj = adjacence_matrix(g);
  756. std::cout << Madj << std::endl << std::endl;*/
  757. if(numeric_parameters.at(0) != val_cpt && parameters.at(1) != "rand" && parameters.at(1) != "rande"){
  758. simple_graph(copie);
  759. baseg.push_back(copie);
  760. //Plot_UnorientedGraph(copie,"lifegame2.txt");
  761. Coarsening_Phase(baseg, liste_corr, numeric_parameters.at(0), val_cpt, parameters.at(0));
  762. if(rec){
  763. std::ofstream GRAPHp ("../../sortie_graphe/Tests/Graphes/Bissection/poids_graphe.txt", std::ios::out);
  764. GRAPHp<<"Poids du graphe contracté : "<<std::endl;
  765. tie(vertexIt, vertexEnd) = vertices(*baseg.at(baseg.size()-1));
  766. for (; vertexIt != vertexEnd; ++vertexIt) {
  767. GRAPHp<<(*baseg.at(baseg.size()-1))[*vertexIt]._index<<" --> "<<(*baseg.at(baseg.size()-1))[*vertexIt]._weight<<std::endl;;
  768. }
  769. GRAPHp<<"}";
  770. GRAPHp.close();
  771. }
  772. if(time){
  773. t2 = t.elapsed();
  774. // std::cout << "C : " << t2 << " ; ";
  775. }
  776. if(rec)
  777. Plot_UnorientedGraph(baseg.at(baseg.size()-1),"../../sortie_graphe/Tests/Graphes/Multiniveau/txt/contraction_final.txt");
  778. UnorientedGraph copy_graph;
  779. boost::copy_graph(*baseg.at(baseg.size()-1),copy_graph);
  780. EntiersEntiers Partition = Partitioning_Phase(baseg,
  781. numeric_parameters, parameters, distance);
  782. if(time){
  783. t3 = t.elapsed();
  784. // std::cout << "P : " << (t3 - t2) << " ; ";
  785. }
  786. if(rec)
  787. Plot_UnorientedGraph_All(&copy_graph,Partition,"../../sortie_graphe/Tests/Graphes/Multiniveau/txt/contraction_final_partition.txt", true);
  788. double poids_moy = 0.;
  789. for(uint i =0; i < Partition.size(); i++)
  790. poids_moy += Cluster_Weight(copy_graph,*Partition.at(i));
  791. poids_moy/=Partition.size();
  792. poids_moy = -1; /*poids faible*/
  793. Uncoarsening_Phase(baseg, Partition, parameters,
  794. liste_corr, poids_moy, rec);
  795. if(time){
  796. t4 = t.elapsed();
  797. // std::cout << "A : " << (t4 - t3) << " ; "<<std::endl;
  798. }
  799. for(uint si = 0; si < Partition.size(); si++){
  800. // std::cout<<Partition.at(si)->size()<<std::endl;
  801. }
  802. // std::cout<<std::endl;
  803. double ratio_cut = Cut_cluster(Partition, *g, parameters.at(3));
  804. // std::cout<<"Ratio : "<<ratio_cut<<std::endl;
  805. Graphes = Graph_Partition(Partition, go, g, outputedgelist,
  806. inputedgelist, connections);
  807. if(rec)
  808. Plot_OrientedGraph_All(go,Partition,"../../sortie_graphe/Tests/Graphes/Multiniveau/txt/résultat_partitionnement.txt", true);
  809. delete g;
  810. for(uint it = 0 ; it < Partition.size(); it++ )
  811. {
  812. delete Partition.at(it);
  813. }
  814. }else{
  815. UnorientedGraph *copie_g = new UnorientedGraph();
  816. boost::copy_graph(*g,*copie_g);
  817. EntiersEntiers Partition = Partitioning_Phase(baseg,
  818. numeric_parameters, parameters,
  819. distance);
  820. if(time){
  821. t1 = t.elapsed();
  822. // std::cout << "P : " << t1 << " ; "<<std::endl;
  823. }
  824. for(uint si = 0; si < Partition.size(); si++){
  825. // std::cout<<Partition.at(si)->size()<<std::endl;
  826. }
  827. // std::cout<<std::endl;
  828. double ratio_cut = Cut_cluster(Partition, *copie_g, parameters.at(3));
  829. // std::cout<<"Ratio : "<<ratio_cut<<std::endl;
  830. Graphes = Graph_Partition(Partition, go, copie_g,
  831. outputedgelist, inputedgelist,
  832. connections);
  833. if(rec)
  834. Plot_OrientedGraph_All(go,Partition,"../../sortie_graphe/Tests/Graphes/Multiniveau/txt/résultat_partitionnement.txt", true);
  835. delete copie_g;
  836. for(uint it = 0 ; it < Partition.size(); it++ )
  837. {
  838. delete Partition.at(it);
  839. }
  840. }
  841. for(ListEntiersEntiers::iterator it = liste_corr.begin(); it != liste_corr.end(); it++)
  842. {
  843. for(EntiersEntiers::iterator it1 = (*it)->begin(); it1 != (*it)->end(); it1++)
  844. {
  845. delete *it1;
  846. *it1 = NULL;
  847. }
  848. delete *it;
  849. *it = NULL;
  850. }
  851. for(Base_Graph::iterator it = baseg.begin(); it != baseg.end(); it++)
  852. {
  853. delete *it;
  854. *it = NULL;
  855. }
  856. return Graphes;
  857. }
  858. void Optimisation_method_neighbour(UnorientedGraph *g,
  859. EntiersEntiers &Partition, int index_partition,
  860. int nbr_tirage, const std::string &name_cut,
  861. const std::string &name_strat){
  862. /*Initialisation des parametres*/
  863. Entiers *part2_cons = new Entiers();
  864. Entiers *part_cour_cons = new Entiers();
  865. double cut = 1000000000.;
  866. Entiers Random_list_vertices = Random_Sort_Vector(Partition.at(index_partition)->size());
  867. if(Partition.at(index_partition)->size()< nbr_tirage)
  868. nbr_tirage = Partition.at(index_partition)->size();
  869. /*Boucle de conservation de la meilleure bissection*/
  870. for(int k = 0; k<nbr_tirage; k++){
  871. Entiers *part2 = new Entiers();
  872. Entiers *tmp_part = new Entiers();
  873. double new_cut;
  874. /*Recopie de la partie faisant l'objet de la bissection */
  875. for(uint t=0; t<Partition.at(index_partition)->size();t++)
  876. tmp_part->push_back(Partition.at(index_partition)->at(t));
  877. if(name_strat == "gggp")
  878. gggp_pond(g, tmp_part, part2, Partition,
  879. Random_list_vertices.at(k), index_partition,
  880. name_cut , -1);
  881. else if(name_strat == "ggp")
  882. ggp(g, tmp_part, part2, Partition,
  883. Random_list_vertices.at(k), index_partition ,-1);
  884. else
  885. std::cout<<"Nom de stratégie de partitionnement non valide ! "<<std::endl;
  886. new_cut = Best_Cut_cluster(Partition, tmp_part,
  887. part2, index_partition, *g, name_cut);
  888. /*conservation de l'information en cas d'amélioration
  889. * de la contrainte*/
  890. if(new_cut<cut){
  891. cut = new_cut;
  892. delete part2_cons;
  893. delete part_cour_cons;
  894. part2_cons = part2;
  895. part_cour_cons = tmp_part;
  896. }
  897. else{
  898. delete tmp_part;
  899. delete part2;
  900. }
  901. }
  902. for (uint i=0; i<part_cour_cons->size();i++)
  903. {
  904. for (uint j=0; j<part2_cons->size();j++)
  905. {
  906. remove_edge(part_cour_cons->at(i),part2_cons->at(j),*g);
  907. }
  908. }
  909. /*Modification des informations*/
  910. delete Partition.at(index_partition);
  911. Partition.at(index_partition)=part_cour_cons;
  912. Partition.push_back(part2_cons);
  913. }
  914. void Optimisation_method_neighbour_distance(UnorientedGraph *g,
  915. EntiersEntiers &Partition, int index_partition,
  916. int nbr_tirage, int distance, const std::string &name_cut,
  917. const std::string &name_strat){
  918. /*Initialisation des parametres*/
  919. Entiers *part2_cons = new Entiers();
  920. Entiers *part_cour_cons = new Entiers();
  921. double cut=1000000000.;
  922. int val;
  923. std::list<int> vertex_list;
  924. for(uint verx =0; verx<Partition.at(index_partition)->size(); verx++){
  925. vertex_list.push_back(Partition.at(index_partition)->at(verx));
  926. }
  927. if(Partition.at(index_partition)->size()< nbr_tirage)
  928. nbr_tirage = Partition.at(index_partition)->size();
  929. /*Boucle de conservation de la meilleure bissection*/
  930. for(int k = 0; k<nbr_tirage; k++){
  931. std::list<int>::iterator Iter;
  932. if(vertex_list.size()!=0){
  933. Iter = vertex_list.begin();
  934. for(int i = 0; i<rand_fini(0,vertex_list.size()); i++)
  935. Iter++;
  936. val = *Iter;
  937. tirage_distance(g, *Iter, vertex_list, distance);
  938. }
  939. else{
  940. break;
  941. }
  942. Entiers *part2 = new Entiers();
  943. Entiers *tmp_part = new Entiers();
  944. double new_cut;
  945. /*Recopie de la partie faisant l'objet de la bissection*/
  946. for(uint t=0; t<Partition.at(index_partition)->size();t++)
  947. tmp_part->push_back(Partition.at(index_partition)->at(t));
  948. if(name_strat == "gggp")
  949. gggp_pond(g, tmp_part, part2, Partition, val,
  950. index_partition, name_cut, distance);
  951. else if(name_strat == "ggp")
  952. ggp(g, tmp_part, part2, Partition, val,
  953. index_partition, distance);
  954. else
  955. std::cout<<"Nom de stratégie de partitionnement non valide ! "<<std::endl;
  956. new_cut = Best_Cut_cluster(Partition, tmp_part, part2,
  957. index_partition, *g,name_cut);
  958. if(new_cut<cut){
  959. cut = new_cut;
  960. delete part2_cons;
  961. delete part_cour_cons;
  962. part2_cons = part2;
  963. part_cour_cons = tmp_part;
  964. }
  965. else{
  966. delete tmp_part;
  967. delete part2;
  968. }
  969. }
  970. for (uint i=0; i<part_cour_cons->size();i++)
  971. {
  972. for (uint j=0; j<part2_cons->size();j++)
  973. {
  974. remove_edge(part_cour_cons->at(i), part2_cons->at(j), *g);
  975. }
  976. }
  977. /*Modification des informations*/
  978. delete Partition.at(index_partition);
  979. Partition.at(index_partition)=part_cour_cons;
  980. Partition.push_back(part2_cons);
  981. }
  982. void Optimisation_method_neighbour_degree(UnorientedGraph *g,
  983. EntiersEntiers &Partition, int index_partition,
  984. const std::string &name_cut,
  985. const std::string &name_strat){
  986. std::vector<double> vertex_degree;
  987. Entiers *part2 = new Entiers();
  988. for(uint i =0; i<Partition.at(index_partition)->size(); i++)
  989. vertex_degree.push_back(Degree(*g,
  990. Partition.at(index_partition)->at(i)));
  991. uint best_cpt = 0;
  992. double best_degree = vertex_degree.at(0);
  993. for(uint i =1; i<vertex_degree.size(); i++){
  994. if(vertex_degree.at(i)>best_degree){
  995. best_degree = vertex_degree.at(i);
  996. best_cpt = i;
  997. }
  998. }
  999. if(name_strat == "gggp")
  1000. gggp_pond(g, Partition.at(index_partition), part2,
  1001. Partition, best_cpt, index_partition,
  1002. name_cut, -1);
  1003. else if(name_strat == "ggp")
  1004. ggp(g ,Partition.at(index_partition), part2, Partition,
  1005. best_cpt, index_partition, -1);
  1006. else
  1007. std::cout<<"Nom de stratégie de partitionnement non valide ! "<<std::endl;
  1008. for (uint i=0; i<Partition.at(index_partition)->size();i++){
  1009. for (uint j=0; j<part2->size();j++){
  1010. remove_edge(Partition.at(index_partition)->at(i),
  1011. part2->at(j), *g);
  1012. }
  1013. }
  1014. Partition.push_back(part2);
  1015. }
  1016. void Optimisation_method_neighbour_minweight(UnorientedGraph *g,
  1017. EntiersEntiers &Partition, int index_partition,
  1018. const std::string &name_cut,
  1019. const std::string &name_strat){
  1020. std::vector<double> vertex_weight;
  1021. Entiers *part2 = new Entiers();
  1022. for(uint i =0; i<Partition.at(index_partition)->size(); i++){
  1023. vertex_weight.push_back((*g)[Partition.at(index_partition)->at(i)]._weight);
  1024. }
  1025. uint best_cpt = 0;
  1026. double best_weight = vertex_weight.at(0);
  1027. for(uint i =1; i<vertex_weight.size(); i++){
  1028. if(vertex_weight.at(i)>best_weight){
  1029. best_weight = vertex_weight.at(i);
  1030. best_cpt = i;
  1031. }
  1032. }
  1033. if(name_cut == "ratio"){
  1034. int tmp_best_cpt;
  1035. tmp_best_cpt = Partition.at(index_partition)->at(best_cpt);
  1036. best_cpt = tmp_best_cpt;
  1037. }
  1038. if(name_strat == "gggp"){
  1039. gggp_pond(g, Partition.at(index_partition), part2,
  1040. Partition, best_cpt, index_partition,
  1041. name_cut, -1);
  1042. } else if(name_strat == "ggp"){
  1043. ggp(g, Partition.at(index_partition), part2,
  1044. Partition, best_cpt, index_partition, -1);
  1045. } else {
  1046. std::cout<<"Nom de stratégie de partitionnement non valide ! "<<std::endl;
  1047. }
  1048. for (uint i=0; i<Partition.at(index_partition)->size();i++)
  1049. {
  1050. for (uint j=0; j<part2->size();j++)
  1051. {
  1052. remove_edge(Partition.at(index_partition)->at(i),
  1053. part2->at(j), *g);
  1054. }
  1055. }
  1056. Partition.push_back(part2);
  1057. }
  1058. void tirage_distance(UnorientedGraph *g, int tirage,
  1059. std::list<int> &vertex_list, int distance){
  1060. std::vector<std::list<int> > vertex_delete;
  1061. std::list<int> liste1;
  1062. std::list<int> vd;
  1063. liste1.push_back(tirage);
  1064. vertex_delete.push_back(liste1);
  1065. for(int i=0; i<distance; i++){
  1066. std::list<int> liste_tmp;
  1067. std::list<int>::iterator Ite_tmp;
  1068. for(Ite_tmp = vertex_delete.at(i).begin();
  1069. Ite_tmp != vertex_delete.at(i).end();
  1070. Ite_tmp ++){
  1071. tie(neighbourIt, neighbourEnd) =
  1072. adjacent_vertices(*Ite_tmp,*g);
  1073. for (; neighbourIt != neighbourEnd; ++neighbourIt){
  1074. liste_tmp.push_back(*neighbourIt);
  1075. }
  1076. }
  1077. liste_tmp.sort();
  1078. liste_tmp.unique();
  1079. vertex_delete.push_back(liste_tmp);
  1080. }
  1081. for(int index = 0; index < vertex_delete.size(); index ++){
  1082. vd.merge(vertex_delete.at(index));
  1083. }
  1084. vd.unique();
  1085. std::list<int>::iterator Ite;
  1086. for(Ite = vd.begin(); Ite != vd.end(); Ite ++){
  1087. vertex_list.remove(*Ite);
  1088. }
  1089. }
  1090. } } } // namespace paradevs tests boost_graph