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:
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.
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)