root/InOutExpositor/oGraph.pde

Revision 5972babe7c40454704b75ea69ba2e12d80927eaa, 5.4 kB (checked in by Robin Gareus <robin@…>, 3 years ago)

fixed expositor to compile w/processing-1.0.9

  • Property mode set to 100644
Line 
1//////////////////////////////////////////////////////////////////////////
2// Class with sub graphs + dijkstra for minimal distances
3class 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
Note: See TracBrowser for help on using the browser.