• No se han encontrado resultados

6. DESARROLLO DEL ALGORITMO BÚSQUEDA TABÚ

N/A
N/A
Protected

Academic year: 2021

Share "6. DESARROLLO DEL ALGORITMO BÚSQUEDA TABÚ"

Copied!
15
0
0

Texto completo

(1)

6.

DESARROLLO DEL ALGORITMO BÚSQUEDA

TABÚ

6.1.

Introducción a la situación planteada

El algoritmo desarrollado está diseñado para aplicarse a Problemas de Ruteo de Vehículos con Ventana Temporal de Acceso, habiendo respetado las características generales de la Búsqueda Tabú anteriormente mostradas y habiendo sido añadidas ciertas estrategias de intensificación y diversificación que se desarrollarán a continuación durante este capítulo.

El esquema temporal que se plantea es el mostrado en la figura 4 mostrada a continuación:

Figura 4: Esquema temporal Siendo:

t

o = Inicio del horizonte temporal

t

f = Final del horizonte temporal

t

vc = Instante en el que comienza a actuar la ventana temporal

t

va = Instante en el que deja de actuar la ventana temporal

Haciendo referencia al modelo matemático del capítulo 3 de este proyecto, se identifican tres variables temporales que se relacionan con las variables del esquema temporal arriba expuesto:

 La variable TVC (periodo con restricción de acceso)

o TVC =

t

va -

t

vc

 La variable TA (periodo de tiempo previo al inicio del periodo con restricción de acceso)

(2)

 La variable TP (periodo de tiempo posterior al periodo con restricción de acceso)

o TP =

t

f -

t

va

Otras variables temporales a tener en cuenta son las relacionadas con las entradas y las salidas de los nodos destino durante la ruta. Se diferencian tres variables, una de las cuales será dato del problema:

t

in = Instante de llegada al nodo destino

t

out = Instante de salida desde el nodo destino (i) hacia el siguiente

nodo (i+1)

 h = Duración de la entrega en el nodo destino = 20 minutos. Este valor está fijado para todas las entregas independientemente del nodo destino.

6.2.

Diagrama de flujo general

El diagrama de flujo principal de un algoritmo Búsqueda Tabú (figura 5) consta realmente de 2 componentes principales, siendo estos, la Intensificación y la Diversificación.

La búsqueda tabú es un algoritmo que actúa sobre una solución inicial de entrada, por lo que se incluye en este el proyecto el diseño del algoritmo que crea la solución inicial, sin embargo la creación de la solución inicial no forma parte del algoritmo Búsqueda Tabú.

El bloque Intensificación es quizás el más importante ya que es el encargado de la optimización local, mientras que el bloque de Diversificación se encarga de mover la solución hacía zonas inexploradas pero de un modo que no optimiza, sino que empeora la solución para poder salir del posible optimo local alcanzado en la Intensificación.

Figura 5: Diagrama de flujo general

(3)

6.3.

Presentación de los parámetros

La complejidad del algoritmo, y sobre todo de su programación, obliga a definir ciertos parámetros de modelización. Los parámetros del modelo son parámetros de entrada que definen el comportamiento del algoritmo. Algunos de ellos se han considerado críticos y se ha decidido hacer un estudio con el objetivo de optimizar el rendimiento del algoritmo en términos de “calidad” de la solución respecto a las iteraciones realizadas. El resto que no ha sido considerado crítico, ha recibido un valor fijo y ha pasado a ser dato. Resulta muy complicado hacer un estudio de optimización de parámetros considerando todos ellos como críticos debido al tamaño del problema.

Se diferencian dos tipos de parámetros, los relacionados exclusivamente con este proyecto en particular (Particulares) y aquellos comunes del problema de ruteo de vehículos con ventana temporal de acceso (Comunes).

Parámetros Particulares y Críticos

a) “vecifitness”: Puede definirse como el número máximo de nodos sometidos a evaluación por cada estrategia de intensificación.

b) “numelite”: Hace referencia al número de vectores solución (salidas de la intensificación) consecutivos que se evalúan para definir el conjunto de “cadenas élite”.

c) “radio”: Es el radio de búsqueda de vecinos cercanos entorno al nodo bajo análisis.

d) “porcenmax”: Es el parámetro-condición que limita la pérdida de valor de la función objetivo tras aplicar la diversificación sobre el vector solución.

e) “numeroiteracionesmax”: Es el número máximo de iteraciones que se ejecuta el algoritmo.

