178 lines
4.0 KiB
Plaintext
178 lines
4.0 KiB
Plaintext
|
def esta_a_antes_en_una_lista(a,b,lista):
|
|||
|
lll=len(lista)
|
|||
|
xx=0
|
|||
|
while lista[xx]!=a and lista[xx]!=b:
|
|||
|
xx=xx+1
|
|||
|
if lista[xx]==a:
|
|||
|
return True
|
|||
|
return False
|
|||
|
|
|||
|
###
|
|||
|
|
|||
|
def funcion_emparejamiento(H,M):
|
|||
|
|
|||
|
#print H
|
|||
|
#print M
|
|||
|
|
|||
|
# Nota bene: Queremos que nuestras listas comiencen en 0, porque L[0] produce el primer elemento de la lista L
|
|||
|
|
|||
|
if len(H)!=len(M):
|
|||
|
return "Caso patol<6F>gico" #realmente tambi<62>n tendr<64>a que comprobar algunas cosas m<>s, pero soy un vago
|
|||
|
|
|||
|
l= len(H) #=len(M)
|
|||
|
|
|||
|
Hombres_emparejados = [False for _ in xsrange(l)]
|
|||
|
Emparejamientos= dict([(_,None) for _ in xrange(l)]) # Donde x designa la mujer
|
|||
|
|
|||
|
while False in Hombres_emparejados:
|
|||
|
|
|||
|
t=0
|
|||
|
|
|||
|
while Hombres_emparejados[t]!=False:
|
|||
|
t=t+1
|
|||
|
|
|||
|
#print 't=', t
|
|||
|
|
|||
|
mm=H[t][0] # La primera mujer en la lista de preferencias del hombre H[t], el cual no est<73> emparejado.
|
|||
|
|
|||
|
#print 'mm=',mm
|
|||
|
|
|||
|
hh = Emparejamientos[mm] # La pareja actual de mm. Puede ser 'None'
|
|||
|
|
|||
|
#print 'hh=',hh
|
|||
|
|
|||
|
if ((hh == None) or esta_a_antes_en_una_lista(t,hh,M[mm]) ):
|
|||
|
|
|||
|
# N<>tese que hh puede ser None, y por tanto no estar en la lista M[mm], pero si ese es el caso, no se pasa a comprobar el or.
|
|||
|
|
|||
|
Emparejamientos[mm]=t
|
|||
|
Hombres_emparejados[t]=True
|
|||
|
if hh != None:
|
|||
|
Hombres_emparejados[hh] = False
|
|||
|
|
|||
|
# Independientemente de lo que pase, quitamos a la mujer mm de la lista de preferencias de H[t]
|
|||
|
ll= len(H[t])
|
|||
|
H[t] = H[t][1:ll]
|
|||
|
|
|||
|
#print H[t]
|
|||
|
|
|||
|
return Emparejamientos
|
|||
|
|
|||
|
###
|
|||
|
|
|||
|
def Media_M(Pareja, M):
|
|||
|
l=len(M)
|
|||
|
s=0
|
|||
|
#print Pareja
|
|||
|
#print M
|
|||
|
for x in xsrange(l):
|
|||
|
|
|||
|
#print x,Pareja[x]
|
|||
|
|
|||
|
t=0
|
|||
|
while Pareja[x]!=M[x][t]:
|
|||
|
t=t+1
|
|||
|
s=s+t
|
|||
|
return (s/l).n()
|
|||
|
|
|||
|
###
|
|||
|
|
|||
|
def Media_H(Pareja, H):
|
|||
|
l=len(H)
|
|||
|
s=0
|
|||
|
#print Pareja
|
|||
|
#print M
|
|||
|
for x in xsrange(l):
|
|||
|
|
|||
|
#print x,Pareja[x]
|
|||
|
|
|||
|
t=0
|
|||
|
while x!=H[Pareja[x]][t]:
|
|||
|
t=t+1
|
|||
|
#print t
|
|||
|
s=s+t
|
|||
|
return (s/l).n()
|
|||
|
|
|||
|
###
|
|||
|
|
|||
|
def Simulacion(numero_de_tiradas, n):
|
|||
|
x=1
|
|||
|
|
|||
|
F=dict()
|
|||
|
D=dict()
|
|||
|
|
|||
|
while x <= numero_de_tiradas:
|
|||
|
|
|||
|
Permu=Permutations([0..n-1])
|
|||
|
|
|||
|
H=[Permu.random_element() for _ in xsrange(n)]
|
|||
|
HH=copy(H)
|
|||
|
|
|||
|
M=[Permu.random_element() for _ in xsrange(n)]
|
|||
|
MM=copy(M)
|
|||
|
|
|||
|
MH=funcion_emparejamiento(H, M)
|
|||
|
|
|||
|
w= Media_M(MH, MM)
|
|||
|
if w in F:
|
|||
|
F[w]=F[w] +1
|
|||
|
|
|||
|
if w not in F:
|
|||
|
F[w]=1
|
|||
|
|
|||
|
q= Media_H(MH, HH)
|
|||
|
|
|||
|
if q in D:
|
|||
|
D[q]=D[q] +1
|
|||
|
|
|||
|
if q not in D:
|
|||
|
D[q]=1
|
|||
|
|
|||
|
x=x+1
|
|||
|
|
|||
|
L=points(F.items())
|
|||
|
M=points(D.items(), color='red')
|
|||
|
|
|||
|
return L + M
|
|||
|
|
|||
|
###
|
|||
|
|
|||
|
def Simulacion_floor(numero_de_tiradas, n, granularidad):
|
|||
|
x=1
|
|||
|
|
|||
|
F=dict()
|
|||
|
D=dict()
|
|||
|
|
|||
|
while x <= numero_de_tiradas:
|
|||
|
|
|||
|
Permu=Permutations([0..n-1])
|
|||
|
|
|||
|
H=[Permu.random_element() for _ in xsrange(n)]
|
|||
|
HH=copy(H)
|
|||
|
|
|||
|
M=[Permu.random_element() for _ in xsrange(n)]
|
|||
|
MM=copy(M)
|
|||
|
|
|||
|
MH=funcion_emparejamiento(H, M)
|
|||
|
|
|||
|
w= floor(Media_M(MH, MM))
|
|||
|
if w in F:
|
|||
|
F[w]=F[w] +1
|
|||
|
|
|||
|
if w not in F:
|
|||
|
F[w]=1
|
|||
|
|
|||
|
q= floor(Media_H(MH, HH)*granularidad)/granularidad # Si granularidad es 5, divide el gr<67>fico en intervalos de longitud 0.2 =1/5
|
|||
|
|
|||
|
if q in D:
|
|||
|
D[q]=D[q] +1
|
|||
|
|
|||
|
if q not in D:
|
|||
|
D[q]=1
|
|||
|
|
|||
|
x=x+1
|
|||
|
|
|||
|
L=points(F.items())
|
|||
|
M=points(D.items(), color='red')
|
|||
|
|
|||
|
return L + M
|