5. MODELO A IMPLEMENTAR.

Documentos relacionados
Inicio. Cálculos previos GRASP. Resultados. Fin. Figura 5.1: Diagrama de flujo del algoritmo.

El TAD Grafo. El TAD Grafo

C a l ses P P y y NP C a l se P C a l se N P N P [No N n o -De D te t rmin i i n s i ti t c i Polynomial-tim i e]

Algoritmos para CSP 1

Algoritmos de planificación basados en restricciones para la sustitución de componentes defectuosos Irene Barba Rodríguez, S

RELACIÓN DE PROBLEMAS DE CLASE DE PROGRAMACIÓN LINEAL ENTERA

(d) Puede haber estrategias que funcionan mejor que Minimax si el contrincante es

CAPITULO 6. Análisis Dimensional y Semejanza Dinámica

CAPÍTULO 4 TÉCNICA PERT

(e) Con la poda alfa-beta se eliminan nodos que nunca serán alcanzados

Algoritmos. Medios de expresión de un algoritmo. Diagrama de flujo

PROBLEMA 1. Considere el siguiente problema de programación lineal:

JUEGOS. Área de aplicación de los algoritmos heurísticos Juegos bi-personales: oponente hostil

PLANEACIÓN AGREGADA VARIABLES Y CONSIDERACIONES DE UN PLAN AGREGADO

Práctica N o 8 Desigualdades Válidas - Algoritmos de Planos de Corte - Algoritmos Branch & Cut

MÉTODO DEL DUAL (TEORIA DE DUALIDAD)

Conceptos básicos estadísticos

Cristian Blanco

Unidad 2: Ecuaciones, inecuaciones y sistemas.

Formule un modelo de programación lineal binaria que minimice la distancia máxima entre un distrito y su respectiva estación.

Práctica 2: Análisis de sensibilidad e Interpretación Gráfica

4. NÚMEROS PSEUDOALEATORIOS.

TEMA 1: SISTEMAS MODELADOS POR ECUACIONES DIFERENCIALES EN INGENIERÍA QUÍMICA. CLASIFICACIÓN. GENERALIDADES.

PROGRAMACIÓN. UNIDAD II. ALGORITMO PROFA : HAU MOY

Microsoft Project 2013

Tema: Los Grafos y su importancia para la optimización de redes.

Ruta más Corta con una sóla Fuente de Inicio (Single-Source Shortest Paths) DR. JESÚS A. GONZÁLEZ BERNAL CIENCIAS COMPUTACIONALES INAOE

PROCEDIMIENTO GENERAL. Gestión de Incidencias y Acciones Correctivas RAZÓN SOCIAL DE LA EMPRESA. Código PG-12 Edición 0. Índice:

Universidad Tec Milenio: Profesional HG04002 Análisis de Decisiones I

4ta. Práctica. Búsqueda en árbol con contrincante: MiniMax con poda Alfa-Beta. Inteligencia Artificial Prácticas 2004/2005

1. Introducción 2. Esquema básico 3. Codificación 4. Evaluación 5. Selección 6. Operadores 7. Ejemplo. Algoritmos genéticos

PROGRAMACIÓN NO LINEAL INTRODUCCIÓN

Introducción a la programación lineal

ALGORITMO MINIMAX. o Nodo: Representa una situación del juego. o Sucesores de un nodo: Situaciones del juego a las que se

Colección de Tesis Digitales Universidad de las Américas Puebla. Romero Martínez, Modesto

Análisis y síntesis de sistemas digitales combinacionales

PROGRAMACION CONCURRENTE Y DISTRIBUIDA

UNIDAD 1: NÚMEROS NATURALES OBJETIVOS

Procesamiento de documentos XML.

UNIDAD 6: SISTEMAS DE ECUACIONES

Inteligencia Artificial. Integrantes Equipo # 1:

Algebra lineal y conjuntos convexos

DEPARTAMENTO DE ORGANIZACIÓN INDUSTRIAL Y GESTIÓN DE EMPRESAS ESCUELA SUPERIOR DE INGENIEROS DE LA UNIVERSIDAD DE SEVILLA

Curso de Inducción de Matemáticas

NOTAS TÉCNICAS SOBRE EL SIT: Comisiones Comerciales

CAPITULO II ANÁLISIS DEL CRECIMIENTO POBLACIONAL Y CALCULO DE CAUDALES DE DISEÑO

2. METODOLOGÍA. Los tipos fundamentales de Estudios de Investigación, como nos recuerda Bavaresco, son cuatro:

Base de Datos de Compras. Creación de formularios.

Agro 6998 Conferencia 2. Introducción a los modelos estadísticos mixtos

La eficiencia de los programas

PROGRAMACIÓN LINEAL ENTERA

Capitulo 4. DECISIONES BAJO RIESGO TEORIA DE JUEGOS

Inecuaciones lineales y cuadráticas

DIRECCIÓN ADMINISTRATIVA

1. Polinomios. 2. Ecuaciones de segundo grado. 3. Soluciones de una ecuación de segundo. grado. Problemas. 4. Sistemas de ecuaciones

Técnicas Avanzadas de Control Memoria de ejercicios

Asignación de cargas de trabajo mediante gantt:

Inteligencia Artificial

Tema 3: El Método Simplex. Algoritmo de las Dos Fases.

Unidad V. 5.1 Recta tangente y recta normal a una curva en un punto. Curvas ortogonales.

TEMA 12 COSTES ESTÁNDAR

Universidad Tec Milenio: Profesional IO04001 Investigación de Operaciones I. Tema # 9

CONTENIDOS. 1. Procesos Estocásticos y de Markov. 2. Cadenas de Markov en Tiempo Discreto (CMTD) 3. Comportamiento de Transición de las CMTD

Tema 2.- Formas Cuadráticas.

Ingeniería de Requerimientos. requiere de un Sistema de Software.

Tema 3: Sistemas de ecuaciones lineales

Representación en el espacio de estado. Sistemas Control Embebidos e Instrumentación Electrónica UNIVERSIDAD EAFIT

TEMA 5 SISTEMA DE COSTES BASADO EN LAS ACTIVIDADES 5.1. LÍMITES DE LOS SISTEMAS DE COSTES TRADICIONALES

Sesión No. 10. Contextualización INFORMÁTICA 1. Nombre: Gestor de Base de Datos (Access)

Diseño Estructurado de Algoritmos

Z Optima X 1 + X 2 5 Z 1 -X 1 + 2X Región factible. Figura 1

Se definen los siguientes objetivos que se extraen de la propuesta anteriormente planteada:

DEFINICIONES Y CONCEPTOS (SISTEMAS DE PERCEPCIÓN - DTE) Curso

ASOCIACION CIVIL MAGNUM CITY CLUB Informe de Revisión Especial sobre Procedimientos Previamente Convenidos Diagnóstico Organizacional Reportes

1. Caso no lineal: ajuste de una función potencial

Teorema Central del Límite (1)

Tema 14: Sistemas Secuenciales

Herramientas de Programación. M.C. Juan Carlos Olivares Rojas