(4)

Parámetros Comunes:

a) “Numparadas”: Es el número de clientes que se han de visitar. Define el tamaño del problema.

b) “Radio de la zona restringida”: Es el radio que tiene la zona restringida del problema a la que no se puede acceder mientras permanezca cerrada la venta temporal de acceso.

c) “Tiempo VC”: Es el instante dentro del horizonte temporal a partir del cual se cierra el acceso a la zona restringida. (Ventana Cerrada).

d) “Tiempo VA”: Es el instante dentro del horizonte temporal a partir del cual se permite el acceso a la zona restringida. (Ventana Abierta).

Datos de Entrada:

1. “Porcen2”: Indica el número máximo de movimientos permitidos en la Diversificación. Se ha tomado este valor como el 10% del número total de paradas del problema.

2. “Numerotabu”: Define el número de iteraciones que permanece una relación entre nodos calificada como tabú después de realizarse una operación de intercambio o inserción entre ellas.

3. “Tiempoentregamax”: Es el tiempo que tarda un cliente en ser atendido. Es un valor fijo, es decir, todas las paradas que los vehículos realizan en los clientes duran el mismo tiempo.

6.4.

Diseño de los algoritmos

Como se ha expuesto en el objetivo de este proyecto final de carrera, uno de ellos es diseñar dos algoritmos basados en la búsqueda tabú y comparar los resultados de sus experimentos con los obtenidos por aquellos realizados con un algoritmo genético. A continuación se exponen dos algoritmos basados en la búsqueda tabú: uno “básico” y otro “complejo”.

(5)

6.5.

Desarrollo del algoritmo básico

El algoritmo básico está diseñado con las estrategias más sencillas posibles de intensificación y diversificación.

El algoritmo comienza recibiendo una solución inicial en forma de vector de n

componentes (la metodología para obtener la solución inicial será expuesta en apartados posteriores). Este vector de solución inicial será el elemento de entrada al bloque de Intensificación (solo para la primera iteración, en las posteriores el elemento de entrada será el vector solución de salida de la Diversificación).

Debido a que uno de los objetivos de este proyecto es realizar una comparación de los resultados obtenidos por este algoritmo con los obtenidos por el algoritmo genético, se ha decidido usar el mismo método de evaluación para el vector solución. Este método es una función llamada “Fitness” que se ejecuta cada vez que quiero evaluar una posible solución. Así, a partir de ahora, cada vez que nos refiramos al término “evaluación”, “evaluar”, etc… nos estaremos refiriendo a aplicar la función Fitness sobre un vector solución. La salida de esta función está compuesta por una matriz donde se expone el número de vehículos utilizados, la ruta que cada vehículo realiza y el valor de la función objetivo del modelo del programa, además de por dos matrices más que ofrecen información sobre el instante de tiempo en el que cada vehículo llega y sale de cada nodo destino.

El algoritmo “básico” aquí descrito posee una estructura igual a la mostrada en el diagrama de flujo de la figura expuesta anteriormente.

El algoritmo comienza evaluando la solución inicial que es un elemento de entrada provisto por un algoritmo externo a este. Posteriormente se entra en el bloque Intensificación.

Bloque Intensificación

La intensificación es iterativa siempre que no se cumplan las condiciones de salida de la intensificación. Comienza con la elección del primer nodo del vector solución, nodo i. Primero se comprueba la situación temporal y geográfica en la que se encuentra el nodo, esto es, indicar si es un nodo interno o externo a la zona restringida y ver el instante de tiempo que es respecto al horizonte temporal. Dependiendo de la situación temporal y geográfica, se le asignará un

(6)

valor a un indicador, llamado “indicador2”, que dice qué tipo de vecinos se deben buscar.

A continuación se pasa a la búsqueda de vecinos, este es un proceso simple, donde se localizan los nodos cercanos (el radio de búsqueda es uno de los parámetros que se han estudiado para encontrar la parametrización óptima) y que cumplen las condiciones impuestas por el indicador antes comentado. Una vez obtenidos los vecinos, se procede al análisis de la estrategia de intensificación implantada. En este caso se ha optado por la estrategia denominada “Intercambio puro de vecinos” cuyo proceder es el siguiente:

