domingo, 14 de diciembre de 2014

L-systems

Fractal plant for n = 6 (Wikipedia: ejemplo de sistema-L)


Los Sistemas-L o sistemas de Lindenmayer fueron originalmente desarrollados por el biólogo Aristid Lindenmayer en 1960 con la idea de describir las estructuras ramificadas de las plantas, células y otras formas de la naturaleza. Lindenmayer, en colaboración con Przemyslaw Prusinkiewicz1, consiguieron obtener un conjunto considerable de estructuras originales de vida artificial. A grandes rasgos, estos sistemas consisten en la generación repetida de una gramática semi-Thue basada en la jerarquía de Chomsky; aunque la gran diferencia con ésta última estriba en que todas las variables son reemplazadas en cada paso, no solo una. En este  sentido, una gramática L-system consiste en el reemplazamiento de reglas de producción sobre un conjunto de caracteres (alfabeto), comenzando por un símbolo inicial o axioma. Dichas reglas, aplicadas simultáneamente sobre un alfabeto, generan palabras complejas después de unas cuantas iteraciones. En épocas pasadas, estas frases complejas podían dibujarse en pantalla por medio del lenguaje LOGO, en el que una tortuga que obedecía a comandos gráficos trazaba líneas sobre un dispositivo de vídeo.

Formalmente una gramática de Lindenmayer se puede definir como:

  • Σ es un alfabeto finito
  • A ∈ Σ+ (axioma)
  • R = {(a, b, c) → d | a, c ∈ Σ*, b ∈ Σ, d ⊂ Σ*} 
  • Para cualquier (a, b, c) → d ∈ R, if |d| > 1 el sistema-L es estocastico, y si un a≠λ or c≠λ, el sistema-L es contextual
De aquí se deduce la tupla G = {Σ, A, R}, donde:
  • Σ es un alfabeto de caracteres finito
  • A es el axioma
  • R conjunto de reglas de producción
Un ejemplo de gramática L-system podría ser el del crecimiento de las algas:

Variables : A B
Constantes : ninguna
Axioma : A
Reglas : (A → AB), (B → A)
la cual produce las siguientes frases:
n=0 : A → AB
n=1 : AB → ABA
n=2 : ABA → ABAAB
n=3 : ABAAB → ABAABABA

Otra posibilidad es usar producciones estocásticas, donde la selección de una regla de producción dependiendo de ciertas probabilidades y variaciones estocásticas generan una gran irregularidad sobre la forma obtenida. Esta característica se puede conseguir gracias a las funciones random asociadas con números aleatorios y disponibles en muchas librerías matemáticas de programación.

Un ejemplo de esta gramática estocástica podría ser la siguiente:

\[ F =\begin{cases}
 \xrightarrow{0.95}  & F [+F] [<F] F [-F] F\\
\xrightarrow{0.05} &   \lambda
\end{cases} \]

donde se interpreta que:
  • F es dibujar hacia delante
  • f salto hacia delante sin dibujar
  • + giro a la izquierda de α°
  •  -  giro a la derecha en el mismo ángulo
  • < indica el giro de 30° exactos 
  • [ comienzo de ramificación
  • ] fin de ramificación
  • {0.95}  llamada de la regla el 95% de las veces
  • {0.05} llamada de la regla el 5% de las veces para podar (λ)
Una situación típica acaecida en la generación de sistemas-L surge cuando es necesario incluir información sensible al contexto para generar reglas de producción, debido principalmente a la detección de colisiones y compartición del espacio físico sobre el que dibujar. En concreto, para resolver estas situaciones se recurre a estructuras de datos que mantienen información relativa al control de producciones.

Un ejemplo clásico de sistema-L, muy acorde con esta época del año ;-), es el famoso copo de nieve de Koch:

Construcción del Copo de Koch
Copo de nieve de Koch (Wikipedia)



Que como sistema Lindenmayer tiene la siguiente estructura:

Alfabeto: F
Constantes: +, -
Axioma: F++F++F
Reglas de producción: F → F−F++F−F

Con el fin de ilustrar con más claridad las ideas aquí expuestas, proponemos la aplicación en línea http://www.kevs3d.co.uk/dev/lsystems/ para que usted mismo pueda ejercitarse en el diseño de estas bellas estructuras.


(1) P. Prusinkiewicz and A. Lindenmayer (1990) The Algorithmic Beauty of Plants, Springer-Verlag, New York.

Referencias:
  • http://www.jflap.org/tutorial/lsystem/index.html
  • http://en.wikipedia.org/wiki/L-system
  • Huw Jones (2001). Computer Graphics through key mathematics. Springer-Verlag.