Para poder realizar este cambio en Deporwin, hemos añadido una nueva opción, que nos permitirá realizarlo de forma simple y rápida.

UNIDAD 12.- Estadística. Tablas y gráficos (tema12 del libro)

Algoritmos y solución de problemas. Fundamentos de Programación Otoño 2008 Mtro. Luis Eduardo Pérez Bernal

Métodos de Búsqueda para juegos humano-maquina. PROF: Lic. Ana María Huayna D.

Prueba, caso de prueba, defecto, falla, error, verificación, validación.

Este documento enumera los diferentes tipos de Diagramas Matriciales y su proceso de construcción.

Anexo 10. Pruebas verificadas

Las redes semánticas intentan trasladar esa afirmación a un formalismo Una red semántica será un grafo donde:

ECUACIONES.

Mercedes Granda Departamento de Electrónica y Computadores. Las propiedades de las redes de Petri nos permiten

TEMA 4. PROCESO UNIFICADO

Inteligencia artificial

RESUMEN DE LA POLÍTICA DE CONFLICTOS DE INTERÉS GRUPO CIMD

Universidad de Oriente Núcleo de Bolívar Unidad de cursos básicos Matemáticas IV. María Palma Roselvis Flores

Diseño arquitectónico 1ª edición (2002)

A/42/10 ANEXO IV TASAS DEL PCT Y MECANISMOS RELATIVOS AL TIPO DE CAMBIO

INTRODUCCION 1.1.-PREAMBULO

CAPÍTULO 4 RECOPILACIÓN DE DATOS Y CÁLCULO DEL VPN. En el presente capítulo se presenta lo que es la recopilación de los datos que se tomarán

PROCEDIMIENTO DE ACCIONES CORRECTIVAS Y PREVENTIVAS

El término productividad, con frecuencia, se confunde con el término producción. Muchas

Fase 2. Estudio de mercado: ESTADÍSTICA

Matemáticas UNIDAD 5 CONSIDERACIONES METODOLÓGICAS. Material de apoyo para el docente. Preparado por: Héctor Muñoz

Transcripción:

5. MODELO A IMPLEMENTAR. La motivación principal del modelo propuesto es la planificación de la ejecución de pruebas funcionales, de manera que ésta se pueda realizar en el menor tiempo posible. Para planificar la ejecución de las pruebas se tendrán que tener en cuenta una serie de restricciones, conformando finalmente un modelo de optimización, en este caso lineal, con variables enteras (como se verá posteriormente). El resultado será un modelo de programación lineal mixta-entera perteneciente a la familia de problemas de planificación / scheduling, que han sido ampliamente estudiados en la literatura. Este tipo de problemas son resolubles de manera exacta mediante técnicas de exploración dirigida (Branch and bound) mezcladas con generación de cortes (Branch and cut) o utilizando otras aproximaciones como técnicas de descomposición o relajación lagrangiana. En casos en que es preciso disponer de buenas soluciones de forma rápida se suelen utilizar metaheurísticas como Búsqueda Tabú y Algoritmos Genéticos. Otra posibilidad comúnmente usada es el desarrollo de heurísticos específicos que renunciando de entrada al óptimo del problema consiguen soluciones en segundos o escasos minutos. En el caso que nos ocupa, la programación de pruebas funcionales, bastaría con disponer de buenas soluciones en el orden de varios minutos, ya que en definitiva, una vez planificada la ejecución de las pruebas, ésta será repetitiva para cada una de las unidades que se vayan a fabricar. Evidentemente es habitual que se produzcan perturbaciones en el desarrollo de las pruebas y que sea preciso realizar un re-scheduling para solventar los problemas que se presenten. Éste, sin embargo, no es el objetivo de este trabajo de fin de carrera, constituyendo un problema de mayor dificultad que podrá ser objeto de posteriores investigaciones, si así fuese necesario. Como se verá posteriormente, los modelos resultantes para un caso real tienen una dimensión importante. Para resolver estos problemas se han usado fundamentalmente dos herramientas: Por una parte, el prototipado del modelo se ha realizado en LINGO. Se conoce que LINGO no es tal vez la mejor herramienta para la resolución de problemas de gran envergadura, de hecho no se ha usado para la resolución, sino para el desarrollo del modelo abstracto. LINGO dispone de un lenguaje de programación muy simple que 67

aun no disponiendo de la potencialidad de GAMS o de AMPL, es más que suficiente para la construcción de los modelos que aquí se han de usar. Por otra parte, es muy sencillo exportar los modelos generados para su resolución con CPLEX o con GUROBI. Éste ha sido el mecanismo utilizado. En definitiva, se ha modelado en LINGO, se ha utilizado LINGO para la realización de pruebas en modelo de pequeño tamaño y una vez construidos los modelos de mayor tamaño, se han resuelto haciendo uso de CPLEX v12. 5.1. Breve estado del arte. Para abordar el problema de la optimización en la ejecución de pruebas funcionales, es fundamental, el estudio del estado del arte de los temas relacionados. Gracias a ello, conseguimos la formación adecuada, podemos conocer las debilidades y fortalezas de otros trabajos, reutilizar ideas que nos ayuden en nuestra investigación, etc. En los siguientes apartados se presentan brevemente algunas ideas básicas de posibles enfoques de resolución. Concretamente se presenta un resumen de las técnicas clásicas de programación matemática y de novedosas técnicas de programación con restricciones. 5.1.1. Scheduling. 5.1.1.1. Introducción. El área denominada Scheduling engloba a multitud de problemas que tienen en común la necesidad de planificar la ejecución de un conjunto de operaciones o tareas en el tiempo. En general, las tareas están sujetas a relaciones de precedencia, de forma que, por ejemplo, el comienzo de una tarea debe ser posterior a la finalización de otra(s). Por otro lado, se cuenta con un conjunto limitado de recursos compartidos, necesarios para la ejecución de las tareas. Para solucionar este tipo de problemas se debe tener en cuenta tanto las restricciones de precedencia como las de recursos, para dar lugar así a un plan de ejecución viable. 68

Un caso concreto de Scheduling es el denominado Job Shop, en el que las tareas se organizan en trabajos, a través de los cuales se establecen las relaciones de precedencia entre ellas. De esta forma, con el término trabajo se hace referencia a una secuencia de operaciones que deben ejecutarse en un orden determinado, existiendo una relación de precedencia entre ellas que establece que una operación puede comenzar sólo cuando ha terminado la ejecución de todas sus predecesoras. Por operación se hace referencia a una tarea que debe ser ejecutada, normalmente sin interrupción (preemptive scheduling), durante un tiempo determinado y haciendo uso de unos recursos específicos. Uno de los objetivos fundamentales de este tipo de problemas es generar un plan de ejecución optimizando una función objetivo determinada, que suele estar relacionada con el tiempo de procesado de todos los trabajos que forman parte del problema. A la hora de generar el plan, es necesario tener en cuenta tanto las restricciones de precedencia existentes entre las operaciones del mismo trabajo como las restricciones de recursos, que obligan a establecer un orden de ejecución entre las operaciones que comparten recursos. Estas últimas restricciones son la fuente de la complejidad NP-dura de este tipo de problemas. Existen muchas variantes que se engloban dentro de este tipo de problemas, entre las que se encuentran: Job Shop: Cada operación sólo puede ejecutarse en una máquina. Puede ser que cada trabajo sólo utilice una vez cada máquina o bien que contenga varias operaciones que deban ser ejecutadas en la misma máquina (en este caso se denomina Job Shop sujeto a recirculación). Flow Shop: En cada trabajo hay exactamente una operación a ser ejecutada en cada una de las máquinas, por tanto cada uno de los trabajos pasa por cada una de las máquinas una sola vez. Además, todos ellos pasan por cada una de las máquinas en el mismo orden. Job Shop Flexible: Existen varios centros de trabajo, cada uno de los cuales contienen el mismo conjunto de máquinas. De esta forma, una operación puede ser 69

