Heurística es la capacidad de un sistema para realizar de forma inmediata innovaciones positivas para sus fines. La capacidad heurística es un rasgo característico de los humanos, desde cuyo punto de vista puede describirse como el arte y la ciencia del descubrimiento y de la invención o de resolver problemas mediante la creatividad y el pensamiento lateral o pensamiento divergente. La palabra heurística procede del término griego , 1 que significa «hallar, inventar» (etimología que comparte con eureka 2 ). La palabra heurística aparece en más de una categoría gramatical. Cuando se usa como sustantivo, identifica el arte o la ciencia del descubrimiento, una disciplina susceptible de ser investigada formalmente. Cuando aparece como adjetivo, se refiere a cosas más concretas, como estrategias heurísticas, reglas heurísticas o silogismos y conclusiones heurísticas. Claro está que estos dos usos están íntimamente relacionados ya que la heurística usualmente propone estrategias heurísticas que guían el descubrimiento. La popularización del concepto se debe al matemático George Pólya, con su libro Cómo resolverlo (Howtosolveit). Habiendo estudiado tantas pruebas matemáticas desde su juventud, quería saber cómo los matemáticos llegan a ellas. El libro contiene la clase de recetas heurísticas que trataba de enseñar a sus alumnos de matemáticas. Cuatro ejemplos extraídos de él ilustran el concepto mejor que ninguna definición: y
Si no consigues entender un problema, dibuja un esquema.
y
Si no encuentras la solución, haz como si ya la tuvieras y mira qué puedes deducir de ella (razonando a la inversa).
y
Si el problema es abstracto, prueba a examinar un ejemplo concreto.
y
Intenta abordar primero un problema más general (es la ³paradoja del inventor´: el propósito más ambicioso es el que tiene más posibilidades de éxito).
Si consultas un diccionario mas o menos voluminoso, encontraras que el término heurístico: y
Es el arte de inventar
y
Es la parte de la historia que se ocupa de le búsqueda e investigación de fuentes, especialmente documentos.
y
Etc.
Bueno como te expongo en los siguientes renglones, verificarás que algo de estos criterios se aplican en la conceptualización global del paradigma heurístico. Aunque, para nosotros los sistémicos el concepto inicial de la palabra heurística, conviene que lo interpretes como una especie de algorítmo inteligente de búsqueda. El paradigma heurístico nace como necesidad de encontrar programas de capaces de resolver los típicos problemas de búsqueda de la mejor solución cuando las alternativas son numerosas, tales como: y
Cuál es el mejor medio para transportar, desde diversos orígenes hacia diferentes destinos..??
y
Determinar los mejores postulantes para asignarles determinadas tareas entre varias posibles.
y
Detectar dentro de las múltiples posibilidades, todos los posibles casos de cierta característica.
Para resolver este tipo de planteos se recurre a la Programación Heurística asociada a la INTELIGENCIA ARTIFICIAL, que es la rama de la ciencia que, simulando la operativa de su razonamiento intenta emular en el ordenador los procesos mentales inteligentes del hombre.
Con tal fin, es necesario aplicar HUEURISTICAS, que son elementos operativos que resultan de agregarles conocimiento a los métodos de búsqueda para hacerlos más eficientes. EJEMPLOS: y
Utilizando solo dos cubos sin marcas, uno de 6 litros y otro para 8 litros de capacidad; llenar un cubo con cuatro litros de agua.
y
Determinar la mejor asignación de 50 puestos de trabajo, con cada uno de los 30 operarios de una empresa.
A priori podemos ver que no existe ningún procedimiento o algoritmo matemático que capaz de resuelver estos problemas, por ello será necesario probar diversas alternativas de acciones hasta hallar la solución óptima, dentro de todas las combinaciones posibles y cuya evaluación puede requerir largos lapsos de tiempo. Para explorar tales combinaciones, la Inteligencia Artificial desarrolló técnicas como la búsqueda en profundidad, en amplitud, etc. de manera que algunos problemas pueden tratarse con métodos de búsqueda convencionales. Para restringir restringir la búsqueda a solo un subconjunto de combinaciones posibles, conviene podar los caminos superfluos, aplicando heurísticas del tipo atajos dependientes del problema a tratar que la búsqueda insuma menor tiempo. El éxito de una heurística dependerá de su calidad, pues en tarea de minimizar el tiempo de respuesta, puede ocurrir que determinadas heurísticas aplicadas no sean eficientes, que no lleven la solución del problema, por haber desechado caminos potencialmente válidos y por evaluar alternativas inútiles. Por todo lo anterior, podemos deducir que en este paradigma, promueve aquel tipo de programación que aplica para la resolución de problemas reglas de buena lógica o heurísticas, proporcionando entre varios cursos de acción uno que presenta características de ser el más eficiente, pero que aún así, no garantiza necesariamente la solución cierta.
La Programación Heurística implica la aplicación del conocimiento específico integral de la naturaleza del problema a resolver, que comprende además de su operatoria, la manera cómo se genera y que efectos produce. Solo así podrá minimizarse el tiempo de búsqueda de las alternativas más eficaces. Ahora bien, si una búsqueda heurística exhaustiva maximiza la posibilidad de alcanzar la solución óptima del problema, es necesario prever que el insumo de tiempo de esta tarea, puede ser demasiado extenso, con guarismos en años que superan una vida y aún así queda la posibilidad de no arribar a una solución final. Las creaciones heurísticas por ser reglas de sentido común, pueden codificarse en cualquier lenguaje de programación, por ello el paradigma heurístico al contrario que otros, no deviene en un lenguaje de programación específico. Aunque sus conceptos están soportados en entornos de Inteligencia Artificial como KC, KEE o ART y encuentran su mayor campo de aplicación dentro de esta disciplina. En la siguiente nómina que es incompleta, la idea es solo proporcionar formatos de problemas donde la programación heurística puede dar mejores resultados que la programación clásica. y
Cuando exista un problema sin solución algorítmica, o cuando la cantidad de alternativas de solución sea muy importante.-
y
Cuando exista más de una solución válida para un problema dado, donde la calidad de estas soluciones sea medida en términos de tiempo de respuesta del sistema.
y
Cuando exista la alternativa de minimizar las opciones tratadas como algoritmo clásico, dotándolo de un subconjunto potencialmente destacado entre todas las alternativas posibles.
Además de la Inteligencia Artificial la INGENIERIA DEL CONOCIMIENTO, también se apoya puntual y genéricamente del paradigma heurístico, porque utiliza sus conceptos de forma instrumental cuando resuelve los problemas de naturaleza completa no algorítmica.
En rigor, la programación heurística más que un modo de programación, es un método de guía para búscar soluciones a problemas computacionalmente complejos y aunque su ingente cantidad de alternativas factibles no aseguran el encontrar una solución óptima, sino solo una adecuada a determinadas circunstancias.
PROGRAMACION HEURÍSTICA La Programación Heurística es el tipo de programación computarizada que resuelve problemas, aplicando reglas de buena lógica, denominadas heurísticas, que proporcionan entre varias alternativas de acción, la más optimista a pesar de no garantizar necesariamente la más efectiva. La Programación Heurística constituye una forma de modelizar la representación de la estructura, estrategias de búsqueda y métodos de resolución de problemas. La Programación Heurística es aplicada frecuentemente en el campo de la Inteligencia Artificial, especialmente en la Ingeniería del Conocimiento, dado que el hombre opera generalmente aplicando heurísticas, que constituyen conclusiones del razonamiento humano sobre un tema específico, apoyado en la experiencia, utilizando reglas de buena lógica. La programación heurística permite procesar.. ... por computadora los siguientes tipos de problemas: y
a) ¿Cuál es el mejor camino?
y
b) Listar todos los casos posibles.
y
c) ¿Existe una asignación de elementos que satisfaga ?.
El común denominador de estos problemas es la necesidad de buscar exhaustivamente entre las posibles, un conjunto finito de alternativas, cuya
cantidad de elementos esté controlada, de manera de evitar un crecimiento exponencial del espacio de búsqueda, que sería imposible de procesar. El algoritmo heurístico Usa procedimientos de búsqueda de soluciones casi óptimas a razonables costos operativos, sin garantizar la optimización de las soluciones generadas ni determinar la distancia a la solución óptima. Así, el Paradigma Heurístico definirá modelos de resolución de problemas que incorporan alguna componente basada en: y
a.- Apropiada representación de la estructura para resolver el problema con técnicas heurísticas.
y
b.- Uso de métodos de resolución de problemas aplicando funciones de evaluación con procedimientos específicos de búsqueda heurística para alcanzar las metas.
Programación Heurística se presenta Como: a. Técnica de búsqueda para obtener metas en problemas no algorítmicos, o con algoritmos que generan como en el caso del juego damas ó ajedrez, múltiples alternativas de acción. b. Método aproximado de resolución de problemas usando funciones de evaluación heurísticas. c. Método de poda para estrategias de programas que juegan. Conviene aplicar Programación Heurística, cuando . . I.
Existen datos limitados e inexactos, que serán usados para estimar parámetros, de modo que pueden contener errores superiores a los proporcionados con la solución de una buena heurística.
II.
El modelo se simplifica, hasta transformarla en una representación teórica y aproximada del problema real, de manera que la solución óptima lograda solo tendrá valor de referencia académica.
III.
No existe un método exacto confiable para ser aplicado al modelo del problema; y si existe, no es procesable en computadora.
IV.
Se quiere optimizar el algoritmo, dotándole buenas soluciones de inicio, guiando la búsqueda y reduciendo el número de soluciones posibles, aplicadas al modelo.
V.
Frecuentemente se debe resolver el mismo problema y el tratamiento heurístico significa un ahorro operativo.
VI.
Si puede generar resultados superiores a los del modelo actual.
Especificaciones del tratamiento heurístico Las principales especificaciones del tratamiento heurístico tienen en cuenta sus características de información y de las especificaciones del problema, destacando los siguientes aspectos: a. Heurística simple, de consumo razonable de memoria, con velocidad de búsqueda sin saltos exponenciales de alternativas, precisa, robusta, que proporcione soluciones múltiples, y provista de buen criterio de parada que incorpore el conocimiento obtenido durante la búsqueda. b. La información a tratar es simbólica, inexacta o limitada, incremental y basada en el conocimiento. c. Las especificaciones del problema pueden ser de optimización o de satisfacción; que generan una o múltiples soluciones; con tratamiento en tiempo real o no; con decisión interactiva o no. d. Las heurísticas como reglas de sentido común, pueden codificarse con cualquiera de los lenguajes de programación, pues la programación heurística no ha producido su propio lenguaje específico. Si hubiera un lenguaje heurístico
Si definiéramos un lenguaje heurístico, dado que la programación heurística aplicada al campo de la I.A, y que posee heurísticas diseñadas con herramientas de esta área, sus características más destacables serían: I.
Sería un lenguaje conversacional, que permitiera la interacción directa con el programador para la definición y procesamiento del problema.
II.
Tratamiento de estructuras crecientes, con programas que vayan ampliando el volumen de conocimiento, que en base a la experiencia configure el modelo heurístico.
III.
Tratamiento simbólico, para ser compatibles con problemas que precisan tratamiento heurístico y que tienen estructura simbólica.
IV.
Autonomía de sus funciones para modelar la heurística y su mecanismo de ejecución, definiendo módulos independientes.
V.
Estructuras de datos para describir estados de problemas y relaciones entre estados.
VI.
Estructuras de procedimientos de control y proceso para ejecutar coherentemente el modelo heurístico, y permitir lograr y utilizar el conocimiento adquirido en el proceso de resolución del problema.
EJEMPLO Se desea optimizar la provisión de la caña de azúcar, usada como materia prima en los ingenios azucareros. En este problema, entre muchos otros, intervienen como factores de decisión aspectos, como la distancia y estado de los caminos que unen los cargaderos de caña con los ingenios; el costo unitario del medio de transporte; el precio de venta de la caña de cada proveedor; el precio de compra que paga cada ingenio, etc. La cantidad de alternativas de solución a evaluar serían:
1 alternativa para 1 ingenio y 1 cargadero 2 alternativas para 2 ingenios y 2 cargaderos
6 alternativas para 3 ingenios y 3 cargaderos 24 alternativas para 4 ingenios y 4 cargaderos 120 alternativas para 5 ingenios y 5 cargaderos 720 alternativas para 6 ingenios y 6 cargaderos Y si la cantidad correspondiera a la Provincia de Tucumán que tiene 14 ingenios azucareros, la cantidad, suponiendo solo 14 cargaderos sería el factorial de 14, que es un número demasiado grande..!!! que prácticamente no podríamos evaluar uno a uno. En la realidad el problema se agrava, porque la provincia tiene cientos de cargaderos y si no contamos con una buena heurística estamos fritos..!!!, pero por suerte podemos probar con alguno de los algoritmos heurísticos siguientes: A. Recocido simulado B. Búsqueda Tabú C. Algoritmos evolutivos: a. Algoritmos Genéticos b. Programación evolutiva c. Estrategias evolutivas d. Programación genética D. Redes Neuronales Artificiales E. Relajación lagrangiana CARACTERISTICAS del PARADIGMA HEURISTICO Como se ha señalado inicialmente, un paradigma de programación es un modelo básico de diseño e implementación de programas. Un modelo que permite producir programas de acuerdo con una metodología específica. Así, el paradigma de programación estructurada se basa en estructuras modulares, con fuerte cohesión en el módulo y bajo acoplamiento entre ellos, desarrollo "top-down", utilización de diagramas privilegiados, etc.
El Paradigma Heurístico define, pues, un modelo de resolución de problemas en el que se incorpora alguna componente heurística sobre la base de: y
Una representación más apropiada de la estructura del problema para su resolución con técnicas heurísticas
y
La utilización de métodos de resolución de problemas aplicando funciones de evaluación con procedimientos específicos de búsqueda heurística para la consecución de las metas.
PROGRAMACION HEURISTICA Se puede definir como "aquel tipo de programación computacional que aplica para la
resolución
de
problemas
reglas
de
buena
lógica
(reglas
del
pulgar),denominadas heurísticas, las cuales proporcionan entre varios cursos de acción uno que presenta visos de ser el más prometedor, pero no garantiza necesariamente el curso de acción más efectivo." Muchas de las más interesantes y difíciles tareas de programación implican utilizar el ordenador para resolver problemas del tipo: "¿Cuál es el camino más corto ?" "Listar todos los casos posibles ", "¿Existe una disposición de elementos que satisfaga ?. Las características de tales problemas implica potencialmente una búsqueda exhaustiva de todas las posibles combinaciones de algún conjunto finito, que si no está controlado puede producir una "explosión combinatoria" (incremento exponencial del espacio de búsqueda con la dimensión del problema) imposible de tratar. La Programación Heurística ha venido a significar el uso del conocimiento específico del dominio para cubrir esta explosión de posibilidades guiando la búsqueda por las direcciones más prometedoras. La Programación Heurística implica una forma de modelizar el problema en lo que respecta a la representación de su estructura, estrategias de búsqueda y métodos de resolución, que configuran el Paradigma Heurístico.
Este tipo de programación se aplica con mayor intensidad en el campo de la Inteligencia Artificial (I.A.), y en especial, en el de la Ingeniería del Conocimiento, dado que el ser humano opera la mayor parte de las veces utilizando heurísticas, un hecho cierto que una heurística es la conclusión del razonamiento humano en un dominio específico, por lo que es normal que este tipo de programación que encuadrado en el área de la I.A, ya que implementa el conocimiento humano, dado por la experiencia, utilizando reglas de buena lógica. Por otra parte, la Programación Heurística se presenta y utiliza desde diferentes puntos de vista: y
Como técnica de búsqueda para la obtención de metas en problemas no algorítmicos, o con algoritmos que generan explosión combinatoria (ej. damas. ajedrez, etc.)
y
Como un método aproximado de resolución de problemas utilizando funciones de evaluación de tipo heurístico (ej. algoritmos A*, AO*)
y
Como método de poda para estrategias de programas que juegan, aunque estos métodos no son realmente heurísticos (ej. poda alfa-beta).
En general, un modelo heurístico es aconsejable si puede proporcionar resultados superiores a los del modelo actual. Un paradigma que corresponde a los lenguajes de cuarta generación es la inteligencia artificial, que se ha resuelto con lenguajes de programación como PROLOG y LISP; el primero, desarrollado en 1956-1962 por J. McArthy y el segundo por A. Colmerauer en 1972, para el desarrollo de inteligencia artificial, que corresponden ambos a la definición de lenguajes funcionales o aplicativos. Ejemplo: Problema de las jarras de agua: Se tienen dos jarras de agua, una de 4l y otra de 3l sin escala de medición. Se desea tener 2l de agua en la jarra de 4l. Las siguientes operaciones son válidas: llenar las jarras, tirar agua de las jarras, pasar agua de una jarra a otra.
Solución: y
El espacio de estados se define como { (X,Y)/ X son los litros en la jarra de 4l con 0<=X<=4 AND Y son los litros de la jarra de 3l con 0<=Y<=3 }
y
El estado inicial es (0,0)
y
El estado final es (2,0). El estado final podría ser (2,N) en caso de que no importen los litros de la segunda jarra.
y
Las reglas que se pueden aplicar son: o
1- Llenar la jarra de 4l: Si (X,Y) AND X<4 => (4,Y)
o
2- Llenar la jarra de 3l: Si (X,Y) AND Y<3 => (X,3)
o
3- Vaciar la jarra de 4l: Si (X,Y) AND X>0 => (0, Y)
o
4- Vaciar la jarra de 3l: Si (X,Y) AND Y>0 => (X, 0)
o
5- Pasar agua de la jarra de 4l a la jarra de 3l hasta llenarla: Si (X,Y) AND X>0 AND X+Y>=3 => (X-(3-Y),3)
o
6- Pasar agua de la jarra de 3l a la jarra de 4l hasta llenarla: Si (X,Y) AND Y>0 AND X+Y>=4 => (4, Y-(4-X))
o
7- Pasar toda el agua de la jarra de 4l a la jarra de 3l: Si (X,Y) AND X>0 AND X+Y<3 => (0,X+Y)
o
8- Pasar toda el agua de la jarra de 3l a la jarra de 4l: Si (X,Y) AND Y>0 AND X+Y<4 => (X+Y,0)
El programa debería encontrar un pasaje de estados para ir del estado (0,0) al estado (2,0). Puede existir más de un pasaje de estados hacia la solución, por ejemplo: (0,0) => (0,3) => (3,0) => (3,3) => (4,2) => (0,2) => (2,0) en la cual, a partir del estado inicial, se aplicaron las reglas 2, 8, 2, 6, 3 y 8, hasta conseguir el estado objetivo. Otro pasaje de estados hacia la solución es la siguiente (0,0) => (4,0) => (1,3) => (1,0) => (0,1) => (4,1) => (2,3) => (2,0)
en la cual se aplicaron las reglas 1, 5, 4, 7, 1, 5 y 4 Con respecto a las reglas se puede concluir que: y
Las condiciones que se establecen en la parte izquierda a veces no son altamente necesarias pero restringen la aplicación de la regla a estados más adecuados. Esto incrementa la eficiencia del programa que utiliza las reglas. En el ejemplo anterior, la regla Llenar
la
jarra
de
4l:
Si
(X,Y)
AND
X<4
=>
(4,Y)
contiene la condición (X<4), especificando que la jarra no se encuentra llena. Si esta condición no se incluye, se puede aplicar la regla aún cuando la jarra está llena. Dado que en este caso el estado del problema no cambia la aplicación de la regla se considera inútil y
Las reglas no sólo deben describir el problema sino también algún tipo de conocimiento sobre su solución. Si en el ejemplo anterior se considera la siguiente nueva regla: Vaciar "un poco" la jarra de 4l: Si (X,Y) AND X>0 => (X-Q, Y) es decir, tirar agua sin cuantificar, intuitivamente se concluye que la aplicación de esta regla nunca nos acercará a la solución del problema.
y
A veces, cuando se alcanzan algunos estados resulta obvio cómo se debe continuar hacia la solución. Es posible agregar reglas de propósito especial que capturen el conocimiento sobre casos especiales que conducen a la resolución del problema. En el ejemplo anterior, se pueden agregar las siguientes reglas de propósito especial: Si (X,2) => (2,0) Si (2,Y) AND Y>0 => (2,0)
Estas reglas no añaden más potencia al sistema ya que las operaciones que describen las proporcionan otras reglas más generales. En el ejemplo, la primera regla agregada es equivalente a la aplicación de las reglas generales 3 y 8; y la segunda regla agregada es equivalente a la aplicación de la regla general 4. Dependiendo de la estrategia de control que se utilice para seleccionar reglas durante la resolución del problema se puede mejorar el rendimiento si se les da preferencia a las reglas de casos especiales. METODOS DE BUSQUEDA Búsqueda Breadth-FirstSearch (primero en ancho) Este algoritmo de búsqueda visita cada nodo del árbol por niveles, es decir, visita todos los nodos de un nivel antes de visitar los del siguiente. A continuación se detalla un pseudo-código de este algoritmo: Lista_nodos
=
[estado_inicial];
Mientras
NotVacia(lista_nodos)
estado_actual
=
Si
lista_nodos.primero;
EstadoFinal(estado_actual)
entonces
Terminar; Sino lista_reglas
=
ReglasAplicables
Mientras
NOT
estado_sucesor lista_nodos
= =
(estado_actual); Vacia(lista_reglas)
AplicarRegla lista_nodos
+
(lista_reglas); [estado_sucesor];
Fin
Mientras;
Fin
Sino;
Fin Mientras; Con la búsqueda a lo ancho se asegura que una vez alcanzada una solución no existe otra ruta hacia la solución que tenga menor cantidad de pasos.