miércoles, 12 de noviembre de 2014

Ética Informática


Brian Jepson (Creative Commons)

La ética como disciplina filosófica nace en la Antigua Grecia con los filósofos presocráticos y sobre todos con los sofistas, cuyas reflexiones versaban sobre el bien y el mal. Fue finalmente con Sócrates cuando se inicia esta rama de la filosofía, basándose en la forma de conseguir la felicidad por medio de la educación, el conocimiento y la virtud. Sin embargo, para su discípulo Platón, el sustento de la ética residía en la idea del bien, la cual formaba parte esencial de la realidad y emanaba a todos los aspectos de la persona (ética personal) y de la sociedad o polis (ética política). El conocimiento de esta realidad y el fomento de la virtud auspiciaban el sentido de la justicia, la verdad y la felicidad. Posteriormente, Aristóteles consideró en su tratado Ética nicomáquea que toda premisa del hombre es buscar la felicidad y para ello es necesario que éste cumpla la función que le corresponde: excelencia o virtud, que definía como la capacidad de pensar, o lo que es lo mismo, el ejercicio de razonar. El fin último de la vida es ser autosuficiente. El bien supremo del hombre deberá consistir en algún tipo de actividad donde pueda cumplir adecuadamente su función. Todos tenemos una misión que cumplir en la comunidad y nuestro deber moral es desempeñar nuestro papel en la polis. El estudio de la ética y la política lo llevó finalmente a descubrir el logos (la palabra, la razón), y de ahí a una de sus grandes aportaciones a la filosofía: la lógica.1

Los filósofos helenísticos estoicos basaron su ética en la vida en virtud y con moderación, mientras que los epicúreos lo fundamentaban en la búsqueda del placer (hedonismo).

En el siglo III d.C., en plena antigüedad tardía, San Agustín sentaría un precedente en la filosofía con sus teorías neoplatónicas que perdurarían durante toda la Edad Media.

No fue hasta la Baja Edad Media cuando los filósofos escolásticos como Guillermo de Ockham o Santo Tomás de Aquino basaron su ética en los principios cristianos unidos a la filosofía aristotélica. Para ello era necesario ejercitar las virtudes cardinales  (Prudencia, Justicia, Fortaleza y Templanza) y las virtudes teologales: Fe, Esperanza y Caridad. Así mismo, Santo Tomás armonizó el eterno debate entre Fe y Razón.

En el siglo XVII el filósofo Thomas Hobbes relacionó la ética con la política, mientras que para Spinoza estaría regida según el orden geométrico, ya que el hombre pertenece a la Naturaleza y por tanto sus acciones deben estar en concordancia con las leyes del Cosmos, es decir, las leyes de la Naturaleza, a las que el hombre se encuentra sometido y le impide ser completamente libre.

Durante los tiempos de la Ilustración la ética se basaría principalmente en el racionalismo laico y en la división de poderes (Montesquieu) y el Contrato Social (Rousseau). 

Emmanuel Kant fue el gran propulsor de la ética en la época moderna, al afirmar que su esencia se basaba en la moral del deber (deontología) y no se orientaba a buscar únicamente el interés o la felicidad, de modo que el bien moral se lograba por medio de la buena voluntad del ser humano. Por tanto, la moralidad de una acción no debe ser juzgada por sus consecuencias sino por su motivación ética1. Posteriormente, Schopenhauer postuló su ética en la voluntad y en la moral intuitiva, mientras que Kierkegaard centró su filosofía en la subjetividad y por tanto las decisiones éticas radicarían en el propio individuo.

En el siglo XIX destacaron las ideas de Karl Marx que a través del Manifiesto comunista expuso que, para alcanzar una sociedad justa, era necesaria la lucha de clases. Es la época del utilitarismo. Por su parte, para Nietzsche el concepto de moral es nefasto para la humanidad, contraponiendo el nihilismo a la ética. Superado el nihilismo el ser humano puede llegar a ser superhombre y prescindir de la moral y la religión 1.

La ética del siglo XX ha conocido grandes aportes basados en el vitalismo y el existencialismo (Jean-Paul Sartre) los cuales desarrollan el sentido de la opción y de la responsabilidad.

Los últimos movimiento ideológicos de la ética pertenecientes a finales del siglo XX y principios del XXI recaen en el pragmatismo, el republicanismo y el comunitarismo. Este último critica el liberalismo por considerar que las relaciones humanas únicamente deben estrecharse por interés y no por lazos culturales, sociales, históricos y de sangre. 

