6 from itertools import *
7 from scipy import optimize as opt
14 distanceEmmissionMax = 30
23 # construction du graphe
25 lg = [(0, 1, 22.004323820359151), (0, 2, 28.750632705280324), (0, 3, 29.68069293796183), (0, 4, 8.547146256271331), (0, 5, 28.079672647730469), (0, 7, 23.017867703525138), (0, 8, 6.1268526078857208), (0, 9, 24.573433868296771), (1, 0, 22.004323820359151), (1, 2, 18.807277287689722), (1, 3, 18.982897767602783), (1, 4, 16.848855991756174), (1, 5, 17.042671653231526), (1, 6, 16.410544777532913), (1, 7, 25.598808236367063), (1, 8, 20.175759189503321), (1, 9, 12.843763853990932), (2, 0, 28.750632705280324), (2, 1, 18.807277287689722), (2, 3, 1.0957062702237066), (2, 4, 29.159997765424084), (2, 5, 1.8557839901886808), (2, 6, 23.122260476726876), (2, 9, 6.052562826627808), (3, 0, 29.68069293796183), (3, 1, 18.982897767602783), (3, 2, 1.0957062702237066), (3, 4, 29.884008054261855), (3, 5, 1.9922790489539697), (3, 6, 22.479228556182363), (3, 9, 6.4359869969688059), (4, 0, 8.547146256271331), (4, 1, 16.848855991756174), (4, 2, 29.159997765424084), (4, 3, 29.884008054261855), (4, 5, 28.006189408396626), (4, 7, 15.774839848636024), (4, 8, 3.6206480052249144), (4, 9, 23.804744370383144), (5, 0, 28.079672647730469), (5, 1, 17.042671653231526), (5, 2, 1.8557839901886808), (5, 3, 1.9922790489539697), (5, 4, 28.006189408396626), (5, 6, 21.492976178079076), (5, 8, 29.977996181215822), (5, 9, 4.4452006140146185), (6, 1, 16.410544777532913), (6, 2, 23.122260476726876), (6, 3, 22.479228556182363), (6, 5, 21.492976178079076), (6, 9, 20.04488615603487), (7, 0, 23.017867703525138), (7, 1, 25.598808236367063), (7, 4, 15.774839848636024), (7, 8, 16.915923579829141), (8, 0, 6.1268526078857208), (8, 1, 20.175759189503321), (8, 4, 3.6206480052249144), (8, 5, 29.977996181215822), (8, 7, 16.915923579829141), (8, 9, 25.962918470558208), (9, 0, 24.573433868296771), (9, 1, 12.843763853990932), (9, 2, 6.052562826627808), (9, 3, 6.4359869969688059), (9, 4, 23.804744370383144), (9, 5, 4.4452006140146185), (9, 6, 20.04488615603487), (9, 8, 25.962918470558208)]
28 #lg= [(0,1,23),(1,0,15),(1,2,45)]
36 l = [(random()*coteCarre, random()*coteCarre) for _ in range(n)]
37 for io in range(len(l)) :
38 for ie in range(len(l)) :
40 dist = mt.sqrt((l[io][0]-l[ie][0])**2 + (l[io][1]-l[ie][1])**2)
41 if dist <= distanceEmmissionMax :
42 G.add_edge(io,ie,weight=dist)
43 G.add_edge(ie,io,weight=dist)
44 test = not(any([ not(nx.has_path(G,o,sink)) for o in G.nodes() if sink in G.nodes() and o != sink]))
48 G.add_weighted_edges_from(lg)
49 #print nx.is_strongly_connected(G)
60 #print G.edges(data=True)
61 #TODO afficher le graphe et etre sur qu'il est connexe
66 #V = list(set(sample(N,int(len(N)*vrate)))-set([sink]))
67 V = list(set(N)-set([sink]))
71 #print "source",source
74 L = range(len(G.edges()))
75 d = [di['weight'] for (_,_,di) in G.edges(data=True)]
80 assert l in L, " pb de dimennsion de l: "+str(l)+ " "+ str(L)
92 a = [[ail(i,l) for l in L ] for i in xrange(n)]
93 aplus = [[1 if ail(i,l) > 0 else 0 for l in L ] for i in xrange(n)]
94 amoins = [[1 if ail(i,l) < 0 else 0 for l in L ] for i in xrange(n)]
111 cs = [alpha + beta*(di**path_loss_exp) for di in d]
131 # separer le calcul des operateurs lagrangien pour avoir un pas d'iteration de decallage
135 return cmp(x1[1],x2[1])
144 return mt.sqrt(sum([(d1[t]-d2[t])**2 for t in d1]))
147 def AfficheVariation (up,vp,lap,wp,thetap,etap,qp,Psp,Rhp,xp,valeurFonctionDualep):
148 global u, v, la, w, theta , q, Ps, Rh, eta, x,valeurFonctionDuale
150 print "du=",distance(u,up),
151 print "dv=",distance(v,vp),
152 print "dlambda=",distance(la,lap),
153 print "dw=",distance(w,wp),
154 print "dtheta=",abs(theta-thetap),
155 print "deta=",distance(eta,etap),
156 print "dq=",distance(q,qp),
157 print "dPs=",distance(Ps,Psp),
158 print "dRh=",distance(Rh,Rhp),
159 print "dx=",distance(x,xp),
160 print "dL=",abs(valeurFonctionDuale-valeurFonctionDualep),"\n"
163 valeurFonctionDuale = 0
166 r = x if (x >0 and x <= 1) else -1
167 #print "ds entre0et1 x et r", x,r
172 r = x if x >0 else -1
173 #print "ds xpos x et r", x,r
177 return x if x >= 0 else -1
180 def armin(f,xini,xr,args):
181 #xpos = lambda x : x if x > 0 else -1
184 #print "strictement pos"
185 #print "parametres passes a cobyla",xini,xpos,args,"consargs=(),rhoend=1E-5,iprint=0,maxfun=1000"
186 r= opt.fmin_cobyla(f,xini,cons=[xpos],args=args,consargs=(),rhoend=1E-3,iprint=0,maxfun=nbiter)
187 #print "le min str pos est",r
188 #print "le min pos est", r,"avec xini",xini
191 r = opt.fmin_cobyla(f,xini,[xposounul],args,consargs=(),rhoend=1E-3,iprint=0,maxfun=nbiter)
192 # print "le min pos est", r
193 #print "le min pos null est", r,"avec xini",xini
195 r = opt.fmin_cobyla(f,xini,[entre0et1],args,consargs=(),rhoend=1E-3,iprint=0,maxfun=nbiter)
196 #print "le min pos inf 1 est", r,"avec xini",xini
207 return omega/(mt.pow(k,0.5))
212 return omega/mt.sqrt(k)
218 def maj(k,maj_theta):
219 # initialisation des operateurs lagrangiens
220 global u, v, la, w, theta , q, Ps, Rh, eta, x, valeurFonctionDuale
228 if not ASYNC or random() < taux_perte:
229 up[(h,i)] = u[(h,i)]-theta*(eta[(h,i)]-sum([a[i][l]*x[(h,l)] for l in L]))
238 #print "vp",gamma*mt.pow(Ps[h],float(1)/3)
239 if not ASYNC or random() < taux_perte:
240 vp[h] = max(0,v[h]-theta*(Rh[h]- mt.log(float(sigma2)/D)/(gamma*mt.pow(Ps[h],float(1)/3))))
247 if not ASYNC or random() < taux_perte:
248 resla = la[i]-theta*((q[i]*Bi -sum([aplus[i][l]*cs[l]*sum([x[(h,l)] for h in V]) for l in L])-cr*sum([amoins[i][l]*sum([x[(h,l)] for h in V]) for l in L])-psi(Ps,i)))
249 lap[i] = max(0,resla)
255 if not ASYNC or random() < taux_perte:
256 wp[l] = w[l] + theta*(sum([a[i][l]*q[i] for i in N]))
260 thetap = maj_theta(k)
265 fa = sum([a[i][l]*w[l] for l in L]) - la[i]*Bi
269 if not ASYNC or random() < taux_perte:
270 c = -float(sum([a[i][l]*w[l] for l in L]) - la[i]*Bi)/(2*amplifieur)
271 rep = epsilon if c <= 0 else c
284 return v[h]* mt.log(float(sigma2)/D)/(gamma*mt.pow(float(2)/3)) +la[h]*psh
286 if not ASYNC or random() < taux_perte:
287 lah = 0.05 if la[h] == 0 else la[h]
288 rep = (float(2*v[h]*mt.log(float(sigma2)/D))/mt.pow(3*gamma*lah,float(3)/5))
289 Psp[h] = epsilon if rep <= 0 else rep
299 etap[(h,i)] = etahi(h,i,Rh)
305 return delta*rh*rh-v[h]*rh-sum([u[(h,i)]*eta[(h,i)] for i in N])
308 if not ASYNC or random() < taux_perte:
309 rep = float(v[h])/(2*delta)
310 Rhp[h] = 0 if rep < 0 else rep
316 r = delta*xhl*xhl + xhl*(cs[l]*sum([la[i]*aplus[i][l] for i in N]) +cr*sum([la[i]*amoins[i][l] for i in N])+sum([u[(h,i)]*a[i][l] for i in N]))
322 if not ASYNC or random() < taux_perte:
323 rep = -float(cs[l]*sum([la[i]*aplus[i][l] for i in N]) +cr*sum([la[i]*amoins[i][l] for i in N])+sum([u[(h,i)]*a[i][l] for i in N]))/(2*delta)
324 xp[(h,l)] = 0 if rep < 0 else rep
328 valeurFonctionDualep = 0
329 valeurFonctionDualep += sum([amplifieur*q[i]*q[i] for i in N])
330 valeurFonctionDualep += sum([sum([delta*mt.pow(x[(h,l)],2) for l in L]) for h in V])
331 valeurFonctionDualep += sum([delta*(Rh[h]**2) for h in V])
332 valeurFonctionDualep += sum([sum([u[(h,i)]*(sum([ a[i][l]*x[(h,l)] for l in L])- eta[(h,i)]) for i in N]) for h in V])
333 valeurFonctionDualep += sum([v[h]*(mt.log(float(sigma2)/D)/(gamma*mt.pow(Ps[h],float(2)/3)) - Rh[h]) for h in V])
334 valeurFonctionDualep += sum([la[i]*(psi(Ps,i) +sum([aplus[i][l]*cs[l]*sum([x[(h,l)] for h in V]) for l in L])+ cr*sum([ amoins[i][l]*sum([x[(h,l)] for h in V]) for l in L]) -q[i]*Bi) for i in N ])
335 valeurFonctionDualep += sum([w[l]*sum([a[i][l]*q[i] for i in N]) for l in L])
338 AfficheVariation(up,vp,lap,wp,thetap,etap,qp,Psp,Rhp,xp,valeurFonctionDualep)
340 arret = abs(valeurFonctionDuale-valeurFonctionDualep) < error
342 return (up,vp,lap,wp,thetap,etap,qp,Psp,Rhp,xp,valeurFonctionDualep,arret)
363 def initialisation():
364 global u, v, la, w, theta , q, Ps, Rh, eta, x, valeurFonctionDuale
369 # TODO Ahmed : initialiser avec qi >0 et somme (ail.qi) = 0 Ei/i = Ti
373 q[i] = 0.15 + random()*0.05
379 #TODO Ahmed doit donner les valeurs initiales pour Ps
382 Ps[h] = 0.2+random()*0.3
387 #TODO Ahmed doit donner les valeurs initiales pour Rh
390 Rh[vi] = 0.1 + random()*0.1
397 eta[(h,i)]= etahi(h,i,Rh)
410 # initialisation des operateurs lagrangiens
432 def __evalue_maj_theta():
433 global u, v, la, w, theta , q, Ps, Rh, eta, x, valeurFonctionDuale
436 for l in range(1,11):
439 om = omega/(mt.pow(k,float(l)/10))
440 #om = omega/(mt.pow(k,0.5))
443 for _ in range(nbexp):
447 while k < 10000 and not arret :
448 (u,v,la,w,theta,eta,q,Ps,Rh,x,valeurFonctionDuale,ar)=maj(k,__maj_theta)
459 #__evalue_maj_theta()
466 while k < 10000 and not arret :
467 (u,v,la,w,theta,eta,q,Ps,Rh,x,valeurFonctionDuale,ar)=maj(k,maj_theta)
504 print "L",valeurFonctionDuale
508 # relation ente les variables primaires et secondaires ?