1. Para cada vecino, se realiza el cálculo de la distancia que resultaría de intercambiar el nodo bajo estudio “i” por el vecino “k”, esto es la suma de distancias entre la parada "(i-1)" y el vecino k y entre el vecino k y la parada “(i+1)”. Es decir:

 Distancia medida = Distancia ((i-1), (k)) + Distancia ((k), (i+1)) 2. Se almacenan las distancias anteriores de una forma ordenada de

menor a mayor (las “vecifitness” menores distancias, siendo “vecifitness” un parámetro del problema analizado) puesto que buscamos disminuir la distancia entre (i-1) e (i+1), creándose una matriz denominada: “matrizdistvecinalorden”.

3. Ahora se pasa a “evaluar” cada posible intercambio de nodo y almacenamos los resultados de la evaluación. Si a lo largo de la evaluación nos encontramos con un vecino tabú (nos referimos a que el intercambio entre el nodo parada bajo estudio y el vecino sea prohibido por así indicarlo la lista tabú) el algoritmo se saltará el vecino y no evaluará su intercambio con el nodo bajo estudio, a no ser que se cumpla el Criterio de Aspiración tenido en cuenta: si la primera fila de “matrizdistvecinalorden” corresponde a un vecino tabú, entonces sí se tiene en cuenta para su evaluación.

4. Tras la evaluación, se selecciona el vecino para el que conseguimos el valor mínimo de la evaluación (función objetivo mínima) y se compara con el valor de la función objetivo que tiene el vector solución actual sin realizar el intercambio con el vecino seleccionado.

(7)

A modo de aclaración se puede apreciar en la figura 6 el proceso de intercambio puro:

Figura 6: Esquema de intercambio puro

La comparación realizada puede dar lugar a dos situaciones, que se realice el intercambio o que no se realice. En el caso de que se realice el intercambio en el vector solución, se modificará la lista tabú incrementándose con el Número Tabú (parámetro del problema) el nodo (k,i) de la matriz “ListaTabu”. Si no se realiza ningún intercambio, lo que significaría que la función objetivo actual es menor que la ofrecida por el mejor intercambio, entonces no se realiza ninguna acción sobre la Lista Tabú. A continuación se pasa a estudiar la siguiente posición del vector solución, y así se procede hasta completar todas las posiciones del vector solución (vector de tamaño igual a “Numparadas”, que es parámetro del problema).

Tras estudiar el último nodo del vector solución, se pasa a comprobar el valor de la función objetivo final con la que se tenía al iniciar la intensificación. Si estos valores son iguales, o si el número de veces que se ha ejecutado la intensificación es mayor a 40, entonces finaliza la intensificación, en caso contrario se vuelve a iterar la intensificación.

Tras salir del bucle de la intensificación se realiza la actualización de la Lista Tabú, esto es, disminuir los valores de la Lista en una unidad (menos los valores aumentados durante la intensificación). Seguidamente comienza el bloque de Diversificación.

(8)

Bloque Diversificación

La idea de la Diversificación es salirse de los posibles óptimos locales encontrados durante la intensificación y llegar a otras posibles soluciones que conduzcan a diferentes óptimos locales o incluso al óptimo global. Para ello se realiza una inserción de nodos aleatoria con condiciones siguiendo el siguiente proceso:

Primero se seleccionan aleatoriamente dos elementos (“aleat”) del vector solución, llamados “aleat” y “aleat2”. Seguidamente se realiza el intercambio entre ellos y se evalúa el intercambio realizado con la función “fitness”.

A continuación se someten los resultados de la evaluación a las condiciones de la diversificación:

 Condición de Intercambio: comprueba que tras hacer el intercambio no se ha incrementado más del 20% el valor de la función objetivo. En caso de que si se haya superado, primero se deshace el intercambio anterior y se procede la selección aleatoria de otros dos elementos para proceder al proceso de intercambio. Si continuamente (50 veces) ocurre esto, es decir, que se aumenta más del 20% el valor de la función objetivo, al final el algoritmo finaliza esta etapa y pasa a las siguientes condiciones de diversificación.

 Condiciones de Diversificación: Si se cumple alguna de ellas, el algoritmo finaliza la diversificación, si no se cumple ninguna, vuelve a iterar desde el inicio de la diversificación. Las condiciones son:

o Que se hayan hecho más intercambios que un 10% del número total de nodos destino

o Que la pérdida del valor de la función objetivo sea mayor al máximo permitido “porcenmax” (parámetro del problema )

o Que al realizar algún intercambio haya disminuido la función objetivo (haya mejorado)