ejecutada en cualquier centro de trabajo en la máquina adecuada. Se puede encontrar una información más detallada en. Job Shop Acumulativo: es una generalización del job shop en la que los recursos tienen una capacidad finita y las operaciones pueden requerir varias unidades de varios tipos de recursos. Esta sección se centra en el JSSP (Job Shop Scheduling Problem), que aunque es un modelo simplificado, a partir de su estudio se pueden obtener muchas conclusiones para problemas reales. Por otro lado, es un problema muy estudiado y referenciado, por lo que es fácil realizar estudios comparativos. Esta sección se organiza como sigue: en primer lugar se muestra la definición formal del Job Shop Scheduling Problem (JSSP), problema en el que se basa el artículo de (I. Barba). Posteriormente se tratará la definición del camino crítico de una solución, que es uno de los conceptos fundamentales en la búsqueda de soluciones óptimas para el JJSP. Tras esto, se detallan las propuestas de resolución del JJSP consideradas más relevantes y referenciadas, incluyendo la programación matemática, heurística basada en cuellos de botella, programación con restricciones y métodos heurísticos. 5.1.1.2. Definición del Job Shop Scheduling Problem. El problema de Job Shop Scheduling (JSSP) puede ser formulado como sigue: se tiene un conjunto de n trabajos J 1, J 2,, J n y un conjunto de m máquinas M 1, M 2,, M m. Cada trabajo J i está formado por una secuencia de n i operaciones op i1, op i2,, op i,ni, que deben ser procesadas en este orden. Cada operación op ij debe ser procesada durante p ij unidades de tiempo, sin interrupción, en la máquina µ ij Є (M 1,, M m ). Cada máquina sólo puede procesar una operación en cada momento. Una consideración típica consiste en suponer que n i = m, i. Teniendo en cuenta todo esto, se definen dos tipos de restricciones: Restricciones de precedencia: Cada trabajo está formado por un conjunto de operaciones que deben ser ejecutadas en un orden determinado, de forma que una operación no puede comenzar hasta que no hayan finalizado todas las operaciones predecesoras. 70

Restricciones de recurso: En cada momento sólo una operación puede ocupar una máquina, lo que fuerza a seleccionar un orden para la ejecución de todas las operaciones que se realizan en la misma máquina. Realmente consiste en seleccionar una de entre todas las permutaciones posibles de dichas operaciones, lo que dota al problema de complejidad NP-dura. Grafo disyuntivo Una de las representaciones más claras y utilizadas para este tipo de problemas es el denominado grafo disyuntivo. Un grafo disyuntivo G = (V, C, D) contiene los siguientes elementos: Un conjunto V de nodos, cada uno de los cuales representa una operación, excepto dos de ellos, el nodo fuente y el nodo sumidero, que son nodos virtuales de duración 0 y representan el comienzo y el final del plan respectivamente. Un conjunto de aristas que unen los distintos nodos. Podemos distinguir dos tipos: Aristas de precedencia C (conjunciones) correspondientes a las restricciones de precedencia. Son arcos dirigidos que unen operaciones correspondientes al mismo trabajo. Aristas de recurso D (disyunciones) correspondientes a las restricciones de recurso. Son arcos no dirigidos que unen operaciones que se ejecutan en la misma máquina. Cada una de las aristas tiene asociada una longitud igual a la duración de la operación origen de dicha arista. Una solución para el problema consiste en establecer una dirección en cada una de las aristas de recurso, siendo factible la solución si no da lugar a la formación de ciclos en el grafo. Cada operación del JSSP puede empezar cuando haya terminado la ejecución de sus operaciones predecesoras (en caso de que existan). En un grafo disyuntivo, la dirección de las flechas marca las relaciones de precedencia, de forma que si aparece una flecha dirigida de la operación p a q, esto indica que p precede a q. Es por esto que en el caso de que existan ciclos en el grafo, la solución no es válida. En la Figura 24 se muestra un grafo disyuntivo que representa un problema simple con n = 3 y n i = 3, i. El nodo fuente está representado por la etiqueta U y el nodo sumidero por V. Las 71

aristas de precedencia están representadas mediante flechas unidireccionales de trazado continuo, mientras las de recurso aparecen como flechas bidireccionales de trazado discontinuo. Figura 24 Un grafo disyuntivo para problemas Job Shop. Funciones objetivo. En general, el objetivo más perseguido en este tipo de problemas es encontrar una solución factible, es decir, que satisfaga todas las restricciones, minimizando un valor denominado makespan, C max. El makespan se define como el tiempo en el que termina la ejecución de todos los trabajos, C max = max i=1 n (C i ), donde C i es el tiempo de finalización del trabajo J i, es decir, el tiempo de finalización ct i,ni de la operación op i,ni. Teniendo en cuenta la definición del grafo disyuntivo realizada anteriormente, y dada una solución, el makespan se puede definir como la longitud del camino más largo que existe desde el nodo fuente hasta el nodo sumidero. Dicho camino está formado por un conjunto de operaciones en las que la primera comienza en tiempo 0 y la última finaliza en un tiempo igual a makespan. El problema de minimizar el makespan se reduce a encontrar una dirección para cada arista no dirigida que minimice la longitud del camino más largo. 5.1.1.3. Camino Crítico. Una vez establecida una solución para un problema JJS, es decir, establecida la dirección en cada una de las aristas no dirigidas correspondientes a relaciones de recursos, existen varias posibilidades para dar lugar a un plan de ejecución. El plan de ejecución óptimo para esa solución se obtiene actuando de forma que una operación 72

