Add files via upload
Código de Python / Sage
This commit is contained in:
parent
0645924423
commit
b2ee0a85c1
178
Stable marriage problem.txt
Normal file
178
Stable marriage problem.txt
Normal file
|
@ -0,0 +1,178 @@
|
|||
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ógico" #realmente también tendrí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á 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á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
|
Loading…
Reference in New Issue
Block a user