o Que se haya producido el salto desde la condición de intercambio por incapacidad de intercambiar los elementos seleccionados.

(9)

Una vez que se cumple alguna de las Condiciones de Diversificación el algoritmo pasa la comprobación final, que son las condiciones finales, éstas son simplemente dos, y si se cumple alguna de ellas el algoritmo finaliza su ejecución, las condiciones son las siguientes:

 Que se haya llegado a un número de iteraciones máximo “numeroiteracionesmax” (parámetro del problema).

 Que se haya producido el anterior salto comentado por incapacidad de intercambio.

Tras cumplir alguna de las condiciones finales el algoritmo finaliza quedando guardadas las diferentes soluciones obtenidas a lo largo de las intensificaciones realizadas por el algoritmo.

6.6.

Desarrollo del algoritmo complejo.

El diagrama de flujo del algoritmo complejo diseñado tiene una variante respecto al diagrama de flujo general antes mostrado. Como paso intermedio entre la intensificación y la diversificación se ha añadido el bloque Pre-Diversificación, en el cual, se preparan ciertos elementos del programa para su posterior entrada en la Diversificación. La figura 7 a continuación muestra el diagrama de flujo final para el algoritmo complejo:

Figura 7: Diagrama de flujo del algoritmo Búsqueda Tabú Complejo

Además de haber añadido un bloque adicional al diagrama, también se han añadido ciertas estrategias dentro de los bloques de Intensificación y Diversificación. A continuación se expone el modo de actuar del algoritmo “complejo” haciendo comparaciones con el algoritmo “básico” para ver las principales diferencias de diseño.

(10)

Al igual que en el algoritmo “básico”, el algoritmo “complejo” también es alimentado con una solución inicial, la cual se obtiene con la misma metodología que la solución inicial del algoritmo “básico”. Ésta se evalúa y seguidamente empieza la intensificación.

Bloque Intensificación

El bloque de intensificación del algoritmo “complejo” sufre una modificación sustancial respecto al del algoritmo “básico” ya que cuenta con dos estrategias de mejora en lugar de una.

El desarrollo del proceso de intensificación transcurre exactamente del mismo modo que en el algoritmo “básico” salvo porque a la hora de analizar los vecinos primero se analizan mediante la estrategia ya conocida “Intercambio puro de vecinos” y posteriormente con la estrategia añadida “Inserción de vecinos”. Las estrategias son totalmente independientes la una de la otra. El hecho de implementar en Matlab una estrategia antes que la otra es irrelevante. A continuación se va a explicar el procedimiento de la estrategia “Inserción de vecinos” y se va a omitir la de la estrategia “Intercambio puro de vecinos” puesto que ya ha sido explicada anteriormente en el apartado anterior donde se desarrolló el algoritmo “básico”. La estrategia “Inserción de vecinos” procede del siguiente modo:

1. De un modo parecido a la estrategia “Intercambio de vecinos” anteriormente explicada se realiza el cálculo de distancias. Esta vez obtendremos dos distancias diferentes para cada vecino, según se inserte el vecino delante o detrás del nodo (i) bajo estudio, es decir:

 Distancia medida 1 = Distancia ((i-1), (k)) + Distancia ((k), (i)) + Distancia ((i), (i+1))

 Distancia medida 2 = Distancia ((i-1), (i)) + Distancia ((i), (k)) + Distancia ((k), (i+1))

2. Tras esto se procede al ordenamiento de las “vecifitness” mejores medidas tomadas.

(11)

3. Se continúa con la “evaluación” de cada posible inserción de nodo y se almacenan los resultados de la evaluación. Si a lo largo de la evaluación nos encontramos con un vecino tabú (nos referimos a que el intercambio o inserción entre el nodo parada bajo estudio y el vecino sea prohibido por así indicarlo la lista tabú) el algoritmo se saltará el vecino y no evaluará su intercambio con el nodo bajo estudio, a no ser que se cumpla el Criterio de Aspiración tenido en cuenta: si la primera fila de “matrizdistvecinalordeninser” corresponde a un vecino tabú, entonces sí se tiene en cuenta para su evaluación.

4. Para finalizar, terminada la evaluación, se busca el vecino para el que conseguimos el valor mínimo de la evaluación y lo almacenamos para compararlo con el resultado que se obtuvo en la primera estrategia de intensificación. Se muestra a continuación la figura 8 donde se exponen las dos opciones de inserción.