comience justo cuando han terminado sus operaciones predecesoras (tanto en trabajo como en máquina). De esta forma, se define el tiempo de comienzo (o start time) st ij para una operación op ij, con una operación predecesora en máquina op kl (en caso de que exista), de la siguiente forma: Si es la primera en su máquina y la primera en su trabajo, st ij = 0. Si es la primera en su máquina, pero no en su trabajo, st ij = ct i, j-1. Si no es la primera en su máquina, pero sí en su trabajo, st ij = ct k,l. Si no es la primera en su máquina, ni en su trabajo, st ij = max (ct i,j-1 ; ct k,l ). Para todas las operaciones, el tiempo de finalización ct ij es igual a: ct ij = st ij + p ij. Así se consigue uno de los planes óptimos, pero existen diversas alternativas, algunas de las cuales dan lugar a planes con el mismo makespan (C max ). De hecho, dado un plan, existen planes alternativos que mantienen el mismo orden de ejecución de las operaciones y el mismo makespan, retrasando el comienzo de algunas operaciones. Teniendo en cuenta esto se define el tiempo de comienzo más tardío st ij de una operación como el tiempo máximo en el que una operación puede comenzar sin provocar un aumento en el makespan. De la misma forma el tiempo de finalización más tardío ct ij es el tiempo máximo en el que una operación puede finalizar sin provocar un aumento en el makespan (ct ij = st ij + p ij ). Sea op rs la operación sucesora de op ij en máquina. Se definen st ij y ct ij de la siguiente forma: Si es la última en su máquina y la última en su trabajo, ct ij = C max. Si es la última en su máquina, pero no en su trabajo, ct ij = st i,j+1. Si no es la última en su máquina, pero sí en su trabajo, ct ij = st r, s. Si no es la última en su máquina, ni en su trabajo, ct ij = min (st i,j+1, st rs ). Teniendo en cuenta todo esto, para una solución a un problema JJS, se pueden distinguir dos tipos de operaciones: Operaciones críticas: Son aquéllas que cumplen que st = st, es decir, un retraso en su tiempo de comienzo provocaría un aumento en el makespan. Operaciones con holgura: Son aquéllas que cumplen que st < st, es decir, un retraso en su tiempo de comienzo de no más de st - st unidades no provoca ningún cambio en el makespan. 73

De forma similar, se define el camino crítico sobre un grafo solución, como un camino formado exclusivamente por operaciones críticas que comienza en el nodo fuente y termina en el nodo sumidero. Pueden existir varios caminos críticos, y algunos de ellos pueden solaparse parcialmente. Existe otro concepto relacionado denominado bloque crítico, que se define como un conjunto de operaciones críticas consecutivas que se ejecutan en la misma máquina. Teniendo en cuenta estas definiciones, existe un conjunto de teoremas que se comentan a continuación: Dada una solución factible, cambiar el sentido de una de las aristas dirigidas perteneciente al camino crítico, da lugar a una solución también factible. Dada una solución factible, si el cambio en el sentido de una arista no perteneciente a ningún camino crítico da lugar a una solución factible, ésta tendrá un coste igual o mayor que la solución inicial. Dada una solución factible, cambiar el orden de ejecución de dos operaciones internas a un bloque crítico da lugar a una solución con un coste mayor o igual que la inicial. Intercambiar las dos primeras operaciones del primer bloque crítico, si la segunda de las operaciones es interna, da lugar a una solución con un coste mayor o igual que la inicial. De la misma forma, intercambiar las dos últimas operaciones del último bloque crítico, si la primera de las operaciones es interna, da lugar a una solución con un coste mayor o igual que la inicial. Resumiendo, dada una solución a partir de la cual se desea obtener otra sólo cambiando el sentido de una arista, las únicas opciones que permiten mejorar el makespan, son el intercambio de las dos primeras o las dos últimas operaciones de cada bloque crítico, teniendo en cuenta que si se trata del primer y último bloque crítico las dos primeras y las dos últimas, respectivamente, sólo se intercambian si dicho bloque posee exactamente dos operaciones. 5.1.1.4. Programación matemática. Existen diversas formulaciones de programación matemática para problemas JJS, sin embargo, la formulación más utilizada es la denominada programación disyuntiva. Dicha formulación está muy relacionada con la representación del problema mediante 74

el grafo disyuntivo. Sea st ij el tiempo de comienzo de la operación op ij, O ps el conjunto de todas las operaciones, C el conjunto de aristas de precedencia opij op i, j+1 y µ ij la máquina en la que op ij debe ser ejecutada. El siguiente modelo matemático plantea la minimización del makespan: Minimizar C max sujeto a: En esta formulación, el primer tipo de restricciones asegura que las operaciones que suceden a otras en un trabajo no pueden comenzar antes de que éstas hayan terminado. El tercer tipo establece que dos operaciones no pueden estar utilizando la misma máquina al mismo tiempo (restricciones disyuntivas). Es por esto que esta formulación recibe el nombre de programación disyuntiva. El hecho de que el problema JJS pueda ser formulado matemáticamente de forma sencilla no implica que existan procedimientos sencillos para conseguir el óptimo. Conseguir el óptimo en problemas JSS tiene un coste muy alto y los procedimientos de resolución suelen estar basados en enumeraciones o heurísticas. 5.1.1.5. Heurística basada en cuellos de botella (Shifting Bottleneck Heuristic). La heurística basada en cuellos de botella es un método para resolver problemas JJS basado en realizar la planificación de cada una de las máquinas en un orden determinado en función de la máquina que esté actuando como cuello de botella. El algoritmo consta de M (nº de máquinas) iteraciones, en cada una de las cuales se planifica una máquina, es decir, se establece el orden de todas las operaciones que se ejecutan en dicha máquina. En cada momento se trabaja con un conjunto de máquinas ya planificadas (M 0 ), que irá incrementando a medida que avanza el algoritmo. Se trabaja también con un grafo G que contiene todas las operaciones, pero no todos los arcos. 75

Inicialmente G contiene todas las aristas de precedencia y ninguna de recurso. El conjunto de aristas del grafo también irá incrementando a medida que avance el algoritmo. Se puede calcular el makespan C max (C 0 ) para dicho grafo como la longitud del camino más largo desde el nodo fuente hasta el nodo sumidero. Una vez calculado C max (C 0 ) para el grafo G, para cada operación se puede determinar el tiempo de liberación rt ij como el camino más largo en G desde el nodo fuente hasta op ij, y tiempo de finalización esperado dt ij que es igual a C max (C 0 ) menos el camino más largo desde op ij hasta el nodo sumidero, más p ij. En cada iteración, las operaciones correspondientes a una misma máquina forman un problema independiente con una solución también independiente. De esta forma, para cada máquina no planificada (M - M 0 ), en función de los tiempos rt y dt de cada operación de esta máquina, se realiza la planificación óptima para dichas operaciones, obteniendo así L max (i) como la mínima longitud del camino más largo en el subproblema formado por las operaciones ejecutadas en la máquina i, teniendo en cuenta G. Este problema de optimización es NP-duro, pero existen procedimientos para resolverlo que funcionan razonablemente bien. Una vez realizados estos cálculos, la máquina h con la mayor tardanza L max (h) es seleccionada para ser incluida en el conjunto M 0 y ser planificada. Además, los arcos correspondientes a dicha máquina son añadidos en el grafo G en función del plan óptimo obtenido anteriormente. Ahora es necesario calcular el nuevo makespan, que será al menos L max (h) unidades mayor: C max (M 0 h) C max (M 0 ) + L max (h). Las operaciones que estaban anteriormente en M 0, deben ser replanificadas teniendo en cuenta la inclusión en el grafo de las operaciones correspondientes a la máquina h. El algoritmo correspondiente a este procedimiento se muestra a continuación: 1. Condiciones iniciales. M 0 = El grafo G es el grafo formado por todos los arcos de precedencia y ningún arco disyuntivo. 76