En el año 2011 el autor Stéphane Hessel publica el libro ¡Indignaos! donde apela a los jóvenes a comprometerse y reaccionar contra un mundo injusto, corrupto y dominado por los intereses especulativos de las altas esferas financieras. En España dio lugar al movimiento 15-M, más conocido como el de "Los indignados".


Ética vs. moral

La ética y la moral tienen puntos en común en sus definiciones etimológicas, así, moral proviene de la expresión latina moralis, que derivaba de mos y significaba costumbre, mientras que ética proviene del griego êthos (ἦθος) y significa estancia, lugar donde se habita. Aristóteles afinó el significado de la palabra griega: manera de ser, carácter. De esta definición se desprende que una persona puede moldear o forjar su forma de ser o carácter (êthos) mediante las virtudes.

La diferencia entre ambas estriba en que la moral se vive en el campo cultural, en las costumbres, en la religión y en las normas convencionales de conducta transmitidas de generación a generación; la ética es universal, no circunscrita a cultura concreta alguna, y se basa en la siguiente pregunta: ¿por qué debo hacer lo que debo?, es decir, consiste en reflexionar racionalmente sobre lo que está bien y lo que está mal y dejarse guiar por estos principios, sin presión externa alguna. En consecuencia, se trata de una moral sobre la moral o metamoral, de ahí que José Luis López Aranguren llama a la ética moral pensada y a la moral, moral vivida

Ética informática

El auge de las nuevas tecnologías presupone nuevos desafíos en la cuestiones anteriormente citadas y estudiadas a lo largo de la historia. Es por ello por lo que actualmente el concepto de "ética informática" responde a cuestiones como la seguridad, la privacidad, la propiedad intelectual, la pornografía infantil, el ciberterrorimo, etc. y las cuestiones relacionadas con la deontología profesional de ingeniero informático.

Con el fin de conocer mejor los fundamentos de esta rama de la filosofía, la alumna María José Carretero Gutiérrez  de la Universidad de Málaga ha editado un libro en HTML y JavaScript sobre esta materia, presentado de una manera elegante y muy didáctica:

(1) Libro Web sobre Ética Informática:

http://www.lcc.uma.es/~ppgg/PFC/etica/etica_informatica/portada.html (©)

DERECHOS de AUTOR: El copyright de todos estos programas pertenecen a el autor y director o directores de los mismos. Su utilización es libre pero queda totalmente prohibida su venta o comercialización. Su difusión debe siempre ir acompañada de este aviso legal de copyright. El código fuente (si se ofrece) puede ser modificado pero debe informarse al propietario del copyright de dichas modificaciones.

Otros libros y referencias del artículo:

Ética sin moral. Adela Cortina.

Ética y desarrollo profesional.  Lupe Bohorques.

La metafísica de las costumbres. Immanuel Kant.

Ética para náufragos. José Antonio Marina.

Ética de urgencia. Fernando Savater.

jueves, 1 de mayo de 2014

Isometric engine

Los videojuegos en perspectiva isométrica tuvieron su auge en la era de los años ochenta con títulos como "Knight Lore"1, "Head over Hells" o "La Abadía del Crimen". Con esta técnica se consiguió crear sensación de tridimensionalidad en plataformas 8-bits donde aún no era posible soportar complejos cálculos geométricos debido a su poca memoria y velocidad de procesador. En esta perspectiva, los ejes (x, y, z) guardan una relación equidistante de 120º, de ahí su denominación.

Hoy comenzamos la explicación de esta técnica de representación gráfica introduciendo los conceptos clave detallados en el tutorial de Juwal Bose en la Web de creadores multimedia de tuts+. En líneas generales, la construcción de un motor en perspectiva isométrica consiste básicamente en mantener una estructura de datos en forma de matriz donde almacenar los identificadores del tipo de objeto ("tile") en pantalla. Por ejemplo, si suponemos la siguiente pantalla de un nivel de un juego en dicha representación:

Pantalla de Spindizzy (emulado con CPCBox)

 y si consideramos los valores de 0 a 10 para los diferentes "tiles":
  • 0 Suelo
  • 1 Muro
  • 2,3 Rampa A
  • 4,5 Rampa B
  • 6 Diamante
  • 7 Flecha Norte
  • 8 Flecha Sur
  • 9 Flecha Oeste
  • 10 Flecha Este 
  • -1 Nada
Obtendríamos un array 2D para la pantalla anterior con la siguiente estructura:

Capa 1:
 [[1,1,1,4,5,1,1,1],
 [1,6,0,9,9,0,0,1],
 [1,0,0,0,0,0,0,1],
 [2,8,0,0,0,0,7,2],
 [3,8,0,0,0,0,7,3],
 [1,0,0,0,0,0,0,1],
 [1,0,0,0,10,0,0,1],
 [1,0,0,0,10,0,0,1]]
