Algoritmia básica (AB)
El reto de diseñar algoritmos eficientes para resolver problemas puede resultar apasionante

sguenos en twitter
Los desafíos algorítmicos de Tuenti
18 junio 2012 por Javier Campos en Empleo,Problemas Comentarios desactivados

Cada año, desde hace dos, la empresa Tuenti plantea un reto algorítmico en su página web con el objetivo de “cazar talentos”. En esta página web pueden verse las veinte preguntas de este año: https://contest.tuenti.net/.

La siguiente es una de las preguntas del reto del año pasado.

You are trying to solve a very complex problem. In order to simplify it, you have divided it into many sub tasks. Most of these sub-tasks can be run in parallel, but some are dependent on the previous resolution of other tasks. There is no limit on the number of tasks that can be run in parallel. Each task has an associated computation time.

You are be given a subset of these tasks. For each of them you need to specify what is the minimal computation time for resolving the task (you must consider task dependencies).

The relations between the tasks are represented in the file contained in this archive: in.zip. This file is in the following format:

#Number of tasks
n
#Task duration <- task x has an associated computation time of tx
x,tx
#Task dependencies <- the resolution of task x depends of previously
#                     solving tasks y,z,w
x,y,z,w

It is imposible for two different tasks to be dependent on the resolution of one common task:

#Task dependencies <- this is not valid
x,y
z,y

The expected output is the following format: taskId taskComputationTime

x tx
y ty
z tz

From the standard input you will receive a set of tasks for which to compute the total time in the following format:

x,y,z

Sample input file

#Number of tasks
6
#Task duration
0,2
1,3
2,4
3,9
4,7
5,9
#Task dependencies
0,4
3,0,1,2
4,5

Sample standard input for tasks to compute time

3,1,4

Sample output

3 27
1 3
4 16

Como veréis, si lo pensáis un poco, la solución no es difícil en este caso. Pero se pueden plantear problemas de planificación de tareas cuya solución es algo más complicada. Alguno de ellos veremos en la asignatura…

Web de la Especialidad en Computación
5 junio 2012 por admin en Anuncios,Fotografía computacional Comentarios desactivados

La Especialidad en Computación del Grado de Ingeniería Informática de la Universidad de Zaragoza, en la que se integra esta asignatura, también tiene página web. En ella se puede encontrar información sobre todas las asignaturas de la Especialidad, y se irán publicando otros materiales y noticias. Accede a ella haciendo clic en la imagen siguiente.

En la entrada más reciente de esa web, se habla sobre un proyecto liderado por el M.I.T., con la colaboración de profesores de esta Especialidad, sobre técnicas de fotografía computacional que permiten mostrar cómo se propaga la luz a través de una escena (utilizando pulsos láser de menos de una trillonésima de segundo). ¡No te pierdas los vídeos ilustrativos!

Programación dinámica y el problema de la mochila
22 mayo 2012 por Javier Campos en Problemas Comentarios desactivados

.

“Durante un robo, el ladrón encuentra un botín más cuantioso de lo esperado y tiene que elegir qué llevarse. Su saco puede transportar como máximo W kilos. En el botín hay n objetos que pesan w1,…, wn kilos y valen v1,…, vn euros. ¿Qué objetos debe elegir para llevarse el máximo valor sin que se rompa el saco?”

Este podría ser un enunciado habitual del conocido problema de la mochila. Este problema surge con mucha frecuencia en el ámbito de la informática: simplemente sustituye “peso” por “tiempo de CPU” y “mochila de capacidad máxima W” por “hay disponibles W unidades de tiempo de CPU”; o de manera similar “tiempo de CPU” por “ancho de banda”. Este problema es NP-completo y, al igual que para el problema de la suma de subconjuntos mencionado en una entrada anterior, puede encontrarse un algoritmo pseudo-polinómico para resolverlo. Más concretamente, vamos a diseñar un algoritmo que resuelve el problema en tiempo O(nW).

Uno de los puntos clave para diseñar un algoritmo de programación dinámica consiste en encontrar los subproblemas en que puede descomponerse el problema original. En este caso, podríamos optar por dos posibilidades: a) considerar mochilas de menos capacidad que W; b) considerar menos objetos que n. Tomemos la primera opción y definamos la función K(w) como:

K(w) = máximo valor obtenible con una capacidad de w.