C max igual a la longitud del camino más largo en G. 2. Análisis de máquinas a planificar. Para cada máquina i del conjunto M - M 0 se realiza: Formular un problema para esa única máquina con todas sus operaciones teniendo en cuenta los tiempos de liberación y de finalización esperados. Minimizar L max en cada uno de dichos subproblemas. Sea L max (i) el mínimo L max en el subproblema correspondiente a la máquina i. 3. Selección del cuello de botella y secuenciación. Sea Secuenciar la máquina h acorde a la secuencia generada en el paso 2. Insertar en G todos los arcos disyuntivos correspondientes a la máquina h. Insertar la máquina h en M 0. 4. Resecuenciación de todas las máquinas planificadas anteriormente. Para cada máquina l Є M 0 - h, realizar: Eliminar los arcos disyuntivos correspondientes de G, formular un subproblema para la máquina l con los tiempos de liberación y finalización determinados por el cálculo del camino más largo en G. Encontrar la secuencia que minimice L max (l) e insertar los correspondientes arcos disyuntivos en G. 5. Criterio de parada. Si M 0 = M, entonces FIN, en otro caso volver al paso 2. 5.1.1.6. Programación con Restricciones. 5.1.1.6.1. Introducción. La programación con restricciones (Constraint Programming, CP) es una tecnología software que se utiliza para modelar y resolver gran cantidad de problemas de diversa naturaleza y que persiguen objetivos diferentes. Existen multitud de 77

trabajos relacionados con dicha tecnología que comprenden distintas áreas, entre las que se encuentran parte de la inteligencia artificial, la investigación operativa, las bases de datos o los sistemas expertos. La programación con restricciones se basa en el modelado de un problema a través de un conjunto de variables y restricciones que establecen relaciones ente ellas, para posteriormente obtener una solución que satisfaga dichas restricciones. En el caso de problemas de optimización (Constraint Optimization Problem, COP) se persigue encontrar una solución que, además de satisfacer las restricciones, optimice una determinada función objetivo. La complejidad de la resolución de un problema de satisfactibilidad es, en general, NP-completa, mientras que en el caso de problemas de optimización es NP-dura. Para resolver un problema mediante programación con restricciones, (Constraint Satisfaction Problem, CSP), el proceso se divide en dos etapas claramente diferenciadas: 1. Modelado del problema como un problema de satisfacción de restricciones, siendo necesaria la definición de variables, dominios para dichas variables y restricciones que las relacionan. 2. Búsqueda de solución o soluciones al CSP modelado anteriormente. Esta etapa se puede realizar haciendo uso de diversas estrategias, entre las que se encuentran algoritmos de búsqueda, técnicas de consistencia y técnicas híbridas. La idea fundamental de la programación con restricciones es separar o desvincular el modelado del problema de la resolución del mismo, de forma que el problema se especifica completamente con un modelo claro, que se puede resolver siguiendo diversas estrategias. 5.1.1.6.2. Modelado del Problema como un CSP. Como se ha comentado en la introducción, cuando se desea resolver un problema mediante programación con restricciones, el primer paso es definir un modelado de restricciones adecuado para dicho problema. La elección de un modelado u otro es fundamental, ya que influye, en la mayoría de los casos, de manera determinante tanto en la estrategia a seguir durante la búsqueda de la solución, como en el tiempo de ejecución requerido en la obtención de la misma. 78

El modelado CSP para un problema está formado por una terna (X, D, C) donde: X: es el conjunto de variables CSP del problema, (x 1,..., x n ), para n variables. D: es el conjunto de los dominios de cada una de las variables, < D 1,..., D n >, siendo D i el dominio para la variable x i. C: es un conjunto finito de restricciones. Cada restricción C j involucra a m variables y restringe el valor que pueden tomar dichas variables de forma simultánea. De esta forma, una asignación de un valor para una variable es un par variablevalor (x, a), a Є D a. Una solución para el CSP consiste en una asignación de valores permitidos a cada una de las variables que forman parte del CSP de forma que se satisfagan todas las restricciones establecidas. Un problema es consistente, si existe, al menos, una solución factible para el mismo. Una vez modelado un problema como un CSP, se pueden perseguir diferentes objetivos, entre los que se encuentran: Encontrar una solución cualquiera para el problema. Encontrar algunas soluciones para el problema. Encontrar todas las soluciones existentes para el problema. Encontrar la solución óptima (o una buena solución) para el problema teniendo en cuenta un criterio establecido a partir de una función objetivo (en la mayoría de los casos conseguir una solución que minimice o maximice dicha función). 5.1.1.6.3. Resolución del CSP. Una vez se ha realizado el modelado de un problema como un CSP (Constraint Satisfaction Problem), es necesario aplicar algún mecanismo de resolución para conseguir la solución o soluciones requeridas. Existen multitud de estrategias para llevar a cabo este cometido, la mayoría de las cuales se pueden englobar en alguna de las siguientes técnicas: Algoritmos de búsqueda. Se basan en la exploración del espacio de soluciones hasta encontrar una solución o probar que no existe tal solución. La búsqueda puede ser completa si el recorrido del espacio de soluciones es sistemático, o incompleta en 79

el caso de que se utilicen algoritmos de búsqueda local en los que sólo se exploran ciertas regiones del espacio de soluciones. Técnicas de consistencia. También se denominan técnicas de inferencia, y consisten en eliminar del dominio de las variables los valores inconsistentes. Una forma de realizar esto es evolucionando desde un problema P hacia un problema P 0 equivalente cuyo espacio de soluciones es menor, siendo por tanto más fácil de resolver. La inferencia puede ser completa si al final se llega a un problema P 0 que tiene una solución directa, o incompleta si es necesario realizar una búsqueda para obtener la solución. Técnicas híbridas. Son técnicas que se basan en la búsqueda de la solución mediante la combinación de algoritmos de búsqueda y técnicas de inferencia. Algoritmos de búsqueda. Una de las formas más naturales de resolver un CSP es mediante la búsqueda en el espacio de estados del problema, que es el conjunto de todas las asignaciones posibles de las variables. Existen varias clasificaciones para los algoritmos de búsqueda. En el presente trabajo se ha optado por la división en dos grandes bloques, algoritmos de búsqueda sistemática y algoritmos de búsqueda local, aunque algunos autores distinguen entre búsqueda completa e incompleta. Se detallan a continuación. Búsqueda sistemática. La búsqueda sistemática consiste en recorrer el espacio de estados hasta que se encuentre una solución o se pruebe que no existe solución. Las posibles combinaciones de la asignación de valores a las variables en un CSP dan lugar a un espacio de estados que puede ser representado como un árbol o grafo de búsqueda. Cada nodo del árbol de búsqueda representa una asignación parcial de valores a un conjunto de variables. El nodo raíz del árbol de búsqueda representa el caso en el que ninguna variable se encuentra instanciada, y los nodos hojas el caso en el que todas las variables se encuentran instanciadas. Existen varios algoritmos de búsqueda sistemática, la mayoría de los cuales se basan en backtracking cronológico. En Backtracking Cronológico se realiza un recorrido (parcial o completo) en profundidad sobre el árbol, de forma que en cada uno de los nodos se comprueba si la 80

