Proyectos
Aquí podrás encontrar los proyectos que he realizado a lo largo de mi trayectoria académica, en su mayoría son son proyectos pequeños. En estos proyectos hago uso de algunos lenguajes como Java, Python, Haskell, R y Prolog.
OpenWeatherMap
El proyecto consiste en realizar un informe del clima de la ciudad de salida y la ciudad de llegada para 3 mil tickets del aeropuerto de la Ciudad de México, los cuales salen el día en el que el programa se ejecuta. Hacemos uso de OpenWeatherMap, es al webservice que le hacemos las peticiones que contienen el clima.
Ver más...
Esteganografía por el método LSB
La esteganografía es el conjunto de técnicas algorítmicas para ocultar un conjunto de datos en otro de forma que los primeros no sean evidentes, permanezcan íntegros y sean recuperables mientras que los segundos, a los que se les denomina portadores, no deben verse alterados de manera evidente. Un método común es ocultar mensajes de texto claro en archivos de imágenes. Se aprovecha en este caso el hecho de que, con frecuencia, las imágenes no requieren de preservar todos los datos que contienen para ser útiles.
Ver más...
El gran Vivero: base de datos
La cadena mexicana de viveros “El Gran Vivero” ha crecido de gran manera durante los últimos años. Esta cadena comenzó con un vivero, al ser un negocio familiar el registro de las compras y plantas a la venta se registran de manera manual en un cuaderno, al igual que el registro de las ganancias. Actualmente se cuenta con 15 viveros en el territorio nacional, por lo cual el manejo de las operaciones en cuadernos se ha vuelto complicado. Viendo la situación, el director ejecutivo de “El Gran Vivero” decidió contratar a los alumnos de la Facultad de Ciencias, para que les ayuden a encontrar una solución la cual permita la administración de los datos de una manera sencilla, centralizada y consistente.
Ver más...
Representación y pertenencia a un lenguaje regular.
Programa que dada una cadena \(w\) y una expresión regular \(r\), indica si la cadena \(w\) pertenece a \(L[r]\). Para esto se usan las técnicas, denotación de expresiones regulares,así como la definición de funciones básicas entre lenguajes y expresiones regulares. Se determinara que lenguaje \(L\) genera una expresión regular \(r\).
Ver más...
Análisis estadístico de complejidad computacional en ordenamientos
El problema del ordenamiento en computación es muy importante, tanto que en un curso de Análisis de Algoritmos se le dedica al menos una cuarta parte del curso. En cuanto a complejidad podemos encontrar diversos algoritmos con distinta complejidad computacional en tiempo. El propósito de este análisis es mostrar de manera experimental como funciona el concepto de complejidad, la razón es que cuando el concepto es presentado a los alumnos este es muy abstracto para el entendimiento del concepto.
Ver más...
Conjunto de Mandelbrot y Julia
Se define el conjunto de Mandelbrot como \(c\in\mathbb{C}\) tal que \(\{Z_{c,n}\}\) esta acotada. Donde la sucesión \(\{Z_{c,n}\}\) esta dada por: $$ z_{c,0} = 0\hspace{1cm} z_{c,n+1} = z_{c,n}^2 + c. $$
Ver más...
Ordenador Lexicográfico
Se construye un ordenador Lexicográfico por lineas, este esta implementado con Java y usa las clases de estructuras de datos proporcionadas por el profesor. Este proyecto fue desarrollado en el curso de Estructuras de Datos impartido por el profesor Canek Peláez. Este ordenador es capaz de ordenar uno o varios archivos y lo puede hacer en orden natural o en reversa.
Ver más...
Secreto compartido de Shamir
El esquema de secreto compartido de Shamir hace posible que un sólo dato pueda ser ocultado de manera que, a partir de él, se generan n diferentes datos y que con, al menos \(t \le n\) cualesquiera de ellos sea posible recuperar el dato original. Es bien sabido que \(r\) puntos en el plano determinan un único polinomio de grado \(r-1\), a saber, el polinomio que interpola los \(r\) puntos. Bastan, por ejemplo, dos puntos para determinar la línea que los une, o tres puntos para encontrar la única parábola que pasa por ellos.
Ver más...
Monitor de Neutrones
En general, un monitor de neutrones (MN) es un detector estándar para detectar la variación de la radiación cósmica a nivel de tierra. A pesar de que es un dispositivo est ́andar, el sitio en donde se localice el MN puede variar la eficiencia del sistema de detección y causar una desviación del \(\pm 15\%\) de la “unidad estándar” de medición. Estos detectores son sensibles a RC que penetran la atmósfera de la Tierra con energías de aproximadamente \(0.5-20 GeV\).
Ver más...
Conjunto independiente
En teoría de grafos, un conjunto independiente o estable es un conjunto de vértices en un grafo tal que ninguno de sus vértices es adyacente a otro. Es decir, es un conjunto \(V\) de vértices tal que para ningún par de ellos existe alguna arista que los conecten. En otras palabras, cada arista en el grafo contiene a lo más un vértice en \(V\). El tamaño de un conjunto independiente es el número de vértices que contiene.
Ver más...
Búsqueda binaria cíclica
El problema de búsqueda, consiste, de manera general, en encontrar un elemento \(x\) en una colección de objetos parcialmente ordenados(i.e. que pueden compararse). Una secuencia \(S= x_i,\ldots,x_n\) se dice que esta cíclicamente ordenada si el número más pequeño en la secuencia es el elemento \(x_i\) para algún \(i\) desconocido y la secuencia \(S^{\prime}\) está ordenada en orden creciente, con \(S^{\prime}= x_i,\ldots x_n,x_1,\ldots,x_{i-1}\).
Ver más...
Algoritmos de ordenamiento
En computación el ordenamiento de datos cumple un rol muy importante, ya sea como un fin en sí o como parte de un proceso más complejo, una prueba de esto, son los métodos de búsqueda que requieren, como entrada, secuencias ordenadas. Un ordenamiento es la operación mediante la cual se organizan los elementos de una secuencia, basándonos en un criterio de orden. Entenderemos por criterio de orden al utilizado para establecer una relación binaria sobre la secuencia.
Ver más...
Dijstra: árbol de peso mínimo
El algoritmo de Dijkstra, también llamado algoritmo de caminos mínimos, es un algoritmo para la determinación del camino más corto, dado un vértice origen, hacia el resto de los vértices en un grafo que tiene pesos en cada arista. La idea subyacente en este algoritmo consiste en ir explorando todos los caminos más cortos que parten del vértice origen y que llevan a todos los demás vértices; cuando se obtiene el camino más corto desde el vértice origen hasta el resto de los vértices que componen el grafo, el algoritmo se detiene
Ver más...
Prim: árbol de peso mínimo
El algoritmo de Prim es un algoritmo perteneciente a la teoría de los grafos para encontrar un árbol recubridor mínimo en un grafo conexo, no dirigido y cuyas aristas están etiquetadas. En otras palabras, el algoritmo encuentra un subconjunto de aristas que forman un árbol con todos los vértices, donde el peso total de todas las aristas en el árbol es el mínimo posible. Si el grafo no es conexo, entonces el algoritmo encontrará el árbol recubridor mínimo para uno de los componentes conexos que forman dicho grafo no conexo.
Ver más...
Kruskal: árbol de peso mínimo
El algoritmo de Kruskal es un algoritmo de la teoría de grafos para encontrar un árbol recubridor mínimo en un grafo conexo y ponderado. Es decir, busca un subconjunto de aristas que, formando un árbol, incluyen todos los vértices y donde el valor de la suma de todas las aristas del árbol es el mínimo. Si el grafo no es conexo, entonces busca un bosque expandido mínimo (un árbol expandido mínimo para cada componente conexa).
Ver más...
El problema de la celebridad
De entre \(n\) personas, se define una celebridad como alguien quien es conocido por todos pero no conoce a nadie. El problema consiste en identificar a la celebridad, si es que existe, haciendo preguntas de la forma ¿Disculpe, usted conoce a aquella persona?. Se asume que todas las respuestas son verdaderas y que también la celebridad debe contestar.
Ver más...
Máxima subsecuencia consecutiva
Dada una secuencia \(x_1,\ldots,x_n\) de números reales no necesariamente positivos encontrar la subsecuencia de elementos consecutivos \(x_i,\ldots,x_j\) tal que la suma de los números de la subsecuencia sea la máxima entre todas las subsecuencias de elementos consecutivos. Notamos que el hecho de que un secuencia ya es este ordenada no implica que la secuencia sea máxima, un ejemplo de esto puede verse en la secuencia \(\{-3,-1,0,3,5\}\), lo anterior si sucede si la secuencia esta compuesta de números positivos.
Ver más...
Búsqueda por interpolación
Búsqueda de interpolación es una variante modificada o más bien mejorada del algoritmo de búsqueda binaria. Este algoritmo trabaja en la posición de prueba del valor requerido para buscar, la búsqueda intenta acercarse al valor real en cada paso o hasta que se encuentra el elemento de búsqueda. Para poder usar esta técnica de búsqueda es necesario que la secuencia se encuentre ordenada.
Ver más...
Resolución binaria
En Lógica Resolución es una regla de inferencia utilizada sobre cierto tipo de proposiciones lógicas y es especialmente utilizada para los demostradores automatizados de teoremas. Utilizando resolución se puede construir un demostrador que sea completo (por contradicción) y correcto (en inglés refutational complete and sound) para la lógica proposicional y de primer orden supuesto que un conjunto de proposiciones son insatisfacibles. Por otro lado si el conjunto de proposiciones de hecho es satisfacible, puede o no terminar en una cantidad finita de pasos una demostración por resolución, generalmente lo que sucede es que se asigna un tiempo límite para hallar si un conjunto es insatisfacible o no.
Ver más...
DPLL
El algoritmo DPLL/Davis-Putnam-Logemann-Loveland es un algoritmo completo basado en la vuelta atrás que sirve para decidir la satisfactibilidad de las fórmulas de lógica proposicional en una forma normal conjuntiva, es decir, para resolver el problema CNF-SAT. El algoritmo de vuelta atrás (backtracking) se ejecuta eligiendo un literal, asignándole un valor de verdad a este, simplificando la fórmula y a continuación, en forma recursiva comprobando si la fórmula simplificada es satisfacible; si este es el caso la fórmula original es satisfacible; de lo contrario, la misma verificación recursiva termina asumiendo el valor de verdad contrario.
Ver más...
Algoritmo de Martelli y Montanari
En 1982, Martelli y Montanari describieron un algoritmo en forma de un conjunto de reglas que transforman un conjunto de ecuaciones. El algoritmo se presenta en libros educativos. Es similar al algoritmo propuesto por Herbrand en su tesis. Según Baader y Snyder, un algoritmo en forma de conjunto de reglas libera los conceptos esenciales y permite demostrar la corrección de varios algoritmos prácticos al mismo tiempo.
Ver más...Introducción a Prolog
Prolog es un lenguaje de programación lógica cuya primera versión fue desarrollada a principios de la década de 1970 por Colmerauer en la universidad de Marsella. Contrariamente a otros lenguajes de programación basados es estructuras de control y definición de funciones para calcular resultados, Prolog está orientado a la especificación de relaciones para responder consultas. En ese sentido Prolog es similar a un sistema de base de datos, aunque en el contexto de la inteligencia artificial se prefiere hablar de bases de conocimiento, enfatizando la complejidad estructural de los datos y de las deducciones que se pueden obtener de ellos.
Ver más...