Tarea 5: Algoritmos aleatorizados

Tarea 5: Algoritmos aleatorizados

Información de la Tarea

Estudiante: Andrés Cruz Chipol
Curso: Análisis y Diseño de Algoritmos
Fecha de entrega: Jueves 16 de octubre, 2025

Descripción de la Tarea


En esta tarea implementamos y analizamos dos algoritmos aleatorizados en Python: un enfoque clásico de contratación aleatoria y un algoritmo de tipo Las Vegas. Para cada caso mostramos la implementación, su análisis de comportamiento esperado y resultados experimentales con distribución empírica.

Algoritmo de Contratación Aleatorizado

El problema consiste en entrevistar candidatos en orden aleatorio y contratar a un candidato solo cuando supera la mejor calificación observada hasta el momento. Este procedimiento produce un número de contrataciones aleatorio cuyo valor esperado es aproximadamente Hₙ (n-ésimo número armónico), es decir, cercano a ln(n) + γ.

Funcionamiento

Implementacion del Algoritmo en python

import random
def contratar_asistente_aleatorio(num_candidatos):
candidatos = random.sample(range(0, 101), num_candidatos) # calificaciones únicas 0–100
random.shuffle(candidatos)
mejor_calificacion = -1
contrataciones = 0
for calificacion in candidatos:
if calificacion > mejor_calificacion:
mejor_calificacion = calificacion
contrataciones += 1
return contrataciones
if __name__ == "__main__":
num_candidatos = 100
resultado = contratar_asistente_aleatorio(num_candidatos)
print(f"Con {num_candidatos} candidatos, se realizaron {resultado} contrataciones.")

Uso y pruebas

Terminal window
python algoritmo_contratacion.py

Distribución empírica (simulaciones)

Distribución de contrataciones

La figura muestra la distribución de contrataciones tras múltiples corridas con n fijo. Se observa la concentración cerca de Hₙ, con caídas a ambos lados propias de la dispersión.


Algoritmo tipo Las Vegas (búsqueda aleatoria hasta éxito)

En este enfoque, el algoritmo reordena aleatoriamente el arreglo y realiza selecciones aleatorias hasta encontrar un elemento objetivo. Es un algoritmo de tipo Las Vegas: siempre retorna una solución correcta cuando termina, pero su tiempo de ejecución es aleatorio.

Para un arreglo con proporción p del objetivo, el número de intentos sigue distribución geométrica con esperanza 1/p. Por ejemplo, si p = 0.5, el número esperado de intentos es 2.

Funcionamiento

Implementacion del Algoritmo en python

import random
def encuentra_las_vegas(A):
array = A.copy()
random.shuffle(array)
intentos = 0
while True:
# Seleccionar una posición aleatoria
q = random.randint(0, len(array) - 1)
intentos += 1
if array[q] == 'a':
break
return intentos
if __name__ == "__main__":
tamaño_arreglo = 1000
porcentaje_a = 0.5
num_a = int(tamaño_arreglo * porcentaje_a)
num_b = tamaño_arreglo - num_a
arreglo = ['a'] * num_a + ['b'] * num_b
resultado = encuentra_las_vegas(arreglo)
print(f"Con un arreglo de {tamaño_arreglo} elementos (50% 'a', 50% 'b')")
print(f"Se encontró 'a' después de {resultado} intentos.")

Uso y pruebas

Terminal window
python algoritmo_las_vegas.py

Distribución empírica (simulaciones)

Distribución de intentos en Las Vegas

La figura confirma la forma geométrica esperada: alta probabilidad de éxito temprano, decreciendo exponencialmente conforme aumentan los intentos.


Conclusiones