Figura 8: Esquema de la inserción de vecinos

Una vez que tenemos los resultados óptimos de las dos estrategias de intensificación se comparan los resultados (nos referimos al valor de la función objetivo obtenido de las evaluaciones) con el valor de la función objetivo actual, es decir, la que le corresponde al vector solución sin realizarse ningún intercambio o inserción.

En el caso de que se realice alguna modificación en el vector solución, se modificará la lista tabú (incrementándose con el Número Tabú el nodo (k,i) de la matriz “ListaTabu”. Si no se realizase ninguna modificación, es decir, que la función objetivo actual sea menor que la ofrecida por el mejor intercambio y la mejor inserción, entonces no se realizaría ninguna acción sobre la Lista Tabú. A continuación se pasaría a estudiar la siguiente posición del vector solución, y así se procedería hasta completar las “nodos paradas” posiciones del vector solución.

(12)

Tras estudiar el último nodo del vector solución, se pasa a comprobar el valor de la función objetivo final con la que se tenía al iniciar la intensificación. Si estos valores son iguales, o si el número de veces que se ha ejecutado la intensificación es mayor a 40 finaliza la intensificación pasando al bloque de Pre-Diversificación, en caso contrario se vuelve a iterar la intensificación.

Bloque Pre-Diversificación: creación de Cadenas Élite

Este es un bloque donde no se modifica el vector solución, sino donde se preparan ciertas estructuras matriciales que serán de utilidad para las estrategias empleadas para diversificar la búsqueda. Inicialmente se realiza la actualización de la Lista Tabú (disminuir los valores de la Lista en una unidad salvo los valores aumentados durante la intensificación).

Posteriormente se procede a la creación de la matriz de cadenas élite. Una cadena élite se define como una cadena de como mínimo 3 nodos que se repite en los últimos vectores solución resultantes de las ultimas intensificaciones (Nos referimos con “últimos” al valor del parámetro “numelite” antes expuesto).

La estrategia de cadenas elite que se ha aplicado deriva de una estrategia propuesta en el año 2000 por Tan K.C., Lee L.H. y Zhu K.Q. [23].Se va a proceder a explicar la metodología para su creación:

1. Una vez se tienen almacenadas como mínimo un número de “numelite” soluciones óptimas locales obtenidas de la intensificación comienza la creación de la matriz de cadenas élite.

2. Se selecciona un elemento del vector solución (1). Se busca en la solución anterior que el elemento seleccionado y los dos posteriores estén los tres seguidos en el mismo orden independientemente de su posición dentro del vector solución de la intensificación anterior (2). Si esto ocurre, se pasa a buscar la misma cadena en el vector solución siguiente (3), y así hasta comprobar los “numelite” vectores soluciones óptimos locales. Si la cadena bajo análisis, se encuentra en todos los vectores solución comprobados, entonces se declara cadena elite, se almacena en la matriz de cadenas élite y el bucle comienza de nuevo.

3. En el caso de que una cadena no se encuentre en todos los vectores solución óptimos locales anteriores, el bucle comienza de nuevo seleccionando el elemento inmediatamente posterior para analizarlo. Este procedimiento se realiza un número de “Numparadas-2” veces, tantas como cadenas diferentes puede haber.

(13)

En la figura 9 se muestra un esquema del proceso:

Figura 9: Cadenas élite

Tras terminar de crear la matriz de cadenas élite comienza el bloque de Diversificación.

Bloque Diversificación

El bloque de diversificación del algoritmo “complejo” sufre dos modificaciones sustanciales respecto al del algoritmo “básico”. Se sustituye la estrategia de diversificación “completamente” aleatoria implementada en el algoritmo “básico” por una estrategia compuesta por dos estrategias simples, la estrategia de cadenas elite y una estrategia basada en listas tabú.

A continuación se explica el procedimiento completo de la diversificación: 1. Primero se selecciona aleatoriamente un elemento (“ele”) del vector

solución, compruebo que es un elemento que no he seleccionado en alguna iteración anterior de la diversificación en la que nos encontramos (se comprueba mediante una lista en forma de vector llamada “ListaTabu2” donde los elementos toman valor uno cuando han sido seleccionados y movidos de su posición), en caso de haber sido seleccionado anteriormente se volvería a escoger aleatoriamente un nuevo nodo (“ele”) como al principio. Una vez superado esa comprobación el algoritmo continúa seguidamente comprobando si el elemento pertenece a una cadena élite o no. En caso de que pertenezca volverá al inicio a seleccionar un nuevo elemento (“ele”) aleatoriamente.

(14)

2. Tras tener seleccionado el elemento que se va a insertar en alguna posición aleatoria del vector solución, se procede a seleccionar la posición donde se va a insertar. El algoritmo no selecciona realmente una posición, sino otro elemento (llamado “coloq”) en cuya posición se insertará el elemento “ele”. El algoritmo comprobará que el elemento seleccionado “coloq” no está en medio de ninguna cadena élite, sin embargo si puede estar en algún extremo. En caso de que sí esté en medio de alguna cadena élite, el algoritmo volverá a seleccionar un elemento “coloq” aleatoriamente. La figura 10 ilustra el mecanismo expuesto:

Figura 10: mecanismo del a diversificación con cadenas élite

3. Después de realizar la inserción, deben comprobarse ciertas condiciones:

 Condición de Inserción: comprueba que tras hacer la inserción no se ha incrementado más del 20% el valor de la función objetivo:

o En caso de que no se haya superado, se aumenta en una unidad el elemento de la matriz “ListaTabu2” (que indica que a lo largo de la diversificación actual no se podrá seleccionar el elemento “ele” otra vez para insertarlo en otra posición), se certifica en el vector solución la inserción realizada, y por último se aumenta en una unidad la variable que cuantifica el número de inserciones realizadas en la diversificación.

(15)

o En caso de que si se haya superado, se selecciona otro elemento-posición “coloq” aleatoriamente y se vuelve a iniciar el proceso de inserción. Si continuamente (50 veces) ocurre esto, es decir, que se aumenta más del 20% el valor de la función objetivo, el algoritmo finaliza esta etapa y pasa a las siguientes condiciones de diversificación.

 Condiciones de Diversificación: aquellas que hacen que se vuelva a iniciar el proceso de diversificación desde el inicio (elección de un elemento para su inserción), son 4. Si se cumple alguna de ellas, el algoritmo finaliza la diversificación, si no se cumple ninguna, vuelve a iterar desde el inicio de la diversificación. Las condiciones son:

o Que se hayan hecho más inserciones que un 10% del número total de nodos destino

o Que la pérdida del valor de la función objetivo sea mayor al máximo permitido “porcenmax” (parámetro del problema )

o Que al realizar alguna inserción haya disminuido la función objetivo (haya mejorado)

o Que se haya producido el salto desde la condición de inserción por incapacidad de insertar el elemento seleccionado.

4. Una vez que se cumple alguna de las Condiciones de Diversificación el algoritmo pasa a la comprobar las condiciones finales, éstas son simplemente dos, y si se cumple alguna de ellas el algoritmo finaliza su ejecución, en caso de cumplirse ninguna las condiciones son las siguientes:

 Que se haya llegado a un número de iteraciones máximo “numeroiteracionesmax”.

 Que se haya producido el anterior salto comentado por incapacidad de inserción o lo que es lo mismo, incapacidad de diversificar respetando las cadenas élites.

Referencias

Documento similar

Resultados de loes recuentos de 54 playas en el año 2021; tipo de playa (A, B i C), superfície de cada playa, número máximo de usuarios en agosto, número máximo de embarcaciones

De este modo se constituye un espacio ontológico y epistemológico a la vez, en el que cada elemento (cada principio) ocupa un lugar determinado en la totalidad, y desde ahí está

Posteriormente los nodos que no son baliza pueden calcular sus posiciones tomando como referencia los nodos baliza primarios y secundarios usando la t´ ecnica de trilate- racion,

El contar con el financiamiento institucional a través de las cátedras ha significado para los grupos de profesores, el poder centrarse en estudios sobre áreas de interés

Entre las rut a s turísticas que ofrece la provi ncia de Castel lón destaca no ta b le men te por su at ra c ti vo e inte rés a rqu eológ ico e históric o , la que p a rtie ndo de la

que hasta que llegue el tiempo en que su regia planta ; | pise el hispano suelo... que hasta que el

Entre los cuatro hermanos se encuentran diferentes sentimientos relacionados con el duelo que están experimentando; echar de menos a sus hermanas pequeñas, saber que no

En su inicialización se debe indicar: los pools de memoria para los nodos y las aristas, la información de cada capa, su orden y el número de estas, el número de atributos de orden