Veamos cómo puede expresarse esta función en términos de algunos subproblemas. Si la solución óptima de K(w) incluye el objeto i, entonces la eliminación del objeto i nos proporcionará la solución óptima de K(w-wi). Dicho de otra manera, K(w) simplemente es K(w-wi)+vi para algún i. Como no sabemos para qué i, tenemos que probar todas las posibilidades, es decir:

Y con esto ya casi lo tenemos, sólo falta escribir las cinco líneas del algoritmo:

  K[0]=0;
  para w=1 hasta W hacer
    K[w]=max{K[w-wi]+vi | wi<=w }
  fpara;
  devuelve K[W]

Este sencillo algoritmo rellena un vector de longitud W+1. Como rellenar cada posición puede costar O(n) unidades de tiempo, el tiempo total de ejecución es O(nW).

En la página http://people.csail.mit.edu/bdean/6.046/dp/ podéis encontrar interesantes clases de programación dinámica impartidas en el MIT (Massachusetts Institute of Technology). Entre los problemas tratados se encuentra el problema de la mochila (Integer Knapsack Problem).

Fuente: S. Dasgupta, C. Papadimitriou, U. Vazirani. Algorithms, McGraw-Hill, 2008.

Algoritmos que cambian nuestras vidas
7 mayo 2012 por Javier Campos en Blogosfera Comentarios desactivados

En su publicación del 3 de mayo en la web Txchnologist, Terrence Murray destaca seis algoritmos que “organizan” (o incluso cambian) nuestras vidas:

  • 6: Convertir los datos en Noticias.
  • 5: El algoritmo del millón de dólares.
  • 4: Venciendo a la gripe.
  • 3: Las redes sociales como agencia de calificación de riesgos.
  • 2: Los ordenadores capitalistas de Wall Street.
  • 1: Google.

Puedes leerlo en este enlace.

Presentación de la Especialidad en Computación
17 abril 2012 por Javier Campos en Anuncios Comentarios desactivados

 

El lunes 7 de mayo a las 12:45 en el Aula 01 del Edificio Ada Byron tendrá lugar una presentación informativa sobre la Especialidad en Computación del Grado de Ingeniería Informática.

¡No te la pierdas!




Descripción de la especialidad según el Computing Curricula 2005 de la ACM (Association for Computing Machinery):

Computer Science spans a wide range, from its theoretical and algorithmic foundations to cutting‐edge developments in robotics, computer vision, intelligent systems, bioinformatics, and other exciting areas. We can think of the work of computer scientists as falling into three categories.

  • They design and implement software. Computer scientists take on challenging programming jobs. They also supervise other programmers, keeping them aware of new approaches.
  • They devise new ways to use computers. Progress in the Computer Science areas of networking, database, and human‐computer‐interface enabled the development of the World Wide Web. Now Computer Science researchers are working with scientists from other fields to make robots become practical and intelligent aides, to use databases to create new knowledge, and to use computers to help decipher the secrets of our DNA.
  • They develop effective ways to solve computing problems. For example, computer scientists develop the best possible ways to store information in databases, send data over networks, and display complex images. Their theoretical background allows them to determine the best performance possible, and their study of algorithms helps them to develop new approaches that provide better performance.

Computer Science spans the range from theory through programming. Curricula that reflect this breadth are sometimes criticized for failing to prepare graduates for specific jobs. While other disciplines may produce graduates with more immediately relevant job‐related skills, computer science offers a comprehensive foundation that permits graduates to adapt to new technologies and new ideas.

El eslabón español en la ruptura del código Enigma
11 abril 2012 por Javier Campos en Criptografía,Prensa Comentarios desactivados

[Iremos publicando noticias. Para recibirlas, puedes añadir este enlace: "RSS de las entradas" en tu agregador de noticias o bien seguirnos en Twitter.]


 

Seguramente habrás leído durante este año, en el que se conmemora el centenario del nacimiento de Alan Turing, algún artículo sobre la participación de este pionero de la Computación en la ruptura de los códigos secretos alemanes durante la Segunda Guerra Mundial (SGM), los códigos de las máquinas Enigma, en la instalación militar británica de Bletchley Park, utilizando la computadora Colossus (si no conoces la historia, aquí puedes leer algo sobre ella).

