490 likes | 715 Views
Técnicas Algorítmicas. Gonzalo Sainz-Trápaga (GomoX) Charlas PC++ 2008 www.pcmasmas.com 26 de Julio de 2008. Temas. Problemas Técnicas exactas Técnicas aproximadas. Problemas. De decisión. ¿183287 es primo?. ¿Cuál es el mínimo de la secuencia [7,8,32]?. De optimización.
E N D
TécnicasAlgorítmicas Gonzalo Sainz-Trápaga (GomoX) Charlas PC++ 2008 www.pcmasmas.com 26 de Julio de 2008
Temas Problemas Técnicas exactas Técnicas aproximadas
De decisión • ¿183287 es primo? • ¿Cuál es el mínimo de • la secuencia [7,8,32]?
De optimización • Hallar el camino más corto • entre Buenos Aires y Beijing • Ordenar la secuencia: • [1,9,34,-2,6,28] Elegir o proponer una solución.
Fuerza Bruta Probar todas las opciones.
Fuerza Bruta Se recorre todo el universo de soluciones posibles. for cand in generarCandidatos(): if esSolucion(cand): return cand
Fuerza Bruta Ordenar por fuerza bruta: for p in permutaciones(secuencia): if estaOrdenado(p): return p
Fuerza Bruta • Limitaciones • Usos reales
Backtracking Probar todas las opciones, de forma más inteligente.
Backtracking Orden!
Backtracking Ordenar la secuencia [3,1,2]:
Backtracking • Podas • Recursión
Backtracking • Limitaciones • Usos reales
Divide & Conquer “Vamos por partes” - Jack el destripador
Divide & Conquer • “Dividir” • “Conquistar” • “Combinar”
Divide & Conquer Merge sort: def mergesort(l): m1 = l[0:len(l)/2] m2 = l[len(l)/2:len(l)] return combinar(mergesort(m1), mergesort(m2))
Divide & Conquer • Recursión • Paralelismo
Divide & Conquer • Usos reales • Limitaciones
Programación Dinámica “Usar COBOL arruina el cerebro” - Edsger Dijkstra
Programación Dinámica Subestructura Óptima Recursión
Programación Dinámica Fibonacci: def fibo(n): if n == 1 or n == 2: return 1 else: return fibo(n-1) + fibo(n-2)
Programación Dinámica fibo(n) = fibo(n-1) + fibo(n-2) fibo(n-2) + fibo(n-3) fibo(n-3) + fibo(n-4) fibo(n-4) + fibo(n-5)
Programación Dinámica Solapamiento A B
Programación Dinámica • “Top-down” • “Bottom-up”
Programación Dinámica Fibonacci (top down): tabla = {} def fibo(n): if n == 1 or n == 2: return 1 else: if n in tabla: return tabla[n] else: res = fibo(n-1) + fibo(n-2) tabla[n] = res return res
Programación Dinámica Fibonacci (bottom up): tabla = {} def fibo(n): if n == 1 or n == 2: return 1 else: tabla[1] = fibo(1) tabla[2] = fibo(2) for i in 3…n-1: tabla[i] = tabla[i-1] + tabla[i-2] return tabla[n-1] + tabla[n-2]
Programación Dinámica Fibonacci (bottom up 2.0): def fibo(n): if n == 1 or n == 2: return 1 else: t1 = fibo(1) t2 = fibo(2) for i in 3…n-1: tmp = t2 t2 = t1 + t2 t1 = tmp return t1 + t2
Programación Dinámica • Usos reales • Limitaciones
Programación Lineal
Programación Lineal • Ecuaciones lineales • SIMPLEX • Programación entera
"La mayor deficiencia de la raza humana es nuestra incapacidad para comprender la función exponencial." - Albert Bartlett
Algoritmos golosos • Usos • Limitaciones
Algoritmos Genéticos - Charles Darwin
Algoritmos Genéticos Algoritmo genético: generacion = 0 poblacion = generarIndividuosAleatorios() while(generacion < 5000): padres = poblacion.tomarAlgunos() poblacion.agregar(padres.procrear()) poblacion.mutarAlgunos() poblacion.matarAlgunos() generacion++ poblacion.sort(aptitud) machoAlfa = poblacion[0] return machoAlfa
Algoritmos Genéticos • Usos • Parametrización
Otras metaheurísticas GRASP Colonias de hormigas Redes neuronales
Problemas de las Metaheurísticas • Confiabilidad • Parametrización
Más opciones! • Algoritmos aproximados • Algoritmos híbridos
Esta charla fue traída a ustedes por cortesía de Lotux Neon.