Capa 2:
 [[-1,-1,-1,-1,-1,-1,-1,6],
 [-1,-1,-1,-1,-1,-1,-1,-1],
 [-1,-1,-1,-1,-1,-1,-1,-1],
 [-1,-1,-1,-1,-1,-1,-1,-1],
 [-1,-1,-1,-1,-1,-1,-1,-1],
 [-1,-1,-1,-1,-1,-1,-1,-1],
 [-1,-1,-1,-1,-1,-1,-1,-1],
 [-1,-1,-1,-1,-1,-1,-1,-1]]
Podríamos representar una pantalla con la siguiente rutina:
for (i = 0 hasta total filas)
 for (j = 0 hasta total columnas)
  x = j * ancho tile 
  y = i * alto tile 
  tipoTile = levelData[i][j]
  posicionaTile(tipoTile, x, y)
Es posible localizar un punto cartesiano en la perspectiva isométrica mediante la función:

//Conversión de ejes cartesianos a isométrica:
isoX = cartX - cartY;
isoY = (cartX + cartY) / 2;
donde isoX e isoY son las coordenadas en perspectiva isométrica, mientras que cartX y cartY especifican las posiciones cartesianas en el plano 2D.

De forma similar se puede aplicar la transformación inversa:

// Conversión a ejes cartesianos
cartX = (2 * isoY + isoX) / 2;
cartY = (2 * isoY - isoX) / 2;

También es posible posicionar un objeto numerando la cuadrícula o grid de la pantalla con la posición (0,0) como eje de coordenadas, es decir, el centro de la pantalla estaría en (0,0).

GPL by Cburnett

De esta forma podemos posicionar un determinado objeto isométrico en el centro de su celda con la siguiente rutina:

screenX = (isoX - isoY) * mitadAncho;
screenY = (isoX + isoY) * mitadAlto; 
Aunque esta posición nos dará la esquina de la parte superior en coordenadas de pantalla. Para obtener las coordenadas centrales de la casilla será necesario sumar un offset:
 
screenX = ((isoX - isoY) * mitadAncho) + screenOrigenOffsetX;
screenY = ((isoX + isoY) * mitadAlto) + mitadAlto + screenOrigenOffsetY;
Finalmente para renderizar múltiples objetos en pantalla, es decir, todo el escenario, es preciso comenzar a dibujar desde atrás hacia delante (en orden de screenY) de la lista de objetos, pues de lo contrario podríamos tener algún efecto indeseable de overlapping.

Fuente:
(1) Véase Filmation.

jueves, 3 de abril de 2014

Redes de Hopfield

Las redes de Hopfield,  ―llamadas así en honor a su inventor John Hopfield―, son un tipo de red neuronal basadas en aprendizaje no supervisado de tipo hebbiano, es decir,  que a diferencia de las redes neuronales del tipo back-propagation feed-forward, no necesitan de un entrenamiento previo para especificar cuál es la respuesta correcta para un conjunto de patrones. 

En general, las redes de Hopfield recrean con más precisión el modelo natural del cerebro humano e imita en cierto modo la forma de procesar del  neocórtex, que parece almacenar los recuerdos usando una memoria asociativa. Por ejemplo, escuchar una canción de nuestra infancia puede evocar un recuerdo que permanece latente en nuestro inconsciente. Estos recuerdos pueden no estar muy claros o no ser muy exactos, de tal manera que, aunque permanezcan distorsionados, el cerebro tiende a recomponerlos. Es como si distinguiéramos a una persona a la que no hemos visto durante años por alguno de sus rasgos actuales.

Las redes de Hopfield tienen una gran aplicación para el reconocimiento óptico de caracteres (OCR) y para los captcha (sistemas que evitan que agentes software suplanten a humanos en formularios de registro Webs).

 
 ←
 (Hopfield)
Fuente:  Bashir Magomedov (CodeProject GPL3)

La arquitectura de las redes de hopfield se basa en una red monocapa con N neuronas cuyos valores de salida son binarios: 0/1 ó -1/+1. Se puede modelar una red de hopfield como un grafo no dirigido y completamente conectado, en donde cada nodo es una neurona sin una relación reflexiva y las aristas entre neuronas los pesos de entrada a cada una de ellas.

Las salidas (para un caso típico de implementación) se calculan como:

\[ a_i =\begin{cases}1 \hspace{1cm} si& \sum_j w_{ij}s_j > \phi_i \\-1 & \text{en otro caso}\end{cases} \]