asignación parcial realizada hasta el momento es consistente con todas las restricciones del CSP. En el caso de que en un nodo no se detecte ninguna inconsistencia, prosigue la búsqueda en profundidad. En cambio, si en un nodo se detecta alguna inconsistencia, se cambia el valor de la última variable que ha sido instanciada a otro valor no probado. En el caso que para dicha variable todos los valores den lugar a inconsistencia (situación sin salida o dead-end), se vuelve al nivel superior para proceder de la misma forma. Si estamos buscando una solución cualquiera, el algoritmo termina cuando ha llegado a un nodo hoja (solución completa), o bien cuando ha explorado todas las combinaciones posibles variable-valor sin éxito (no existe solución). En problemas de optimización, se suelen añadir restricciones que impliquen una mejora de la mejor solución obtenida hasta el momento. En el proceso de búsqueda, en general, el orden en el que se estudian las variables tiene una gran influencia, así como el orden de selección de valores para cada una de ellas, ya que un orden adecuado de ambas cosas puede mejorar notablemente la eficiencia. Existen diferentes tipos de heurísticas tanto para la ordenación de variables como para la selección de valores. Uno de los problemas que presenta el backtracking, es que en cada nodo sólo se estudian las relaciones entre la variable actual y las anteriores, ignorando las variables futuras. Otra deficiencia es la carencia de memoria que posee, de forma que se puede llevar a cabo el análisis innecesario de la misma situación repetidamente. Para paliar dichas deficiencias existen variantes, que se engloban principalmente en algoritmos look-back y look-ahead. Búsqueda local. La búsqueda local consiste en explorar sólo algunas regiones del espacio de estados de forma que, en general, no se garantiza el hallazgo de una solución o de la solución óptima. Los algoritmos de búsqueda local son algoritmos incompletos muy utilizados debido al alto coste que requiere una búsqueda completa. En los algoritmos de búsqueda local normalmente se suele trabajar con soluciones completas (todas las variables se encuentran instanciadas) de forma que se desea llegar a una solución que 81

cumpla todas las restricciones (en el caso de CSP) u optimice una determinada función objetivo (en el caso de COP). Inicialmente se parte de una solución inicial, y se itera repetidas veces dirigiéndose hacia otras soluciones que intentan mejorar el valor de la función objetivo y/o reducir el número de inconsistencias. En la mayoría de los casos, estos algoritmos finalizan tras una serie de intentos o iteraciones, o cuando encuentran el óptimo (si son capaces de detectarlo). Existen muchos algoritmos de búsqueda local, cada uno de los cuales consta de un conjunto de elementos que se describen a continuación: Función objetivo: Es una función que se aplica sobre una solución completa del problema para devolver un valor numérico que indica la bondad de dicha solución. Este valor se denomina coste o beneficio de la solución, y es lo que se desea optimizar. Vecindad: Para cada una de las soluciones (completas o incompletas) se determina un conjunto de soluciones vecinas. Normalmente dicho conjunto suele estar formado por pequeñas variaciones de la solución actual que se espera mejoren la función objetivo. Criterio de selección: Es necesario seleccionar un vecino de entre todos los posibles. Esto se realiza según el criterio de selección, que suele basarse en heurísticas para seleccionar así el vecino más prometedor. Para aplicar búsqueda local a CSPs sin optimización se pueden considerar los siguientes puntos: Cada variable puede tomar cualquier valor de su dominio. Se va iterando sobre soluciones intermedias no consistentes con las restricciones existentes. Se asocia un coste a cada restricción que no se cumpla, de forma que el óptimo (solución consistente con las restricciones), se obtiene cuando el coste es igual a 0. Existen diferentes estrategias para algoritmos de búsqueda local, destacando las siguientes: Algoritmos genéticos. Parten de una población inicial formada por un conjunto de individuos, que pueden ser generados aleatoriamente o mediante técnicas heurísticas, a partir de la cual se lleva a cabo una serie de pasos. En general, se busca 82

que la evolución sea hacia una nueva población mejor que la actual, es decir, que posea individuos con un mejor coste para la función objetivo. El paso de una población a la inmediatamente posterior se realiza mediante tres tipos de operaciones: De Selección: sólo los mejores individuos de la población sobreviven. De Cruce: combinación de individuos para dar lugar a uno o varios nuevos. De Mutación: pequeña modificación en un individuo para dar lugar a otro. En cada una de estas operaciones existen muchas alternativas posibles. Si el algoritmo converge adecuadamente, se van obteniendo mejores soluciones. La solución que devuelve este algoritmo es el mejor individuo encontrado tras una serie de generaciones. Simulated annealing. La idea básica de este algoritmo es la posibilidad de moverse a estados con peor coste dependiendo de una probabilidad p que depende de varios factores, entre los que se encuentran: Empeoramiento de la solución tras el cambio. Mientras más se empeore la solución, menos probabilidad hay de aceptar el cambio. Número de iteración en el que se encuentre el algoritmo, de forma que mientras más avanzada esté la búsqueda, menor es la posibilidad de permitir soluciones peores. Si la nueva solución mejora la actual, siempre se realiza el movimiento. Búsqueda tabú. Propone mantener durante el proceso de búsqueda una lista con los últimos k movimientos realizados (lista tabú), de forma que dichos movimientos no son permitidos (movimientos prohibidos). Esto da lugar a un algoritmo en el que el mismo movimiento no puede ser repetido o revertido, al menos, hasta k iteraciones después. Dicha lista se va actualizando en cada iteración de forma que se produce pérdida de memoria estratégica de los movimientos realizados anteriores al (k - 1)-ésimo. Para el éxito de la búsqueda tabú en la resolución del problema, es muy importante determinar de forma adecuada el tamaño de la lista tabú y la información almacenada. Junto con la búsqueda tabú, en algunos casos, se 83

utiliza el criterio de aspiración, que consiste en seleccionar como próxima solución, si existe, aquella solución que mejore a la actual, se encuentre o no en la lista tabú. Técnicas de consistencia. Las técnicas de consistencia se basan en la inferencia de nuevas restricciones a partir de las existentes en una red, de forma que las restricciones añadidas no incorporan conocimiento nuevo pero sí hacen explícitas relaciones que estaban presentes de forma implícita. En general, estas nuevas restricciones pueden englobar a algunas restricciones anteriores, de forma que el número de restricciones puede ir reduciéndose en cada paso. La inferencia llevada al extremo da lugar a una sola restricción que engloba todas las restricciones iniciales, de forma que las tuplas que cumplen dicha restricción son soluciones directas al problema. Todas las redes de restricciones por las que se pasa durante el proceso de inferencia son equivalentes, es decir, todas tienen el mismo conjunto de soluciones. Mediante inferencia conseguimos redes de restricciones equivalentes pero más sencillas de resolver, intentando obtener redes con un espacio de estados menor o que se puedan explorar de forma más eficiente. Cuando se sintetizan todas las restricciones en una única se denomina inferencia completa o consistencia global, y dicho proceso es, en general, muy costoso. Por el contrario, cuando la inferencia es incompleta (consistencia local) se añaden restricciones que hacen explícitas relaciones que anteriormente se encontraban implícitas sin necesidad de llegar a una única restricción. En este caso y una vez realizada la inferencia, es necesario algún método de búsqueda que actúe sobre la nueva red de restricciones. Inferencia completa. Son técnicas en las que se van generando redes de restricciones cada vez más pequeñas hasta llegar a una única restricción que engloba a todas las adaptativa. iniciales. Un ejemplo de esta técnica es el algoritmo de consistencia Esto se realiza, en general, mediante la eliminación de variables, que tiene un gran coste computacional. Las restricciones son consideradas relaciones sobre un 84

