| 1 | ////////////////////////////////////////////////////////////////////////// |
|---|
| 2 | // Class with sub graphs + dijkstra for minimal distances |
|---|
| 3 | class GraphUtils { |
|---|
| 4 | Vector groups ; |
|---|
| 5 | int idOfBiggestGroup ; |
|---|
| 6 | |
|---|
| 7 | GraphUtils( Vector cells, boolean[] config) { |
|---|
| 8 | groups = new Vector() ; |
|---|
| 9 | buildSubGroups() ; |
|---|
| 10 | } |
|---|
| 11 | //////////////////////////////////////////////////////// |
|---|
| 12 | void buildSubGroups() { |
|---|
| 13 | int maxClientInAGroup = 0 ; |
|---|
| 14 | int currentIdOfGroup = 0 ; |
|---|
| 15 | idOfBiggestGroup = 0 ; |
|---|
| 16 | |
|---|
| 17 | boolean aloneFound = true ; |
|---|
| 18 | boolean[] made = new boolean[nClients] ; |
|---|
| 19 | int done = 0 ; |
|---|
| 20 | |
|---|
| 21 | while(aloneFound && done<nClients) { |
|---|
| 22 | //print("Doing a Group : "+currentIdOfGroup+"\n") ; |
|---|
| 23 | |
|---|
| 24 | Vector G = new Vector() ; |
|---|
| 25 | ///// Searching alone point de depart |
|---|
| 26 | aloneFound = false ; |
|---|
| 27 | int af = -1 ; |
|---|
| 28 | while(!aloneFound) { |
|---|
| 29 | af++ ; |
|---|
| 30 | if(af==nClients) break ; |
|---|
| 31 | if(!made[af]) { |
|---|
| 32 | aloneFound = true ; |
|---|
| 33 | G.addElement( getClient(af) ) ; |
|---|
| 34 | made[af] = true ; |
|---|
| 35 | //print("Searching from "+af+"\n") ; |
|---|
| 36 | } |
|---|
| 37 | } |
|---|
| 38 | |
|---|
| 39 | ///// Filling the group |
|---|
| 40 | boolean decouvrNouv = true ; |
|---|
| 41 | while(decouvrNouv) { |
|---|
| 42 | decouvrNouv = false ; |
|---|
| 43 | for(int u=0;u<G.size();u++) { |
|---|
| 44 | Vector amis = getOutLinkedClients( (Client)G.elementAt(u) ) ; |
|---|
| 45 | Vector amisI = getInLinkedClients( (Client)G.elementAt(u) ) ; |
|---|
| 46 | for(int k=0;k<amisI.size();k++) amis.addElement( amisI.elementAt(k) ) ; |
|---|
| 47 | for(int v=0;v<amis.size();v++) { |
|---|
| 48 | Client newAmi = (Client)amis.elementAt(v) ; |
|---|
| 49 | if( !G.contains(newAmi) ) { |
|---|
| 50 | decouvrNouv = true ; |
|---|
| 51 | G.addElement(newAmi) ; |
|---|
| 52 | done++ ; |
|---|
| 53 | if(done>maxClientInAGroup) { |
|---|
| 54 | maxClientInAGroup = done ; |
|---|
| 55 | idOfBiggestGroup = currentIdOfGroup ; |
|---|
| 56 | } |
|---|
| 57 | made[newAmi.id] = true ; |
|---|
| 58 | //print("Ading one Cell\n") ; |
|---|
| 59 | } |
|---|
| 60 | } |
|---|
| 61 | } |
|---|
| 62 | } |
|---|
| 63 | //// the group is finished |
|---|
| 64 | if(aloneFound) groups.addElement(G) ; |
|---|
| 65 | currentIdOfGroup ++ ; |
|---|
| 66 | } |
|---|
| 67 | } |
|---|
| 68 | Client getRandomOfBiggestGroup() { |
|---|
| 69 | Vector gp = (Vector)groups.elementAt( idOfBiggestGroup ) ; |
|---|
| 70 | int id = int( random(0,gp.size()) ) ; |
|---|
| 71 | Client res = (Client)gp.elementAt( id ) ; |
|---|
| 72 | return res ; |
|---|
| 73 | } |
|---|
| 74 | //////////////////////////////////////////// |
|---|
| 75 | Pt getGroupUniformPosition(int i, int N) { // quadrillage uniforme |
|---|
| 76 | int nbCoteCarre = int(sqrt(N))+1 ; |
|---|
| 77 | int px = i%(nbCoteCarre) ; |
|---|
| 78 | int py = int(i/nbCoteCarre) ; |
|---|
| 79 | float marg = width/4 ; |
|---|
| 80 | float distEntreX = (width - 2*marg)/(nbCoteCarre-1) ; |
|---|
| 81 | float distEntreY = (height - 2*marg)/(nbCoteCarre-1) ; |
|---|
| 82 | Pt res = new Pt( marg+px*distEntreX, marg+py*distEntreY ) ; |
|---|
| 83 | return res ; |
|---|
| 84 | } |
|---|
| 85 | void moveClientsByGroups() { |
|---|
| 86 | int ng = groups.size() ; |
|---|
| 87 | float x,y,gx,gy ; |
|---|
| 88 | print("NB de groupes :"+ng +"\n") ; |
|---|
| 89 | for(int i=0;i<ng;i++) { |
|---|
| 90 | float dg = 40 ; // random in groups |
|---|
| 91 | |
|---|
| 92 | Pt groupPos = getGroupUniformPosition(i,ng) ; |
|---|
| 93 | |
|---|
| 94 | int nh = ((Vector)groups.elementAt(i)).size() ; |
|---|
| 95 | for(int j=0;j<nh;j++) { |
|---|
| 96 | //x = 20 + width*j/nh ; |
|---|
| 97 | x = groupPos.x + random(-dg,dg); |
|---|
| 98 | y = groupPos.y + random(-dg,dg) ; |
|---|
| 99 | ((Client)((Vector)groups.elementAt(i)).elementAt(j)).moveTo(x,y) ; |
|---|
| 100 | //stri += " ,"+ ((Cell)((Vector)gu.groups.elementAt(i)).elementAt(j)).id ; |
|---|
| 101 | } |
|---|
| 102 | //print("Grp "+i+" :"+stri+"\n"); |
|---|
| 103 | } |
|---|
| 104 | } |
|---|
| 105 | //////////////////////////////////////////////////////// |
|---|
| 106 | float getDijkstraDistance( Vector group, int idDeb, int idFin) { |
|---|
| 107 | int dd = Dijkstra( (Vector)clientGraphUtils.groups.elementAt(0), idDeb, idFin ) ; |
|---|
| 108 | print("distance("+selected.id+","+highlighted.id+ ")= "+dd +"\n") ; |
|---|
| 109 | return dd ; |
|---|
| 110 | } |
|---|
| 111 | //////////////////////////////////////////////////////// |
|---|
| 112 | int dijPoids(int u, int v) |
|---|
| 113 | { |
|---|
| 114 | if(drawnState.isAnyLink(u,v)) return 1 ; |
|---|
| 115 | else return 90 ; |
|---|
| 116 | } |
|---|
| 117 | int dijGetMin(Vector vus, Vector afaire, int[] distDij) |
|---|
| 118 | { |
|---|
| 119 | int resMin = 200 ; |
|---|
| 120 | int res = -1 ; |
|---|
| 121 | for(int k=0;k<afaire.size();k++) { |
|---|
| 122 | |
|---|
| 123 | int aid = ((Client)afaire.elementAt(k)).id ; |
|---|
| 124 | for(int v=0;v<vus.size();v++) { |
|---|
| 125 | int vid = ((Client)vus.elementAt(v)).id ; |
|---|
| 126 | if(drawnState.isAnyLink(vid,aid)) { |
|---|
| 127 | resMin = min( resMin, distDij[vid] + 1 ) ; |
|---|
| 128 | if(resMin>=distDij[vid]+1) res = aid ; |
|---|
| 129 | } |
|---|
| 130 | } |
|---|
| 131 | } |
|---|
| 132 | print("Le minim trajet pese : "+resMin+"\n") ; |
|---|
| 133 | return res ; |
|---|
| 134 | } |
|---|
| 135 | int Dijkstra(Vector g,int sdeb, int ff) |
|---|
| 136 | { |
|---|
| 137 | |
|---|
| 138 | int[] dijDist = new int[nClients] ; |
|---|
| 139 | int[] dijPrec = new int[nClients] ; |
|---|
| 140 | |
|---|
| 141 | for(int i=0;i<g.size();i++) { |
|---|
| 142 | dijPrec[i]=-1 ; |
|---|
| 143 | dijDist[i]=999 ; |
|---|
| 144 | } |
|---|
| 145 | dijDist[sdeb]=0 ; |
|---|
| 146 | |
|---|
| 147 | Vector afaire = new Vector() ; |
|---|
| 148 | Vector vus = new Vector() ; |
|---|
| 149 | vus.addElement( getClient(sdeb) ) ; |
|---|
| 150 | for(int l=0;l<nClients;l++) { |
|---|
| 151 | if(l!=sdeb) |
|---|
| 152 | afaire.addElement( getClient(l) ) ; |
|---|
| 153 | } |
|---|
| 154 | |
|---|
| 155 | int s1 = sdeb ; |
|---|
| 156 | |
|---|
| 157 | while( afaire.size()>0 ) { |
|---|
| 158 | s1 = dijGetMin( vus, afaire, dijDist ) ; |
|---|
| 159 | print("Sommet Minimum : "+s1+"\nA faire = "+ afaire.size()+"\n") ; |
|---|
| 160 | afaire.removeElement(getClient(s1)) ; |
|---|
| 161 | vus.addElement(getClient(s1)) ; |
|---|
| 162 | |
|---|
| 163 | for(int i=0;i<nClients;i++) { |
|---|
| 164 | if(drawnState.isAnyLink(i,s1)) { |
|---|
| 165 | |
|---|
| 166 | if( dijDist[s1] > (dijDist[i] + dijPoids(i,s1)) ) { |
|---|
| 167 | dijDist[s1] = dijDist[i] + dijPoids(i,s1) ; |
|---|
| 168 | dijPrec[s1] = i ; |
|---|
| 169 | } |
|---|
| 170 | } |
|---|
| 171 | } |
|---|
| 172 | } |
|---|
| 173 | return dijDist[ff] ; |
|---|
| 174 | } |
|---|
| 175 | /////////////////////////////// |
|---|
| 176 | |
|---|
| 177 | } |
|---|
| 178 | ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// |
|---|
| 179 | |
|---|
| 180 | |
|---|
| 181 | |
|---|
| 182 | |
|---|