Las máquinas Enigma, desarrolladas originariamente en Alemania en la década de 1920, fueron los primeros dispositivos electromecánicos de cifrado y soportaron las comunicaciones militares del Alemania durante la SGM. La ruptura de esos códigos en Bletchley Park (Reino Unido) jugaría un papel clave en la terminación de la guerra y permitiría por tanto salvar muchas vidas humanas.

Lo que probablemente no conoces es la existencia de un “eslabón español” en la cadena de logros que llevó a la ruptura del código Enigma. La noticia fue publicada hace pocos días por la BBC. La resumimos a continuación.

Un par de máquinas Enigma utilizadas en la Guerra Civil española fueron donadas recientemente por nuestro país al GCHQ, la agencia de inteligencia de comunicaciones del Reino Unido. Esas máquinas cierran un capítulo que permanecía abierto en la historia de la ruptura del código, un capítulo que abrió el camino para el final de la SGM.


Un suboficial del ejército español encontró las máquinas casi por casualidad, hace sólo unos pocos años, en una habitación secreta del Ministerio de Defensa español, en Madrid.
 
«Nadie entró en ella porque era muy secreta», dice el General Félix Sanz Roldán, director del Centro Nacional de Inteligencia. «Y un día alguien dijo: ’Bueno, si es tan secreta, tal vez haya algo secreto dentro’. Entraron y vieron una pequeña oficina en la que se realizaron todas las operaciones de cifrado no sólo durante la guerra civil española, sino también en los años inmediatamente posteriores». En la habitación había alrededor de dos docenas de históricas máquinas Enigma.

Cuando empezó la guerra civil española en 1936, tanto la Alemania de Hitler como la Italia de Mussolini enviaron tropas para ayudar al ejército de Franco. Con el conflicto extendido por todo el país, necesitaban medios de comunicación segura entre la Legión Cóndor alemana, los italianos y las fuerzas de Franco. Para ello, Alemania donó un parque de máquinas comerciales Enigma debidamente modificadas.


En el Reino Unido existían ya expertos en una versión previa de la máquina Enigma comercializada en 1927, pero no tenían oportunidad de interceptar mensajes reales de los alemanes puesto que las señales alemanas resultaban inaudibles desde Gran Bretaña debido a la distancia. Sin embargo, las señales producidas por las máquinas enviadas a España por los alemanes en 1936 eran lo suficientemente audibles como para ser interceptadas y los británicos comenzaron a trabajar con esas señales. Tras seis o siete meses de trabajo con los mensajes españoles, ya tuvieron los primeros éxitos. En abril de 1937, los británicos consiguieron la primera desencriptación de un mensaje de Enigma.
 
La experiencia con los mensajes de las máquinas Enigma españolas resultó ser un paso crucial en el camino que condujo a la ruptura del código de las máquinas alemanas en Bletchley Park, durante la SGM.

 
En esta asignatura veremos un conocido método de encriptación, el RSA, como ejemplo de algoritmo de dividir para vencer. Detallaremos el funcionamiento de este método que, de manera algo “críptica”, aparece resumido en la siguiente transparencia.

Dropbox busca expertos en computación
28 marzo 2012 por Javier Campos en Empleo,Problemas Comentarios desactivados

[Iremos publicando noticias. Para recibirlas, puedes añadir este enlace: "RSS de las entradas" en tu agregador de noticias o bien seguirnos en Twitter.]


 

Muchos de los problemas que afrontan las grandes empresas informáticas no podrían abordarse si no existieran algoritmos eficientes que los resolvieran. Ejemplos de estos problemas incluyen el tratamiento de grandes volúmenes de datos, la optimización del rendimiento de sistemas, la realización de búsquedas múltiples, etc. En sus ofertas de empleo para expertos en computación, estas empresas solicitan a menudo propuestas para solucionar problemas de programación concretos.

Dropbox es una popular empresa internacional que ofrece un servicio gratuito de alojamiento de archivos. En su página web:

https://www.dropbox.com/jobs/challenges

solicita a los aspirantes a trabajar en la empresa soluciones para tres problemas de programación. Echémosle un vistazo al problema “The Dropbox Diet”.

La entrada del problema consiste en una lista de pares, cada par está compuesto por una cadena de caracteres que representa una actividad y un número entero (positivo o negativo) que representa una cantidad de calorías. ¿Qué debe hacer nuestro programa? Muy sencillo, encontrar un conjunto no vacío de actividades cuya suma de calorías sea cero (0). Si no existe tal conjunto, la salida del programa debe ser “no hay solución”.