conjunto de variables, cada una de ellas compuesta por tuplas. Sobre dichas relaciones se definen las operaciones de proyección y join para llevar a cabo la inferencia. Inferencia incompleta. Debido al alto coste computacional de la inferencia completa, existen alternativas de inferencia incompleta o consistencia local, ya que realizar un estudio del subproblema que sólo contempla un número pequeño de variables, lleva asociado un coste computacional aceptable. Las técnicas de inferencia incompleta se basan en el estudio de subredes de restricciones del problema. Gracias al estudio de subredes de restricciones que sólo consideran ciertas variables se pueden obtener diferentes resultados: Si se detectan valores o combinaciones de valores que no aparecen en ninguna solución de la subred, dichos valores tampoco aparecerán en la solución de la red, ya que las restricciones de la subred aparecen en la red global. Si la subred no tiene solución, la red global tampoco la tendrá. En cambio, que la subred tenga solución no implica que la red global también la tenga, ya que sólo se realiza un estudio local del problema. De esta forma, en general, no se encuentran soluciones globales al problema pero se añaden nuevas restricciones que aceleran la búsqueda al reducir el espacio de estados y mejorar la detección de inconsistencias. Existen varios algoritmos de consistencia local (68), algunos de los cuales están basados en consistencia de nodo (1- consistencia), consistencia de arco (2-consistencia) o consistencia de caminos (3- consistencia). La consistencia de arco es una de las formas más usuales de realizar la propagación de restricciones. Una de las razones es que es un concepto muy simple y natural que garantiza que todos los valores de un dominio son consistentes con todas las restricciones existentes. La propuesta de algoritmos eficientes que trabajan con la arco consistencia se ha considerado siempre una de las cuestiones centrales dentro de la comunidad de razonamiento con restricciones por varias razones. La primera de ellas es que la arco consistencia es el mecanismo de propagación básico que usan la mayoría de los programas existentes. Otra razón es que las nuevas ideas que permiten mejorar la eficiencia en la arco consistencia se pueden aplicar normalmente a algoritmos para mejorar otros tipos de consistencias locales. Se han propuesto múltiples algoritmos 85

para conseguir arco-consistencia, todos polinómicos. Uno de los más conocidos es el AC3, propuesto por Mackworth. Técnicas híbridas. Como se ha comentado en apartados anteriores, las técnicas híbridas son una combinación de procesos de búsqueda junto con técnicas de inferencia, intentando combinar los aspectos más positivos de cada una de ellas para llegar a un buen mecanismo de resolución. Los algoritmos híbridos se pueden dividir en dos grandes bloques: Combinación de búsqueda sistemática e inferencia incompleta. En cada nodo del subárbol de búsqueda se lleva a cabo la consistencia local del subproblema representado por dicho nodo, de forma que se detectan las tuplas parciales inconsistentes. Dichas tuplas son eliminadas, reduciendo el espacio de estados e incluso detectando una situación sin salida si el dominio queda vacío. Algoritmos look-back. Los algoritmos look-back son variantes del backtracking cronológico en las que, al igual que el backtracking, sólo se tiene en cuenta la información acerca de las variables anteriores a la actual. La diferencia es que dichos algoritmos cuando llegan a una situación sin salida realizan un estudio, más o menos profundo, de las variables instanciadas hasta el momento (variables anteriores), de forma que actúan intentando evitar caer en una situación sin salida por la misma razón repetidas veces. Existen varios algoritmos basados en esta idea, entre los que se encuentran: Backjumping: La forma en la que se actúa cuando se llega a una situación sin salida es saltando a la variable que se considera responsable de haber llegado a dicha situación, no a la inmediatamente anterior como en el caso del backtracking cronológico. Conflict-directed Backjumping: La idea es similar a Backjumping, sólo que en este caso el salto hacia atrás se efectúa teniendo en cuenta más información. A medida que se va construyendo el árbol de búsqueda, para cada variable x i analizada se va asociando un conjunto conflictivo que está formado por todas las 86

variables anteriores a x i que entran en conflicto con ella. De esta forma, cuando se llega a una situación sin salida para la variable x i, se salta a la variable más profunda x j que se encuentra en el conjunto conflictivo de xi. Además, todas las variables que están en el conjunto conflictivo de x i se incorporan al conjunto conflictivo de x j. Con esto se consigue conservar toda la información sobre conflictos acerca de las variables estudiadas anteriormente. La ventaja con respecto al backjumping es que realiza la vuelta atrás de forma más inteligente, teniendo en cuenta información que antes se perdía. El aspecto negativo es que es necesario trabajar con estructuras de datos más complejas y almacenar más información para cada variable. Learning: Consiste en realizar un aprendizaje de las situaciones sin salida, en función del cual se realiza poda en el árbol de búsqueda. Mantiene en cada momento restricciones implícitas resultantes de la búsqueda que utiliza para evitar repetir situaciones sin éxito. Algoritmos look-ahead. Los algoritmos look-back sólo realizan el estudio de las variables anteriores, sin tener en cuenta las variables futuras (variables todavía no instanciadas). Los algoritmo look-ahead realizan un estudio tanto de las variables pasadas como de las variables futuras, lo que da lugar a la detección de situaciones sin salida antes de que tengan lugar. La técnica look-ahead más conocida y usada es la denominada Forward Checking. Dicha técnica consiste en ir eliminando temporalmente valores del dominio de variables futuras en el caso de que dichos valores presenten inconsistencia con respecto a la variable actual. De esta forma, si el dominio de alguna variable todavía no instanciada se queda vacío, se debe a que la asignación parcial que se lleva hasta el momento no puede formar parte de una solución. Cuando ocurre dicha situación, se selecciona el siguiente valor para la variable actual. En caso de que la variable actual se quede sin valores consistentes por explorar, se salta a la variable anterior (al igual que en backtracking cronológico). Manteniendo arco consistencia (MAC). El algoritmo MAC va generando una sucesión de subproblemas arco-consistentes, de forma que cada nuevo subproblema generado, tiene en cuenta todas las restricciones para mantener la arco-consistencia. 87