y donde:
  • wij es el peso de la conexión de la neurona j con la i.  wii = 0  y wji = wij
  • sj es el estado de la neurona j. 
  • Φ es el umbral de activación de la neurona i.
de esta forma la función de activación se representa como:




Fuente: Wikipedia



Hopfield demostró que se podía definir una función de energía para cada posible patrón de activación o estado de la red: \[ Energía = -\frac12\sum_{i,j}{w_{ij}{s_i}{s_j}}+\sum_i{\theta_i\ s_i} \] donde este valor tiende a converger a un mínimo local para un estado estable de la red.

Para entender mejor los mecanismos matemáticos que hacen posible el reconocimiento de patrones con las redes de hopfield supongamos que tenemos los siguientes patrones de entrenamiento:
\[ A = \begin{bmatrix}1 & 0\\1 & 0 \end{bmatrix}  B = \begin{bmatrix}0 & 1\\0 & 1\end{bmatrix}   C = \begin{bmatrix}1 & 0\\0 & 1\end{bmatrix} \]
y queremos reconocer los siguientes patrones:
\[X= \begin{bmatrix}1 & 0\\0 & 1\end{bmatrix}   e   Y =\begin{bmatrix}0 & 1\\ 1 & 0\end{bmatrix}\]
  • En primer lugar obtenemos los vectores escalados en el rango +1/-1 que utilizando la fórmula (2A-1),(2B-1) y (2C-1) resultan: \[ A= (1,0,1,0)    B= (0,1,0,1)   C=(1,0,0,1) \\E_1 = (1,-1,1,-1)  \\E_2 = (-1,1,-1,1)   y   \\E_3 = (1,-1,-1,1) \]
  • En segundo lugar obtenemos los pesos: 
    • \[T_1 = \left[\begin{array}{rr} 1\\ -1\\ 1\\ -1\end{array}\right]\begin{bmatrix}1&-1&1&-1\end{bmatrix} - I=  \left[\begin{array}{rr}1&-1& 1 &-1\\-1& 1&-1& 1\\ 1&-1& 1&- 1 \\ -1 & 1& -1 & 1\end{array}\right]   -   I =\\ \left[\begin{array}{rr}0 & -1 & 1 & -1 \\ -1& 0 &-1 &1 \\ 1& -1 &0 &-1 \\ -1& 1 &-1& 0\end{array}\right]\]
    • \[T_2 = \left[\begin{array}{rr}-1 \\ 1 \\ -1 \\ 1\end{array}\right] \begin{bmatrix}-1&1&-1&1\end{bmatrix} - I=  \left[\begin{array}{rr}1& -1 & 1 & -1\\ -1 & 1 & -1 &1 \\ 1& -1& 1 &- 1 \\ -1 &1& -1 &1\end{array}\right]   -   I =\\ \left[\begin{array}{rr}0 & -1 & 1 & -1 \\ -1& 0 &-1 &1 \\ 1& -1 &0 &-1 \\ -1& 1 &-1& 0\end{array}\right]\]
    • \[T_3 = \left[\begin{array}{rr}1 \\ -1 \\ -1 \\ 1\end{array}\right] \begin{bmatrix}1&-1&-1&1\end{bmatrix} - I=  \left[\begin{array}{rr}1 & -1 & -1 & 1 \\ -1 & 1 & 1 &-1 \\ -1& 1& 1 &- 1 \\ 1 &-1& -1 &1\end{array}\right]   -   I =\\ \left[\begin{array}{rr}0 & -1 & -1 & 1 \\ -1& 0 &1 &-1 \\ -1& 1 &0 &-1 \\ 1& -1 &-1& 0\end{array}\right]\] 
  • A continuación se calcula la matriz general de pesos: \[T = T_1 + T_2 + T_3 = \left[\begin{array}{rr}0 & -3 & 1 & -1 \\ -3 & 0 & -1 &1 \\ 1& -1& 0 &- 3 \\ -1 &1& -3 &0\end{array}\right]  \] 
  • En el caso del patrón X se procede a escalarlo en valores -1/+1 : \[ E_3 = (1,-1,-1,1)\], y, determinando \[S = E_3\], es decir, \[ S_1 = 1; S_2 = -1; S_3 = -1 y  S_4 = 1 \] 
    • Primeramente obtenemos la energía: \[Energía = -\frac{1}{2} \sum_{i=1}^{N} \sum_{j=1}^{N}T_{ij}S_iS_j = -\frac{1}{2}(0+3-1-1\\+3+0-1-1-1-1+0+3-1-1+3+0) = -2 \] 
    • Y aplicando el algoritmo iterativo...
    •  Iteración 1:
      • \[ S = E_3T = \begin{bmatrix}1 & -1 & -1 & 1\end{bmatrix} \left[\begin{array}{rr}0 & -3 & 1 & -1 \\ -3 & 0 & -1 & 1 \\ 1 & -1 & 0 & -3 \\ -1 & 1 & -3 & 0\end{array}\right] = \\ \begin{bmatrix}1 & -1 & -1 & 1\end{bmatrix} \]
      • La salida resulta ser la misma que la entrada así como la energía, por lo que el patrón queda reconocido al 100%. 
  • En el caso del patrón Y sabemos que \[ E = (-1,1,1,-1) \]
  • El proceso se sintetiza entonces aplicando el algoritmmo iterativo:
    • Iteración 1:
      • \[ S = ET = \begin{bmatrix}-1 &1 & 1& -1\end{bmatrix}\left[\begin{array}{rr}0 & -3 & 1 & -1 \\ -3 & 0 & -1 & 1 \\ 1 & -1 & 0 & -3 \\ -1 & 1 & -3 & 0\end{array}\right] = \\ \begin{bmatrix}-1 & 1 & 1 & -1\end{bmatrix}\]
      • Obteniéndose en este caso de nuevo la convergencia en la primera iteración, por lo que queda también reconocido al 100%
