gggp.hpp 46 KB

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