Combinación de búsqueda sistemática e inferencia completa. En general, la inferencia completa es muy costosa debido al gran esfuerzo computacional que requiere. Sin embargo, teniendo en cuenta el valor de algunos parámetros, existen ciertas situaciones en las que su aplicación es adecuada dentro de un algoritmo de búsqueda. Búsqueda y eliminación de variables (Variable Elimination Search, VES). La idea fundamental de las técnicas de inferencia es la eliminación sucesiva de variables. Esto tiene un coste exponencial en función de la anchura de la variable a eliminar, definiendo la anchura de una variable como el número de variables anteriores en el árbol más el número de variables que están relacionadas con ella en alguna restricción. Si la anchura de una variable tiene un valor alto, el coste de eliminar dicha variable es prohibitivo. En cambio, para variables con un valor de anchura bajo, se puede asumir el coste computacional de eliminarla a cambio de la reducción de complejidad que implica dicha eliminación. Además, tras la instanciación de una variable, se consigue una reducción en el árbol de búsqueda con la consiguiente reducción en la anchura de otras variables. 5.1.1.6.4. Heurísticas. Cuando se resuelve un CSP haciendo uso de un algoritmo de búsqueda, hay dos factores que pueden mejorar de manera considerable la eficiencia del proceso, que son los siguientes: Ordenación de variables. En general, las heurísticas de ordenación de variables suelen instanciar las variables más restringidas en primer lugar, de forma que se intenta detectar una solución sin salida lo antes posible, para disminuir así el número de saltos hacia atrás. La ordenación de variables se puede clasificar de la siguiente forma: Heurísticas de ordenación de variables estáticas: Desde el primer momento de la búsqueda se establece un orden de selección de las variables que permanece fijo durante todo el proceso. Para dar lugar a esta ordenación se hace uso de la información global del problema, derivada de la topología del grafo de restricciones original que representa al CSP. Algunas heurísticas de este tipo son: 88

Maximum degree (MD), que define el grado de un nodo como el número de nodos que son adyacentes a él y ordena las variables en un orden decreciente de su grado en el grafo de restricciones. Maximum cardinality (MC), que selecciona de forma aleatoria la primera variable, tras lo cual va seleccionando en cada paso la variable que es adyacente al conjunto más grande de las variables ya seleccionadas. Heurísticas de ordenación de variables dinámicas: abordan el problema del tratamiento dinámico del dominio de las variables, que va cambiando durante el proceso de búsqueda con la propagación de restricciones. Una de las más utilizadas es la heurística first fail principle, que indica que para obtener buenos resultados, es bueno intentar buscar primero donde exista una mayor probabilidad de fallo. Ordenación de valores. Existen menos trabajos en cuanto a heurísticas de ordenación de valores que a heurísticas de ordenación de variables. La mayoría de estos trabajos se basan en seleccionar primero los valores de cada una de las variables que tengan mayor probabilidad de llevarnos a una solución válida (valores menos restringidos en general), es decir, exploran en primer lugar las ramas del árbol consideradas más prometedoras. Una de las heurísticas más conocidas de este tipo es la heurística minconflicts, que ordena los valores de forma decreciente en función del número de conflictos en los que estén involucrados con las variables no instanciadas aún. 5.1.1.7. Programación con restricciones en el problema de Scheduling. La programación con restricciones puede ser aplicada a problemas job shop que tienen como función objetivo el makespan de la siguiente forma: suponemos que tenemos que encontrar un plan con C max menor o igual que un valor determinado d. Un algoritmo de satisfacción de restricciones debe producir para cada máquina una secuencia de operaciones de forma que el tiempo de procesamiento final de cada máquina no supere d. En primer lugar es necesario realizar un paso de inicialización, que consiste en realizar los cálculos adecuados para obtener el tiempo de comienzo más temprano y el tiempo de finalización más tardío de cada una de las operaciones en su máquina. Tras 89

esto se realiza una comparación entre las ventanas temporales de todas operaciones asociadas a las mismas máquina, de forma que si las ventanas temporales de dos operaciones asociadas a la misma máquina no se solapan, es posible establecer una relación de precedencia entre ellas: en cualquier plan factible, la operación con la ventana temporal más temprana debe ser predecesora de la operación con la ventana temporal más tardía. Realmente es posible establecer relaciones de precedencia incluso cuando las ventanas temporales se solapan. Sea st ij (st ij ) el tiempo posible de comienzo más temprano (más tardío) de la operación op ij y ct ij (ct ij ) el tiempo posible de finalización más temprano (más tardío) de la operación op ij teniendo en cuenta el conjunto de restricciones de precedencia dado. El tiempo posible de comienzo más temprano st ij de la operación op ij puede ser considerado el tiempo de liberación rt ij de dicha operación, mientras que el tiempo posible de finalización más tardío ct ij puede ser considerado como el tiempo de finalización esperado, dt ij. Se define la holgura entre el procesamiento de las operaciones op ij y op rs, ambas ejecutadas en la misma máquina, como: Entonces, bajo el conjunto de restricciones de precedencia actual, no existe ningún plan factible en el que la operación op ij preceda a la operación op rs. De esta forma se puede establecer una restricción de precedencia que implique que la operación op rs se ejecute antes que la op ij. En el paso de inicialización todos los pares de ventanas temporales son comparados entre ellos de forma que se obtienen las restricciones de precedencia y se añaden al grafo disyuntivo. Debido a las nuevas restricciones de precedencia, las ventanas temporales de cada una de las operaciones pueden ser ajustadas, es decir, tiene lugar de nuevo el cálculo de los tiempos de liberación y de finalización esperados de cada operación. 90

Las técnicas de satisfacción de restricciones a menudo confían en la propagación de restricciones. Una técnica de satisfacción de restricciones típicamente intenta, en cada paso, añadir nuevas restricciones de precedencia (arcos disyuntivos) que a su vez han sido implicados por restricciones de precedencia insertadas anteriormente. Una vez las nuevas restricciones han sido añadidas, tiene lugar el cálculo de las ventanas temporales de todas las operaciones. Existen otras alternativas de resolución, como instanciar variables en cada paso, etc. Para cada par de operaciones que tienen que ser procesadas en la misma máquina se cumple uno de los siguientes 4 casos: - Caso 1: Si, entonces se puede añadir la restricción de precedencia op ij op rs. - Caso 2: Si, entonces se puede añadir la restricción de precedencia op rs op ij. - Caso 3: Si, entonces no existe un plan que satisfaga las restricciones actuales. - Caso 4: Si, entonces cualquier orden entre las dos operaciones es posible. 5.1.2.7. Métodos heurísticos generales. En muchos de los problemas englobados dentro de planificación y scheduling, encontrar la solución que optimice una determinada función objetivo puede dotar al problema de una complejidad NP-dura. Algunas veces es necesario resolver problemas de gran tamaño en un tiempo "pequeño", aunque a cambio no se asegure el óptimo, siempre que las soluciones sean presumiblemente de calidad (cercanas al óptimo). En este apartado se describe un conjunto de reglas que resuelven problemas NPduros en tiempo polinómico, no garantizando la solución óptima, pero dando lugar a una solución aceptable en un tiempo de ejecución relativamente pequeño. Tras esto se comenta un método denominado beam search, que es una variante de técnicas de ramificación y poda. Otros métodos heurísticos ampliamente aplicados a problemas de scheduling son simulated annealing, búsqueda tabú y algoritmos genéticos, los cuales han sido explicados previamente en la sección anterior. 91