--------

Fuentes:
(1) Gonzalo Pajares Martinsanz, Jesús M. de la Cruz García. Ejercicios resueltos de Visión por Computador. Editorial Ra-ma 2007.
(2) A. García Serrano. Inteligencia Artificial. Editorial RC 2012.

viernes, 14 de marzo de 2014

Planificación automática

Fuente: Dana S. Nau - University of Maryland (CC-BY-NC-SA)

La planificación automática es una disciplina de la Inteligencia Artificial que nos permite resolver problemas complejos mediante ordenador, sin el cual se tardaría una cantidad ingente de tiempo en obtener una solución. 
Los planificadores actuales permiten diseñar estrategias para un conjunto extenso de dominios como son:

  • Diseño de planes de negocio en empresas.
  • Diseño de estrategias de defensa del cliente en despachos de abogados.
  • Organización de espacios habitables y seguros en arquitectura.
  • Mejora de la conectividad en redes de comunicaciones.
  • Planes estratégicos militares.
  • Logística de transportes en el comercio.
  • Inteligencia artificial en robots.
  • etc.

Los planificadores clásicos están basados en algoritmos de búsqueda heurística (A*, Alfa-beta o Greedy) como por ejemplo STRIPS (STanford Research Institute Problem Solver [Fikes y Nilsson 1971]) en el que se aplica un algoritmo de búsqueda lineal, mientras que los planificadores neoclásicos como graphplan aplican restricciones y optimizaciones en cada estado antes de avanzar al siguiente. Esto hace que su estructura tenga forma de grafo de planes en vez de árbol o grafo acíclico.
Imagen de Graphplan

Otros tipos de planificadores están basados en técnicas más avanzadas como los probabilísticos, los de redes de tareas jerárquicas, los de planificación heurística (HSP y FF)  o los temporales (scheduling).

En general, un problema de planificación dado en lenguajes como STRIPS o PDDL debe contener la siguiente información:
  • Un estado inicial.
  • Un estado final o estados meta.
  • Un conjunto de acciones: precondiciones y postcondiciones.
Así, por ejemplo, para resolver el problema del granjero que debe cruzar un río llevando únicamente en la barca una cabra, una col o un lobo sin que se coman entre ellos al quedarse en la orilla, se formularía de la siguiente manera en formalismo STRIPS:

Estado inicial:  barcaen(a)
                 colocado(lobo,a)
                 colocado(cabra,a)
                 colocado(col,a)
                 vacío

Estado final:

                 colocado(col,b)
                 colocado(lobo,b)
                 colocado(cabra,b)

Acciones:        

mover(inicio,fin):

            pre: embarcado(cabra) ∨
            (colocado(col,inicio) ∧ colocado (cabra,fin)) 

           
            (colocado(cabra,inicio) ∧ colocado(lobo,fin))
                                 
            post:  barcaen(fin) ∧
                  ¬barcaen(inicio)
                                       

embarcar(posicion,animal):
           pre: barcaen(posicion) ∧ 

           colocado(animal, posicion) ∧ (vacio)
           post:   embarcado(animal) ∧
                   ¬colocado(animal,posicion) ∧
                   ¬(vacío)                        
                          