Aunque sencillo de enunciar, el problema propuesto es equivalente al problema de la suma de subconjuntos (http://en.wikipedia.org/wiki/Subset_sum_problem), que es NP-completo. Por tanto encontrar un algoritmo polinomial para resolverlo no sólo abriría la puerta grande de Dropbox, sino que solucionaría uno de los problemas seleccionados por el Clay Mathematics Institute como problema del milenio (http://www.claymath.org/millennium/P_vs_NP/). El premio por solucionar cualquiera de los problemas del milenio es de 106 dólares.

Uno de los temas que se tratará en Algoritmia Básica está relacionado con Programación Dinámica. Veremos que el uso de técnicas de Programación Dinámica permite desarrollar un algoritmo pseudo-polinómico para resolver el problema de la suma de conjuntos. De ahí a resolver el problema del milenio… sólo falta eliminar “pseudo”.

Nuestra distancia con los Neandertal
16 marzo 2012 por Javier Campos en Bioinformática,Problemas Comentarios desactivados

[Iremos publicando noticias. Para recibirlas, puedes añadir este enlace: "RSS de las entradas" en tu agregador de noticias o bien seguirnos en Twitter.]


 

Hace 150 años se encontraron por vez primera partes del esqueleto del denominado hombre de Neandertal cerca de Düsseldorf (Alemania). Desde entonces, hemos querido saber qué relación existe entre el Homo sapiens, nuestro antepasado, y el de Neandertal.

Hoy sabemos que el Homo neanderthalensis no es un ancestro del Homo sapiens, y viceversa. Las diferencias encontradas entre el genotipo del Homo sapiens y el del Homo neanderthalensis lo demostraron. Las nuevas tecnologías nos permiten extraer genotipos de huesos de más de 30000 años de antigüedad. Los genotipos se extraen en forma de secuencias de ADN. Estas secuencias son como los planos de construcción de los seres vivos. Con el transcurso del tiempo, las secuencias de ADN cambian debido a mutaciones. Dadas las secuencias de ADN de diferentes especies, se puede calcular su similitud con la ayuda de un computador. Medimos la similitud de dos secuencias mediante la especificación de la distancia entre ellas. Una pequeña distancia entre dos secuencias de ADN indica una gran similitud entre ambas. Pero, ¿cómo se calcula la distancia entre dos secuencias de ADN? En esta asignatura veremos cómo se diseña un algoritmo para resolver este problema. Para ello, necesitaremos un modelo matemático de las secuencias de ADN, de las mutaciones, y de la distancia entre dos secuencias.

Una secuencia de ADN se compone de bases. Una secuencia de tres bases codifica un aminoácido. Existen cuatro bases diferentes, que suelen representarse con las letras A, G, C y T. Por tanto, una secuencia de ADN puede representarse con una cadena de símbolos del alfabeto Σ = {A, G, C, T}.

Por ejemplo, CAGCGGAAGGTCACGGCCGGGCCTAGCGCCTCAGGGGTG, es una parte de la secuencia de ADN de un pollo.

En la naturaleza, las secuencias de ADN cambian a causa de las mutaciones. Una mutación puede considerarse como una aplicación desde una secuencia de ADN x a otra secuencia de ADN y. Supongamos que todas las mutaciones se pueden modelar utilizando los siguientes tres tipos básicos de mutaciones:

  1. borrado de un carácter,
  2. inserción de un carácter, y
  3. sustitución de un carácter por otro carácter.

Por ejemplo, sea x = AGCT una secuencia de ADN. Entonces, la mutación “sustituir G por C” mutaría x a la secuencia y = ACCT. Utilizamos la notación “a → b” para representar la sustitución de a por b. De igual forma, “a →” representa el borrado del carácter a, y  “→ b” es la inserción del carácter b. Además, debe especificarse explícitamente la posición en la que se produce la mutación.

Para medir la distancia entre dos secuencias de ADN, damos un coste específico a cada mutación básica. La mutación s tiene coste c(s). El coste de una mutación se corresponde con la probabilidad de esa mutación. Cuanto más probable sea una mutación, más bajo será su coste. Utilizamos los siguientes costes para las tres mutaciones básicas:

  • borrado: 2
  • inserción: 2
  • sustitución: 3

Para comparar dos secuencias de ADN x e y, se requiere en la mayoría de los casos más de una mutación básica transformando x en y. Por ejemplo, si queremos comparar x = AG con y = T, entonces no sería suficiente con una mutación básica.

Pero podríamos obtener la transformación usando la secuencia de mutaciones S = A →, G → T (es decir, borrar A y luego sustituir G por T). El coste c(S) de una secuencia de mutaciones, S = s1. . . , st es la suma de los costes de sus mutaciones básicas, es decir,

c(S) := c(s1) + … + c(st).

La distancia entre dos secuencias de ADN se define como el coste de una secuencia específica de mutaciones que transforma una en la otra. El problema es que puede haber muchas secuencias diferentes de mutaciones que transforman una secuencia de ADN en otra. Por ejemplo, podríamos utilizar las siguientes secuencias de mutaciones para transformar la secuencia x = AG en y = T:

  • S1 = A →, G → T;
    c(S1) = c(A →) + c(G → T) = 2 + 3 = 5
  • S2 = A → T, G →;
    c(S2) = c(A → T) + c(G →) = 3 + 2 = 5
  • S3 = A →, G →, → T;
    c(S3) = c(A →) + c(G →) + c (→ T) = 2 + 2 + 2 = 6
  • S4 = A → C, G →, C →, → T;
    c(S4) = c(A → C) + c(G →) + c(C →) + c(→ T) = 3 + 2 + 2 + 2 = 9

Existen muchas otras secuencias que transforman x en y, pero ninguna de ellas tiene un coste menor que el de las secuencias S1 y S2. Para definir la distancia entre dos secuencias de ADN, usamos la secuencia de mutaciones de menor coste. Dada una función de coste c, la distancia de dc(x,y) de las secuencias de ADN x e y se define como

dc(x,y) := min{ c(S) | S transforma x en y }.

Por ejemplo, las secuencias S1 y S2 son las secuencias de mutaciones con mínimo coste que transforman x = AG en y = T. Por tanto, la distancia evolutiva dc(x,y) entre x e y es 5.

El cálculo de la distancia evolutiva entre dos secuencias de ADN es uno de los problemas que estudiaremos en esta asignatura.

 


Fuente: Algorithms Unplugged, B. Vöcking, H. Alt, M. Dietzfelbinger, R. Reischuk, C. Scheideler, H. Vollmer, D. Wagner (eds.), Springer, 2011.

Presentación
22 febrero 2012 por Javier Campos en Anuncios Comentarios desactivados

[Iremos publicando noticias. Para recibirlas, puedes añadir este enlace: "RSS de las entradas" en tu agregador de noticias o bien seguirnos en Twitter.]


 

Algoritmia básica es una asignatura obligatoria de la Especialidad en Computación del grado en Ingeniería Informática (Escuela de Ingeniería y Arquitectura, Universidad de Zaragoza).

La Especialidad de Computación consta de seis asignaturas obligatorias:

  • Algoritmia básica (6º semestre)
  • Procesadores de lenguajes (6º semestre)
  • Aprendizaje automático (6º semestre)
  • Algoritmia para problemas difíciles (7º semestre)
  • Recuperación de información (7º semestre)
  • Informática gráfica (7º semestre)

Y cuatro asignaturas optativas (a elegir dos, 8º semestre):

  • Bioinformática
  • Robótica
  • Videojuegos
  • Visión por computador

Los estudiantes de la primera promoción del grado en Ingeniería Informática deberán elegir especialidad al formalizar su matrícula en el curso 2012-13. Para facilitar esa decisión se recomienda:

  • Consultar el documento, accesible desde la web del grado, que informa sobre las cinco especialidades que se ofertan en la Escuela de Ingeniería y Arquitectura de Zaragoza.
  • Asistir a alguna de las dos presentaciones generales sobre los estudios de Ingeniería Informática y sus Especialidades el lunes 12 de Marzo a las 12 horas y a las 19 horas, respectivamente, en el Aula A03 del edificio Ada Byron.
  • Asistir a las presentaciones específicas de cada una de las cinco especialidades a lo largo del mes de mayo, concretamente, los lunes 7, 14 y 21 de mayo a las 12 horas. En ellas se incidirá tanto en los aspectos académicos de cada especialidad como en sus perspectivas profesionales.