desembarcar(posicion,animal):
            pre: barcaen(posicion) ∧ embarcado(animal)      
            post: colocado(animal,posicion) ∧
                  vacío ∧  ¬embarcado(animal) 


Si ejecutamos el programa en un planificador como SGP, obtendremos el siguiente resultado:

Levels 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
(((EMBARCAR A CABRA)) ((MOVER A B)) ((DESEMBARCAR B CABRA)) ((MOVER B A))((EMBARCAR A LOBO)) ((MOVER A B)) ((DESEMBARCAR B LOBO)) ((EMBARCAR B CABRA))((MOVER B A)) ((DESEMBARCAR A CABRA)) ((EMBARCAR A COL)) ((MOVER A B)) ((DESEMBARCAR B COL)) ((MOVER B A)) ((EMBARCAR A CABRA)) ((MOVER A B))((DESEMBARCAR B CABRA)))

Problema del cruce del río. Videojuego. (http://layton.wikia.com/wiki/Puzzle:Over_the_River)

miércoles, 26 de febrero de 2014

La buena mesa a la Universidad


Fuente: Fundación Dieta Mediterránea

 "La bebida apaga la sed, la comida satisface el hambre; pero el oro no apaga jamás la avaricia. "

Plutarco (d.C. 46-50 - d.C.120), historiador y ensayista griego.

 
Según un estudio de «Hábitos alimentarios y estilos de vida de los universitarios españoles. Patrón de consumo de bebidas fermentadas» la mayoría de los estudiantes sigue una alimentación «aún aparentemente sana»; aunque hay un cierto sesgo hacia una carencia de alimentación variada en lo que respecta a vitaminas y elementos nutricionales básicos (hierro, magnesio, potasio, vitamina A, D y E, así como Cinc y ácido fólico). En este aspecto es relevante el escaso consumo de verduras y cereales en un porcentaje alto de universitarios españoles, lo que implica un desarraigo de la Dieta Mediterránea en un país que siempre ha estado a la cabeza en este tipo de alimentación.

En general, el estudio realizado a una población de veintiuna universidades por la Fundación Española de Nutrición (FEN) y presentado recientemente en Granada, revela una dieta normal en universitarios, con un déficit de nutricional en alimentos base de la pirámide de la dieta sana; pero también pone de relieve que los estudiantes que ingieren moderadamente cerveza (media de medio vaso al día) tienden a un consumo habitual de alimentos saludables.

A modo de conclusión, los estudiantes de la UNED, que generalmente superan la media de 30 años, deben llevar una vida equilibrada: evitar el estrés y la vida sedentaria, realizar ejercicio, caminar o practicar deporte frecuentemente, consumir hidratos de carbono y fruta fresca para conseguir un rendimiento intelectual óptimo. Aunque la vida social se pierde en la mayoría de carreras de la UNED (especialmente ingenierías y ciencias) es saludable frecuentar el contacto con las amistades y la familia al menos una vez por semana. También es recomendable viajar, caminar o hacer senderismo para superar episodios de depresión y estrés. Por último, las actividades culturales como el teatro, el cine y la lectura con base filosófica, pueden ayudar a complementar y equilibrar nuestro alimento intelectual en el cambiante mundo del conocimiento.

Fuentes:



sábado, 15 de febrero de 2014

Complex networks

Dolphin network of Lusseau - Copyright © 2014 National Academy of Sciences.

Quedan lejos las teorías que se fundamentan en el análisis y comprensión del funcionamiento de las cosas a partir del estudio de sus partes individuales como entes aislados. Mientras escribo en este blog, una tormenta de negociaciones económicas y sociales entre agentes se debaten en las redes digitales de comunicación. La idea de la "aldea global" propuesta por McLuhan (1962) es hoy una realidad con el fenómeno de la globalización. Los individuos se organizan en complejas estructuras virtuales en Internet y los fenómenos culturales atraviesan el orbe en milésimas de segundo. El estudio de las teorías que explican el mundo y el entorno vital como completamente conectado son clave para comprender su impacto global en la biosfera y la hipótesis de Gaia. 

A este respecto, el libro presentado por el científico Ricard Solé:  "Redes complejas: del genoma a Internet" de la editorial Tusquets, plantea cuestiones tan relevantes como la propagación de virus biológicos y digitales en una sociedad cada vez más relacionada, el desciframiento del genoma humano a partir de la idea de un todo relacionado, la evolución de los ecosistemas y las especies, el efecto de la globalización en la biosfera y la economía, el cuerpo humano y el cerebro como red compleja de análisis de información simbólica.

Hagmann P, Cammoun L, Gigandet X, Meuli R, Honey CJ, Wedeen VJ, Sporns O (2008) Mapping the structural core of human cerebral cortex. PLoS Biology Vol. 6, No. 7, e159 (CC-BY)

La obra de Ricard Solé profundiza en el estudio de estas redes y pone de manifiesto una nueva cartografía de la complejidad. A partir del estudio del mapa de Internet, del cerebro o el genoma se han descubierto propiedades universales que subyacen en todas las redes complejas naturales y artificiales. Esto permitirá indagar, en futuras investigaciones, en el misterioso origen de estas intrincadas estructuras.

Nuestra visión del mundo cambia constantemente por el efecto de estas complejas redes artificiales y naturales, en la que nadie está realmente lejos de nadie. En definitiva, la historia de la ciencia atraviesa un hito que podría considerarse como la transición de la investigación de lo individual a lo interrelacionado. En el caso de la informática, el estudio de los sistemas ya no se basa generalmente en las partes de la arquitectura Von Neumann, sino que se tiende a la computación en sistemas cada vez más distribuidos y paralelos. 

   Mapa internacional de cables submarinos de fibra (Creative commons)


viernes, 10 de enero de 2014

La lógica en práctica

Portada 
Fuente:  Editorial Tecnos

El libro que proponemos hoy en esta entrada pretende servir de aplicación práctica a los conocimientos adquiridos en las asignaturas de Lógica de primer curso y Lógica Computacional de cuarto curso. Esta obra le servirá para introducirse en el mundo de la deducción lógica de teoremas, proposiciones y argumentos filosóficos. Su aplicación práctica le será útil para afirmar o refutar lógicamente hechos basados en la vida cotidiana. Además, su praxis en el campo de la programación facilita en gran medida la corrección y verificación de los programas informáticos. 

Este ameno y pedagógico libro incluye un extenso número de ejercicios resueltos de lógica basados en casos reales: fragmentos de textos y conversaciones, que le ayudarán a utilizar intuitivamente la lógica de forma práctica.

Dónde conseguirlo:
http://www.tecnos.es/ficha.php?id=1680107&id_clase=9160

viernes, 3 de enero de 2014

Software médico

Fuente: Wikipedia

“El conocimiento de cualquier cosa, dado que todas las cosas tienen causas, no es adquirido o completo a menos que sea conocido por sus causas.” 

Avicena (x - xi d.C.), médico, filósofo, científico y polímata persa.


Desde el desarrollo en los años 70 del sistema Mycin en la Universidad de Stanford, la aplicación de la informática al campo de la medicina ha ido progresando considerablemente. En sus comienzos, el sistema Mycin consistía en un interfaz de usuario textual donde se interpelaba al médico con preguntas formuladas por un sistema experto programado en Lisp. El proceso consistía en generar, a partir de una base de reglas, una base de hechos y un motor de inferencia, un diagnóstico eficaz de enfermedades infecciosas de la sangre y su correspondiente tratamiento personalizado.

Actualmente, algunos médicos siguen utilizando este potente sistema experto como asistente de sus diagnósticos. Pero lo verdaderamente sorprendente es el avance y la sinergia de la informática y medicina. Como botón de muestra, en nuestro país, decenas de hospitales públicos y privados cuentan con sistemas altamente informatizados de gestión de pacientes, que incluyen generalmente una base de datos con el historial y acceso a imágenes diagnósticas y pruebas médicas.

Asimismo, la aplicación de asistentes software y robots en los quirófanos es una práctica muy habitual en nuestros días. Por ejemplo, en las intervenciones de neurocirugía se utiliza un navegador para identificar lesiones en el cerebro:


En lo que respecta al diagnóstico por imagen generado tanto por Rayos-X como TAC, existe una gran cantidad de software de análisis digital por computador basado en algoritmos de segmentación matemáticos y descripción a través de modelos conexionistas que permiten identificar mejor las lesiones.

La aplicación de la informática en la investigación puntera no es un asunto despreciable, pues el descifrado del mapa del genoma humano ha sido posible, entre otros, gracias al software desarrollado por el Instituto Municipal de Investigaciones Médicas de Barcelona (IMIM):

Mapa del genoma por la aplicación gff2ps / Fuente: http://www.bioinformatics.org/wiki

Finalmente, y si está interesado en el estudio de herramientas software para el tratamiento de enfermedades, puede consultar el repositorio de aplicaciones para resonancia magnética de la Unidad de RM de la Universidad de Santiago de Compostela:


En lo que respecta al software libre y GNU, también existen diferentes soluciones de código abierto y gratuitas que pueden ser útiles en diferentes diagnósticos: