TFG RICARDO SANZ - Archivo Digital UPMoa.upm.es › 45606 › 1 ›...
Transcript of TFG RICARDO SANZ - Archivo Digital UPMoa.upm.es › 45606 › 1 ›...
AGRADECIMIENTOS
A mi familia por su apoyo durante toda la carrera.
A mi tutor Vicente por brindarme su ayuda y dedicacion.
Indice general
1. RESUMEN 11.1. ESPANOL . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1
1.2. ENGLISH . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2
2. INTRODUCCION Y OBJETIVOS 32.1. OBJETIVOS . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 5
2.1.1. PRIMERA FASE . . . . . . . . . . . . . . . . . . . . . . . . . . 5
2.1.2. SEGUNDA FASE . . . . . . . . . . . . . . . . . . . . . . . . . 5
3. BREVE ESTUDIO DEL ALGORITMO 63.0.3. DEFINICION: . . . . . . . . . . . . . . . . . . . . . . . . . . . 6
3.0.4. CARACTERISTICAS PRINCIPALES: . . . . . . . . . . . . . . 7
4. TOMA DE MEDIDAS 8
5. FASE 1 125.1. MAPA CONCEPTUAL 1º FASE . . . . . . . . . . . . . . . . . . . . . . 12
5.2. ESPECIFICACION DE REQUISITOS . . . . . . . . . . . . . . . . . . . 14
5.3. DISENO DE ALTO NIVEL PRIMERA FASE . . . . . . . . . . . . . . . 15
5.4. DISENO DE BAJO NIVEL PRIMERA FASE . . . . . . . . . . . . . . . 15
5.5. PLAN DE PRUEBAS . . . . . . . . . . . . . . . . . . . . . . . . . . . . 17
5.5.1. PRUEBAS UNITARIAS . . . . . . . . . . . . . . . . . . . . . . 17
5.5.2. PRUEBAS DE ENSAMBLAJE . . . . . . . . . . . . . . . . . . 18
5.5.3. CASOS DE USO . . . . . . . . . . . . . . . . . . . . . . . . . . 21
5.6. IMPLEMENTACION PRIMERA FASE . . . . . . . . . . . . . . . . . . 31
5.6.1. LIBRERIAS UTILIZADAS . . . . . . . . . . . . . . . . . . . . 31
5.6.2. OTROS . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 32
5.6.3. CODIGO . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 32
2
5.7. EVALUACION DE LA PRIMERA FASE . . . . . . . . . . . . . . . . . 32
6. FASE 2 346.1. MODIFICACIONES AL PROYECTO . . . . . . . . . . . . . . . . . . . 34
6.2. DIAGRAMA DE GANTT DEL PROYECTO . . . . . . . . . . . . . . . 35
6.3. RE-ANALISIS DE REQUISITOS . . . . . . . . . . . . . . . . . . . . . 37
6.4. MAPA CONCEPTUAL 2º FASE . . . . . . . . . . . . . . . . . . . . . . 39
6.5. DISENO DE ALTO NIVEL 2º FASE . . . . . . . . . . . . . . . . . . . 41
6.6. DISENO DE BAJO NIVEL 2º FASE . . . . . . . . . . . . . . . . . . . . 41
6.7. IMPLEMENTACION 2º FASE . . . . . . . . . . . . . . . . . . . . . . . 43
6.7.1. PROGRAMAS UTILIZADOS . . . . . . . . . . . . . . . . . . . 43
6.7.2. LIBRERIAS UTILIZADAS . . . . . . . . . . . . . . . . . . . . 43
6.7.3. OTROS . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 44
6.7.4. CODIGO . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 44
6.8. PLAN DE PRUEBAS . . . . . . . . . . . . . . . . . . . . . . . . . . . . 44
6.8.1. PRUEBAS UNITARIAS . . . . . . . . . . . . . . . . . . . . . . 45
6.8.2. PRUEBAS DE ENSAMBLAJE . . . . . . . . . . . . . . . . . . 50
6.8.3. CASOS DE USO . . . . . . . . . . . . . . . . . . . . . . . . . . 55
7. RESUMEN Y CONCLUSIONES 697.1. EVALUACION FINAL . . . . . . . . . . . . . . . . . . . . . . . . . . . 69
7.2. CONCLUSIONES . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 72
8. CITAS Y BIBLIOGRAFIA 73
9. ANEXO A: CODIGO DESARROLLADO 1º FASE 749.1. Package Arbol . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 74
9.1.1. Arbol.java . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 74
9.1.2. Elemento.java . . . . . . . . . . . . . . . . . . . . . . . . . . . . 80
9.1.3. LTree.java . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 82
9.1.4. LTree.java . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 87
9.2. Package Grafica . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 89
9.2.1. AA.java . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 89
9.2.2. ChoiceLle.java . . . . . . . . . . . . . . . . . . . . . . . . . . . 109
9.2.3. ChoiceSal.java . . . . . . . . . . . . . . . . . . . . . . . . . . . 117
9.2.4. Dibujo.java . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 125
9.2.5. Pixel.java . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 129
9.2.6. Ventana.java . . . . . . . . . . . . . . . . . . . . . . . . . . . . 131
9.3. Package Grafo . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 136
9.3.1. Grafo.java . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 136
9.3.2. Nodo.java . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 141
3
10. ANEXO B: CODIGO DESARROLLADO 2º FASE 14310.1. Package Arbol . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 143
10.1.1. Arbol.java . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 143
10.1.2. Elemento.java . . . . . . . . . . . . . . . . . . . . . . . . . . . . 150
10.1.3. LTree.java . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 153
10.1.4. LTreeNode.java . . . . . . . . . . . . . . . . . . . . . . . . . . . 159
10.2. Package Grafica . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 161
10.2.1. AA.java . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 161
10.2.2. ChoiceLle.java . . . . . . . . . . . . . . . . . . . . . . . . . . . 181
10.2.3. ChoiceSal.java . . . . . . . . . . . . . . . . . . . . . . . . . . . 190
10.2.4. Dibujo.java . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 199
10.2.5. menuayuda.java . . . . . . . . . . . . . . . . . . . . . . . . . . . 208
10.2.6. menumapa.java . . . . . . . . . . . . . . . . . . . . . . . . . . . 212
10.2.7. Pixel.java . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 216
10.2.8. Principal.java . . . . . . . . . . . . . . . . . . . . . . . . . . . . 218
10.2.9. Ventana.java . . . . . . . . . . . . . . . . . . . . . . . . . . . . 219
10.3. Package Grafo . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 229
10.3.1. Grafo.java . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 229
10.3.2. Nodo.java . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 234
Escuela Tecnica Superior de Ingenieros Informaticos Enero 2016
Capıtulo 1
RESUMEN
1.1. ESPANOLEl presente proyecto tratara sobre la aplicacion de un algoritmo que ayude a tomar
decisiones en un grafo para llegar desde un nodo a otro. Dicho grafo representara el mapa
de la ciudad de Valencia, el cual tendra tantos nodos como estaciones existan. Para dicho
proyecto el objetivo es preparar y documentar el proceso que se darıa a lo largo de un
proyecto real de software estableciendo ası tanto los requisitos como los disenos de alto ybajo nivel para el mismo, un plan de pruebas, la implementacion del proyecto en lengua-
je java y una evaluacion final que ayude a determinar la solidez de la aplicacion de ese
algoritmo en dicho grafo.
Al igual que en los proyectos software, el desarrollo del mismo se hara en varias fases
bien definidas entre sı, en las cuales se ira depurando y mejorando. Dada la dificultad
del proyecto, el numero de fases establecidas ha sido de dos. En ambas se aplicaran los
mismos criterios de programacion y desarrollo de la documentacion, entregandose ası en
la memoria de seguimiento la primera fase del proyecto casi en su totalidad siendo de esta
forma establecida como primer Deadline de entrega del proyecto.
La segunda fase, se dedicara a cumplir con los requisitos que no hayan sido superados
a lo largo del primer ciclo o que se hayan decidido anadir tras la finalizacion de la primera
fase (re-analisis), finalizando ası todo el proyecto en la entrega del segundo Deadline y ha-
biendo solucionado los posibles errores de implementacion encontrados en la evaluacion
de la primera fase.
R.Sanz 1
Escuela Tecnica Superior de Ingenieros Informaticos Enero 2016
1.2. ENGLISHThe following project will show the application of decision making algorythms in the
selection of the fastest path between two nodes. This selection will be done in a specific
graph: Valencia’s Underground System. The number of nodes will be defined by the num-
ber of stations that this map has.
This project will be defined and done like a software engineering project, establishing
a system of requirements, the high level design and the low level design. Also, a system
test will be done and the implementation of the proyect using Java language. Finally, an
evaluation will be applied using the test system in order to find out the mistakes and sub-
sequently,in a second phase fix them.
The second phase will be used to finish all the requirements (including the new ones)
and the mistakes of the first phase will be arranged.
There will be two deadlines along the development: the first one will coincide with the
delivery of the tracking memory and the second one will be on the delivery of the finalmemory.
R.Sanz 2
Escuela Tecnica Superior de Ingenieros Informaticos Enero 2016
Capıtulo 2
INTRODUCCION Y OBJETIVOS
En la actualidad, la aplicacion de diferentes algoritmos matematicos se encuentra en
todos los ambitos de nuestra vida. Desde las busquedas mas sencillas que un usuario
puede hacer en un buscador de internet, hasta los sistemas de geoposicionamiento mas
sofisticados del momento.
Estos algoritmos, tienen una mayor o menor capacidad de adaptacion a la resolucion de
ciertos problemas, resultando ası mas o menos utiles segun que problemas necesitemos
resolver. Con el actual crecimiento exponencial de los nucleos urbanos, los sistemas de
transporte se han ido sofisticando y agrandando en funcion de las necesidades, llegando a
un punto en el cual, el usuario necesita la ayuda de sistemas informaticos que le puedan
orientar tanto para localizar el destino al que quieren llegar como la forma de llegar a ese
destino.
Este proyecto, pretende abordar la problematica de estos usuarios, centrandolo en las
busquedas de caminos mas cortos para llegar desde su origen a su destino y aplicandolo
mas concretamente a los sistemas de metro que tantas ciudades poseen en todo el mundo
y a su vez, presentando de forma grafica una interfaz amigable que permita mostrarles el
resultado de la busqueda en cuestion.
De entre todos los algoritmos existentes en la actualidad para localizar el camino de me-
nor coste, se utilizara el Algoritmo a Estrella cuya definicion viene dada por la siguiente
afirmacion (entre otras): .El algoritmo A* se clasifica dentro de los algoritmos de busquedainformados. Encuentra siempre y cuando se cumplan unas determinadas condiciones, elcamino de menor coste entre un vertice origen y uno destino.
El problema de algunos algoritmos de busqueda en grafos informados, es que se guıanen exclusiva por la funcion heurıstica, la cual puede no indicar el camino de coste mas
R.Sanz 3
Escuela Tecnica Superior de Ingenieros Informaticos Enero 2016
bajo, o por el coste real de desplazarse de un nodo a otro. Pudiendose dar el caso deque sea necesario realizar un movimiento de coste mayor para alcanzar la solucion. Seda por ello el hecho de que un buen algoritmo de busqueda informada deberıa tener encuenta ambos factores, el valor heurıstico de los nodos y el coste real recorrido.
Ası, el algoritmo A* utiliza una funcion de evaluacion F = G + H, donde H represen-ta el valor heurıstico del nodo a evaluar desde el actual hasta el nodo de destino. Y G elcoste real del camino recorrido para llegar a dicho nodo destino.[2]”
R.Sanz 4
Escuela Tecnica Superior de Ingenieros Informaticos Enero 2016
2.1. OBJETIVOSLos objetivos son:
Breve estudio del algoritmo.
2.1.1. PRIMERA FASE1. Analisis del problema.
2. Analisis de requisitos: Elegir el orden de los problemas, estableciendo unos requi-
sitos que permitan solucionarlos.
3. Disenos de alto y bajo nivel.
4. Plan de pruebas.
5. Implementacion y codificacion:
Implementar el algoritmo.
Crear una interfaz grafica.
6. Evaluacion de la primera fase: Aplicar el plan de pruebas para depurar y mejorar el
proyecto en una segunda fase pasado el primer Deadline.
2.1.2. SEGUNDA FASE1. Reanalisis del problema partiendo de los datos obtenidos en la primera fase.
2. Revision de los requisitos para la segunda fase.
3. Cambios en el diseno de alto y bajo nivel en el caso de ser necesarios.
4. Implementacion y codificacion:
Mejorar la implementacion del algoritmo su fuera necesario.
Modificar la interfaz grafica para que quede de forma definitiva.
5. Evaluacion de la segunda fase.
R.Sanz 5
Escuela Tecnica Superior de Ingenieros Informaticos Enero 2016
Capıtulo 3
BREVE ESTUDIO DEL ALGORITMO
En esta seccion se introducira de forma orientativa el algoritmo siguiendo distintas
definiciones encontradas por Internet [4].
3.0.3. DEFINICION:El algoritmo de busqueda A* se clasifica dentro de los algoritmos de busqueda en
grafos. Presentado por primera vez en 1968 por Peter E. Hart, Nils J. Nilsson y BertramRaphael, el algoritmo A* encuentra, siempre y cuando se cumplan unas determinadascondiciones, el camino de menor coste entre un nodo origen y uno objetivo.
El problema de algunos algoritmos de busqueda es que se guıan en exclusiva por lafuncion heurıstica, la cual puede no indicar el camino de coste mas bajo, o por el costereal de desplazarse de un nodo a otro (como los algoritmos de escalada), pudiendose darel caso de que sea necesario realizar un movimiento de coste mayor para alcanzar lasolucion.
Es por ello que un buen algoritmo de busqueda informada deberıa tener en cuenta ambosfactores, el valor heurıstico de los nodos y el coste real del recorrido.
Ası, el algoritmo A* utiliza una funcion de evaluacion:
f(n) = g(n) + h′(n) (3.1)
Donde,
g(n) : el coste real del camino recorrido para llegar a dicho nodo, n, desde el nodo inicialh′(n) : representa el valor heurıstico del nodo a evaluar
R.Sanz 6
Escuela Tecnica Superior de Ingenieros Informaticos Enero 2016
A su vez, A* mantiene dos estructuras de datos auxiliares, que podemos denominar abier-tos, implementado como una cola de prioridad (ordenada por el valor f(n) de cada no-do), y cerrados, donde se guarda la informacion de los nodos que ya han sido visitados.En cada paso del algoritmo, se expande el nodo que este primero en abiertos, y en casode que no sea un nodo objetivo, calcula la f(n) de todos sus hijos, los inserta en abiertos,y pasa el nodo evaluado a cerrados.
3.0.4. CARACTERISTICAS PRINCIPALES:Como todo algoritmo de busqueda en amplitud, A* es un algoritmo completo: en
caso de existir una solucion, siempre dara con ella.
Si para todo nodo n del grafo se cumple g(n) = 0, nos encontramos ante una busquedavoraz. Si para todo nodo n del grafo se cumple h(n) = 0, A* pasa a ser una busqueda decoste uniforme no informada.
Para garantizar la optimizacion del algoritmo, la funcion h(n) debe ser heurıstica ad-misible, esto es, que no sobrestime el coste real de alcanzar el nodo objetivo.
De no cumplirse dicha condicion, el algoritmo pasa a denominarse simplemente A, ya pesar de seguir siendo completo, no se asegura que el resultado obtenido sea el ca-mino de coste mınimo. Asimismo, si garantizamos que h(n) es consistente (o monotona),es decir, que para cualquier nodo n y cualquiera de sus sucesores, el coste estimado dealcanzar el objetivo desde n no es mayor que el de alcanzar el sucesor mas el coste dealcanzar el objetivo desde el sucesor.
R.Sanz 7
Escuela Tecnica Superior de Ingenieros Informaticos Enero 2016
Capıtulo 4
TOMA DE MEDIDAS
La toma de medidas se ha realizado con la herramienta de medicion de Google Maps.
Dichas medidas son aproximadas ya que se han ajustado algunas a mano para la rea-
lizacion de pruebas. A continuacion se muestran algunas imagenes extraıdas de dicho
proceso. No se ha tomado ninguna estacion como referencia al tratarse de un grafo por lo
que la medicion se ha hecho entre estaciones sin dejar ninguna variacion entre medias.
Posicionamiento de estaciones de metro y cercanıas de Valencia:
R.Sanz 8
Escuela Tecnica Superior de Ingenieros Informaticos Enero 2016
Situacion geografica de todo el plano zonal valenciano:
Gracias a la tecnologıa desarrollada por Google Maps, se puede superposicionar el plano
zonal de transportes de Valencia para trabajar sobre el terreno. Esto ha sido de gran ayuda
ya que si hubiera sido de otra forma, se habrıan dado serios problemas debido a que el
tiempo habrıa sido todavıa mucho mayor del que ha sido hasta ahora, que ya ha supuesto
demasiado.
R.Sanz 9
Escuela Tecnica Superior de Ingenieros Informaticos Enero 2016
Confluencia de varias lineas en una misma estacion:
Ejemplos de extraccion de medidas con google maps:
R.Sanz 10
Escuela Tecnica Superior de Ingenieros Informaticos Enero 2016
R.Sanz 11
Escuela Tecnica Superior de Ingenieros Informaticos Enero 2016
Capıtulo 5
FASE 1
En esta seccion se detallara el desarrollo de todo el proyecto al completo. Ambas fases
vendran detalladas en la memoria de forma que se puedan ver los cambios que se han ido
realizando a lo largo del mismo.
5.1. MAPA CONCEPTUAL 1º FASEEn esta seccion se muestra un mapa conceptual de las principales funciones de la apli-
cacion. Las ’extras’ como cargado y guardado de rutas no se muestran.
Como podemos observar, el usuario mediante su computadora seleccionara una estacion
origen y una estacion destino de las que estan incluidas en el metro de Valencia. Una
vez realizada dicha seleccion, el usuario pulsara el boton ’Send’ el cual dara la orden de
busqueda de la ruta mas corta al algoritmo implementado en el desarrollo.
A su vez, se generara una ventana emergente la cual mostrara por pantalla la ruta es-
cogida por el algoritmo, dando una lista detallada de las estaciones y la lınea al a que
pertenece dicha estacion (el itinerario a seguir por el usuario). Una vez mostrado, el usua-
rio volvera a obtener el control del programa.
R.Sanz 12
Escuela Tecnica Superior de Ingenieros Informaticos Enero 2016
5.2. ESPECIFICACION DE REQUISITOSEn la siguiente seccion se describen los requisitos establecidos en una reunion pre-
desarrollo. Como se podra comprobar, estan divididos en dos clases: de Sistema y de
Interfaz. En los primeros se detallaran los requisitos relativos a que pautas deben seguir-
se y cumplirse para crear el proyecto. En los requisitos de Interfaz se detallara que debe
cumplirse a la hora de crear la interfaz grafica del proyecto.
La especificacion de requisitos y su organizacion se basa en el estandar IEEE-STD-830-
1998 [1]:
1. Sistema
1.1. El Sistema tendra que contener tantos nodos como estaciones tenga el metro
de Valencia
1.2. El Sistema implementara el algoritmo a estrella para calcular el camino de
menor coste.
1.3. El Sistema funcionara de forma autonoma y sin conexion a Internet.
1.4. El Sistema debera estar implementado en Java, utilizando una librerıa espe-
cializada.
1.5. El Sistema debera ser aplicable a cualquier red de metro en caso de ser nece-
sario.
NOTA: Se debera encontrar una solucion generica al problema que aplique el algoritmo y permita ser utilizado para
cualquier red de metro cambiando los datos de las estaciones en cuestion.
2. Interfaz
2.1. El Sistema mostrara una lista de todas las estaciones por las que debera pasar
para llegar desde el origen al destino.
2.2. El Sistema permitira al usuario seleccionar la estacion de origen.
2.3. El Sistema permitira al usuario seleccionar la estacion destino.
2.4. El Sistema tendra una interfaz grafica depurada que muestre las estaciones de
forma intuitiva y sencilla.
2.4.1. El Sistema sera lo mas fiel posible a la regla de los 3 clics [5]
2.4.2. El Sistema permitira salir de la aplicacion mediante el correspondiente
boton.
2.4.3. El Sistema ofrecera la posibilidad de mostrar quien ha sido el desarrolla-
dor del sistema.
R.Sanz 14
Escuela Tecnica Superior de Ingenieros Informaticos Enero 2016
5.3. DISENO DE ALTO NIVEL PRIMERA FASELa arquitectura utilizada para el diseno de alto nivel de la aplicacion, es la arquitectura
basada en capas, la cual esta formada por tres en este caso:
Capa de Presentacion: La interfaz grafica, la cual estara de cara a los usuarios de la
aplicacion.
Capa de Negocio: En esta capa se situa toda la implementacion interna del algoritmo
a estrella, la cual se encargara de procesar las rutas encontrando el camino mas corto
para cada peticion que haga el usuario.
Capa de Datos: Esta capa contendra todos los datos extraıdos del metro de Valencia
y los cuales seran la fuente en la cual se apoyara la capa de Negocio para realizar
las busquedas.
5.4. DISENO DE BAJO NIVEL PRIMERA FASEEl diseno de Bajo Nivel ha sido creado con la herramienta ObjectAid UML Explorer
para el entorno de desarrollo Eclipse.
R.Sanz 15
Escuela Tecnica Superior de Ingenieros Informaticos Enero 2016
5.5. PLAN DE PRUEBASEl siguiente plan se ha disenado para poner a prueba de tres formas distintas el proyec-
to. A pesar de ser pocas pruebas, las funciones principales del programa han sido cubiertas
en esta primera fase. En las pruebas unitarias lo mas importante es la comprobacion del
algoritmo (ver que calcula bien la ruta que se elija y que devuelve la lista de estaciones
por las que pasar a modo de itinerario del camino mas corto).
Respecto a las pruebas de ensamblaje, lo mas importante es probar los 4 puntos crıticos
del sistema que son los puntos donde interfaz grafica y codigo se unen: las pulsaciones de
los botones, las selecciones de las estaciones y la devolucion de la ruta en cuestion en una
ventana emergente.
Por ultimo, como pruebas definitivas, se han disenado varios casos de uso en los cua-
les la utilizacion del software sera puesto a prueba, y el algoritmo tendra que buscar rutas
cada vez mas complicadas.
5.5.1. PRUEBAS UNITARIASSeleccion del camino mas corto (prueba del algoritmo):
• Objetivo: Dada una estacion origen y una estacion destino, la aplicacion de-
bera devolver una ruta que sea la del camino mas corto para llegar de una
estacion a otra
• Resultado: SATISFACTORIO
Como ejemplo, para la estaciones seleccionadas: Alameda y Alboraya Palmaret, el
camino devuelto es el siguiente:
R.Sanz 17
Escuela Tecnica Superior de Ingenieros Informaticos Enero 2016
5.5.2. PRUEBAS DE ENSAMBLAJESeleccion de estacion origen:
• Objetivo: Buscar mediante scroll vertical la estacion de origen que el usuario
quiera seleccionar.
• Resultado: SATISFACTORIO
Seleccion de estacion destino:
• Objetivo: Buscar mediante scroll vertical la estacion de destino que el usuario
quiera seleccionar.
• Resultado: SATISFACTORIO
R.Sanz 18
Escuela Tecnica Superior de Ingenieros Informaticos Enero 2016
Seleccion de Envıo de informacion:
• Objetivo: Una vez superadas las dos pruebas anteriores, Pulsado de boton
Aceptar. Debe devolver una ventana emergente con una lista de estaciones.
• Resultado: SATISFACTORIO
Ensamblado de Interfaz grafica con modulo de codigo:
• Objetivo: Comprobar que todas las selecciones y botones realizan su funcion.
Seleccionar estacion de origen y estacion destino. Una vez seleccionadas pul-
sar Aceptar.
• Devuelve: Debe generar una ventana emergente en la cual aparecera una lista
de las estaciones en cuestion que sigue el camino calculado.
• Resultado: SATISFACTORIO
R.Sanz 19
Escuela Tecnica Superior de Ingenieros Informaticos Enero 2016
R.Sanz 20
Escuela Tecnica Superior de Ingenieros Informaticos Enero 2016
5.5.3. CASOS DE USOEn esta seccion se detallan algunos casos de uso utilizados para poner a prueba la
aplicacion. Van de menor a mayor dificultad.
De una estacion a otra adyacente:
Nombre Trayecto de estaciones adyacentes
Actores Usuario
Funcion Saber cual es el itinerario mas corto entre dos estaciones adyacen-
tes
Descripcion El usuario puede elegir una estacion origen y una estacion des-
tino que sean adyacentes. El usuario puede pulsar aceptar una vez
seleccionadas y recibir el itinerario de las estaciones por las que
pasara el metro.
Origen: Empalme (Linea 4)
Destino: Palau de Congressos (Linea 4)
R.Sanz 21
Escuela Tecnica Superior de Ingenieros Informaticos Enero 2016
R.Sanz 22
Escuela Tecnica Superior de Ingenieros Informaticos Enero 2016
De una estacion a otra de la misma linea:
Nombre Trayecto de una lınea sin transbordos
Actores Usuario
Funcion Saber cual es el itinerario mas corto entre dos estaciones de la
misma linea
Descripcion El usuario puede elegir una estacion origen y una estacion destino
dentro de la misma linea de metro. El usuario puede pulsar aceptar
una vez seleccionadas y recibir el itinerario de las estaciones por
las que pasara el metro.
Origen: Empalme (Linea 4)
Destino: Transits (Linea 4)
R.Sanz 23
Escuela Tecnica Superior de Ingenieros Informaticos Enero 2016
R.Sanz 24
Escuela Tecnica Superior de Ingenieros Informaticos Enero 2016
De una estacion a otra de una linea distinta con un transbordo:
Nombre Trayecto de varias lineas con un transbordo
Actores Usuario
Funcion Saber cual es el itinerario mas corto entre dos estaciones de dis-
tintas lineas
Descripcion El usuario puede elegir una estacion origen y una estacion destino
situadas en dos lineas distintas siempre y cuando solo haya un
transbordo entre ellas. El usuario puede pulsar aceptar una vez
seleccionadas y recibir el itinerario de las estaciones por las que
pasara el metro.
Origen: Sagunt (Linea 4)
Destino: Orriols (Linea 6)
R.Sanz 25
Escuela Tecnica Superior de Ingenieros Informaticos Enero 2016
R.Sanz 26
Escuela Tecnica Superior de Ingenieros Informaticos Enero 2016
De una estacion a otra de una linea distinta con dos transbordos:
Nombre Trayecto de una linea con dos transbordos
Actores Usuario
Funcion Saber cual es el itinerario mas corto entre dos estaciones de dis-
tintas lineas
Descripcion El usuario puede elegir una estacion origen y una estacion des-
tino situadas en dos lineas distintas siempre y cuando haya dos
transbordo entre ellas. El usuario puede pulsar aceptar una vez
seleccionadas y recibir el itinerario de las estaciones por las que
pasara el metro.
Origen: Palau de Congressos (Linea 4)
Destino: Mislata (Linea 3)
R.Sanz 27
Escuela Tecnica Superior de Ingenieros Informaticos Enero 2016
R.Sanz 28
Escuela Tecnica Superior de Ingenieros Informaticos Enero 2016
Usuario quiere ver quien desarrollo el proyecto:
Nombre Ver desarrollador
Actores Usuario
Funcion Consultar quien ha desarrollado la aplicacion
Descripcion El usuario puede consultar quien es ha desarrollado de la aplica-
cion
Hacer click en ’Archivo’, ’A cerca de...’
R.Sanz 29
Escuela Tecnica Superior de Ingenieros Informaticos Enero 2016
Usuario quiere salir del programa
Nombre Salir del programa
Actores Usuario
Funcion Salir del programa sin haber hecho una busqueda
Descripcion El usuario puede salir del programa sin haber hecho una busqueda
previamente sin tener que cerrar la ventana de forma abrupta
Hacer click en ’Archivo’, ’Salir’
R.Sanz 30
Escuela Tecnica Superior de Ingenieros Informaticos Enero 2016
5.6. IMPLEMENTACION PRIMERA FASE
5.6.1. LIBRERIAS UTILIZADASPara el desarrollo del proyecto se han utilizado especıficamente dos librerıas externas
de Java a parte de las que vienen por defecto:
Java Decision Diagram Libraries:
Esta librerıa se puede localizar el siguiente enlace [6]:
http://java-decision-diagram-libraries.soft112.com/
This project contains two different Binary Decision Diagrams (BDD) libraries:
1. JBDD: a Java interface to two popular BDD libraries, CUDD and BuDDy.
2. JDD: a native Java library supporting BDD, Z-BDD and more (graph/automata/Pe-
tri nets/SAT).
Net Datastructures 5:
Esta librerıa se puede localizar en el siguiente enlace [7]:
http://net3.datastructures.net/
net.datastructures is a Java package containing a collection of Java interfaces and clas-
ses that implement fundamental data structures and algorithms, such as: sequences, trees,
priority queues, search trees, hash tables sorting algorithms graphs, their traversals, and
applications, (e.g. shortest paths) The package was designed for educational use. It pro-
vides a set of functional components defined by simple APIs and easy to use. The code
is readable, reliable, asymptotically efficient, and object-oriented. Programming can be
done through interfaces only, with knowledge of specific implementations necessary only
for specialized applications. net.datastructures has been developed at Brown University
and at the University of California, Irvine. The work on this project was supported in part
by the National Science Foundation under grants DUE-0231202 and DUE-0231467.
R.Sanz 31
Escuela Tecnica Superior de Ingenieros Informaticos Enero 2016
5.6.2. OTROS
ObjectAir UML Explorer
Herramienta de visualizacion de codigo creada para el IDE de Eclipse. Permite ver
en tiempo real el codigo implementado dentro de un proyecto como si fuera un diagrama
UML.[8].
Latex
Toda la memoria del proyecto ha sido realizada en Latex, utilizando diversas librerıas
de insercion de codigo para los Anexos finales.[9].
5.6.3. CODIGOTodo el codigo desarrollado en el ciclo 1 se podra ver en el Anexo B situado al final
de la Memoria de Seguimiento.
El lenguaje utilizado es Java, con el entorno Eclipse Jee Neon. Las librerıas ya men-
cionadas en la seccion anterior son las que se han utilizado para desarrollar el proyecto.
5.7. EVALUACION DE LA PRIMERA FASEEn general el desarrollo del proyecto ha sido un poco complicado desde el punto de
vista de tener que compaginar toda la documentacion con el desarrollo del algoritmo.
Inicialmente con la creacion del mapa conceptual se pudo aproximar una idea muy gene-
ralizada del objetivo de la aplicacion pudiendo ası perfilar lo que serıa posteriormente el
proyecto una vez se ahondase en el mismo.
Una vez visto el objetivo que se pretendıa conseguir, toda la atencion se centro en la
busqueda de unos requisitos que pudieran acotar el problema a resolver por parte del
creador del proyecto y a su vez tomar un primer contacto con la supuesta organizacion
del codigo a desarrollar. La inversion de tiempo en lo que a los disenos de Alto y Bajo
nivel se refiere, quedaron un poco descompensadas desde el punto de vista del desarrollo
puesto que se fueron dando cambios que pudieran ayudar a implementar de una forma
mas sencilla el proyecto en detrimento de la idea inicial.
Respecto al plan de pruebas, se diferenciaron tres tipos de pruebas: unitarias, ensamblaje
y casos de uso. Teniendo en cuenta el enfoque del desarrollo, se considero que el plan
creado era mas que suficiente para poner a prueba todo el software, tanto la parte grafica
R.Sanz 32
Escuela Tecnica Superior de Ingenieros Informaticos Enero 2016
como el codigo interno de la aplicacion.
Una vez definidos todos los pasos anteriores se comenzo con el desarrollo de la aplicacion.
Inicialmente fue bastante costoso, llevandome a invertir mas horas de las previstas en el
plan de trabajo puesto que debıa introducir los datos de todas las estaciones del Metro de
Valencia por lo que no me quedo mas remedio que invertir horas extras (aproximadamen-
te 10 horas entre localizacion de las estaciones, calculos pertinentes e introduccion de la
informacion de las mismas en java). La implementacion del algoritmo me llevo a invertir
practicamente la mayorıa de las horas planificadas ya que tenıa conocimientos previos
sobre como implementar interfaces graficas.
Una vez implementado todo el proyecto correspondiente a la primera fase, comenzo la
aplicacion de las pruebas del plan creado para localizar errores. El fallo mas grande que
se dio y que sera corregido es el ya mencionado anteriormente (error de envio al no se-
leccionar ninguna estacion, caso no tratado). Por otro lado, se detecto cierta inestabilidad
a la hora de representar por pantalla el listado de estaciones, pero a diferencia del error
anterior, al incluir la segunda fase el arreglo de la interfaz, se espera que sea subsanado
cuando se hagan los cambios.
Como conclusion del proceso de desarrollo de la primera fase del proyecto, se puede
afirmar sin duda alguna que esta siendo un exito la implementacion del algoritmo (a pesar
de las dificultades tenidas al principio del mismo) habiendose cumplido los requisitos:
1.1, 1.2, 1.3, 1.4, 1.5, 2.1, 2.2, 2.3, 2.4.1, 2.4.2, 2.4.3.
R.Sanz 33
Escuela Tecnica Superior de Ingenieros Informaticos Enero 2016
Capıtulo 6
FASE 2
6.1. MODIFICACIONES AL PROYECTOEn este capıtulo se describen los objetivos del trabajo modificados para la finalizacion
del proyecto. Durante toda la primera fase, se han ido cumpliendo las metas y requisitos
establecidos para la misma, llegando a un grado de completud bastante alto. Despues de
la entrega intermedia, y a modo de reunion orientativa, se establecieron nuevos objeti-
vos, los cuales estarıan directamente basados y relacionados con los de la primera fase.
Cabe destacar que el metodo de trabajo ha sido exactamente el mismo y el esfuerzo de
horas se ha volcado aproximadamente de la misma manera que en la primera fase, con
la excepcion de que al estar parte de la documentacion hecha, algunas de estas horas se
han utilizado para optimizar el codigo y mejorar su legibilidad en la seccion de interfaz
grafica, buscar algunos nuevos requisitos y preparar un plan de pruebas que fuera acorde
con los mismos de forma que todo quedase mucho mas completo.
A nivel estructural del presente documento (Memoria Final), se puede afirmar que no ha
cambiado nada ya que unicamente han sido anadidas las partes relativas a la segunda fase.
A excepcion de lo mencionado, el proyecto ha seguido su curso en torno a la organizacion
ya establecida en la reunion inicial.
R.Sanz 34
Escuela Tecnica Superior de Ingenieros Informaticos Enero 2016
6.2. DIAGRAMA DE GANTT DEL PROYECTOEn la figura anadida en la pagina siguiente se puede observar la organizacion a lo largo
de sus 324 horas de duracion. Al ser una modificacion del diagrama del Plan de Trabajo,
se podra observar que el numero de horas dedicadas a las tareas mencionadas anterior-
mente han sido modificadas y a su vez, se han eliminado los tres objetivos descritos al
final de la seccion ’Revision de la lista de objetivos’. Igualmente, la suma de todas las
horas del proyecto sigue siendo 324, por lo que se considera que la carga de trabajo asig-
nada es la adecuada.
En la pagina siguiente se muestra el diagrama de Gantt modificado.
R.Sanz 35
Escuela Tecnica Superior de Ingenieros Informaticos Enero 2016
R.Sanz 36
Escuela Tecnica Superior de Ingenieros Informaticos Enero 2016
6.3. RE-ANALISIS DE REQUISITOSEn la siguiente seccion se describen los requisitos establecidos en una reunion inter-
media realizada despues de la entrega de la primera fase. Como se podra comprobar, estan
divididos en dos clases: de Sistema y de Interfaz. En los primeros se detallaran los re-
quisitos relativos a que pautas deben seguirse y cumplirse para crear el proyecto. En los
requisitos de Interfaz se detallara que debe cumplirse a la hora de crear la interfaz grafica
del proyecto.
Para esta segunda fase, se ha realizado el anadido de varios requisitos debido a que en
la primera fase se pudo cumplir relativamente bien con los plazos de entrega. Se ha acen-
tuado sobre todo el esfuerzo en la mejora de la interfaz grafica y el anadido de la funcio-
nalidad de mapa.
La especificacion de requisitos y su organizacion se basa en el estandar IEEE-STD-830-
1998 [1]:
1. Sistema
1.1. El Sistema tendra que contener tantos nodos como estaciones tenga el metro
de Valencia
1.2. El Sistema implementara el algoritmo a estrella para calcular el camino de
menor coste.
1.3. El Sistema funcionara de forma autonoma y sin conexion a Internet.
1.4. El Sistema debera estar implementado en Java, utilizando una librerıa espe-
cializada.
1.5. El Sistema debera ser aplicable a cualquier red de metro en caso de ser nece-
sario.
1.6. El Sistema debera permitir el anadido de modulos complementarios que per-
mitan aumentar el numero de funcionalidades de forma limpia.
NOTA: Se debera encontrar una solucion generica al problema que aplique el algoritmo y permita ser utilizado para
cualquier red de metro cambiando los datos de las estaciones en cuestion.
2. Interfaz
2.1. El Sistema mostrara una lista de todas las estaciones por las que debera pasar
para llegar desde el origen al destino.
2.2. El Sistema permitira al usuario seleccionar la estacion de origen.
2.3. El Sistema permitira al usuario seleccionar la estacion destino.
2.4. El Sistema tendra una interfaz grafica depurada que muestre las estaciones de
forma intuitiva y sencilla.
2.4.1. El Sistema sera lo mas fiel posible a la regla de los 3 clics [5]
R.Sanz 37
Escuela Tecnica Superior de Ingenieros Informaticos Enero 2016
2.4.2. El Sistema permitira salir de la aplicacion mediante el correspondiente
boton.
2.4.3. El Sistema ofrecera la posibilidad de mostrar quien ha sido el desarrolla-
dor del sistema.
2.5. El sistema ofrecera de forma limpia la ruta en una ventana emergente.
2.5.1. Dicha ventana emergente podra ser cerrada de forma individual y sin cau-
sar fallos al resto de la aplicacion.
2.6. El sistema ofrecera la opcion de poder ver el mapa del metro de la ciudad en
cuestion en una ventana emergente.
2.6.1. Dicha ventana emergente podra ser cerrada de forma individual y sin cau-
sar fallos al resto de la aplicacion.
2.7. El sistema ofrecera en cada ventana de la aplicacion la opcion de salir median-
te un boton.
2.8. El sistema ofrecera un boton en la ventana principal de la aplicacion llamado
Ayuda que ofrezca informacion a los usuarios de la misma.
R.Sanz 38
Escuela Tecnica Superior de Ingenieros Informaticos Enero 2016
6.4. MAPA CONCEPTUAL 2º FASEEn esta seccion se muestra un mapa conceptual de las funciones de la aplicacion.
Como podemos observar, el usuario mediante su computadora seleccionara una estacion
origen y una estacion destino de las que estan incluidas en el metro de Valencia. Una
vez realizada dicha seleccion, el usuario pulsara el boton ’Send’ el cual dara la orden de
busqueda de la ruta mas corta al algoritmo implementado en el desarrollo.
A su vez, se generara una ventana emergente la cual mostrara por pantalla la ruta es-
cogida por el algoritmo, dando una lista detallada de las estaciones y la lınea a la que
pertenece dicha estacion (el itinerario a seguir por el usuario). Una vez mostrado, el usua-
rio volvera a obtener el control del programa.
Por otro lado, el usuario podra observar en todo momento el mapa del metro accediendo
a el desde el menu superior de la aplicacion y/o consultar el menu de ayudas situado en el
boton que la aplicacion tendra al sur de su ventana principal.
R.Sanz 39
Escuela Tecnica Superior de Ingenieros Informaticos Enero 2016
6.5. DISENO DE ALTO NIVEL 2º FASEComo ya se comento en la primera fase, la arquitectura utilizada para el diseno de alto
nivel de la aplicacion, es la arquitectura basada en capas, la cual esta formada por tres en
este caso:
Capa de Presentacion: La interfaz grafica, la cual estara de cara a los usuarios de la
aplicacion.
Capa de Negocio: En esta capa se situa toda la implementacion interna del algoritmo
a estrella, la cual se encargara de procesar las rutas encontrando el camino mas corto
para cada peticion que haga el usuario.
Capa de Datos: Esta capa contendra todos los datos extraıdos del metro de Valencia
y los cuales seran la fuente en la cual se apoyara la capa de Negocio para realizar
las busquedas.
Al haberla definido ası de inicio, no se ha modificado por lo que queda exactamente
igual.
6.6. DISENO DE BAJO NIVEL 2º FASEEn esta seccion se podran observar los cambios que se han producido a nivel de codigo
en el programa. El diseno de Bajo Nivel ha sido creado con la herramienta ObjectAid
UML Explorer para el entorno de desarrollo Eclipse (se habla a cerca de la misma en la
subseccion ”3.13.1 Programas Utilizados”).
R.Sanz 41
Escuela Tecnica Superior de Ingenieros Informaticos Enero 2016
6.7. IMPLEMENTACION 2º FASE
6.7.1. PROGRAMAS UTILIZADOSPara la creacion de la cabecera y modificacion de parte del plano de metro utilizado
se ha aprendido a utilizar Adobe Photoshop CC 2017.
6.7.2. LIBRERIAS UTILIZADASPara el desarrollo del proyecto se han utilizado especıficamente dos librerıas externas
de Java a parte de las que vienen por defecto:
Java Decision Diagram Libraries:
Esta librerıa se puede localizar el siguiente enlace [6]:
http://java-decision-diagram-libraries.soft112.com/
This project contains two different Binary Decision Diagrams (BDD) libraries:
1. JBDD: a Java interface to two popular BDD libraries, CUDD and BuDDy.
2. JDD: a native Java library supporting BDD, Z-BDD and more (graph/automata/Pe-
tri nets/SAT).
Net Datastructures 5:
Esta librerıa se puede localizar en el siguiente enlace [7]:
http://net3.datastructures.net/
net.datastructures is a Java package containing a collection of Java interfaces and clas-
ses that implement fundamental data structures and algorithms, such as: sequences, trees,
priority queues, search trees, hash tables sorting algorithms graphs, their traversals, and
applications, (e.g. shortest paths) The package was designed for educational use. It pro-
vides a set of functional components defined by simple APIs and easy to use. The code
is readable, reliable, asymptotically efficient, and object-oriented. Programming can be
done through interfaces only, with knowledge of specific implementations necessary only
for specialized applications. net.datastructures has been developed at Brown University
and at the University of California, Irvine. The work on this project was supported in part
by the National Science Foundation under grants DUE-0231202 and DUE-0231467.
R.Sanz 43
Escuela Tecnica Superior de Ingenieros Informaticos Enero 2016
6.7.3. OTROS
ObjectAir UML Explorer
Herramienta de visualizacion de codigo creada para el IDE de Eclipse. Permite ver
en tiempo real el codigo implementado dentro de un proyecto como si fuera un diagrama
UML.[8].
Latex
Toda la memoria del proyecto ha sido realizada en Latex, utilizando diversas librerıas
de insercion de codigo para los Anexos finales. [9].
6.7.4. CODIGOTodo el codigo desarrollado en el ciclo 1 se podra ver en el Anexo B situado al final
de la Memoria de Seguimiento.
El lenguaje utilizado es Java, con el entorno Eclipse Jee Neon. Las librerıas ya men-
cionadas en la seccion anterior son las que se han utilizado para desarrollar el proyecto.
6.8. PLAN DE PRUEBASEl siguiente plan se ha disenado para poner a prueba de tres formas distintas el pro-
yecto completo. Al reves que en el primer plan de pruebas, el numero de las mismas en
este caso ha aumentado para confirmar las capacidades ya probadas y a su vez, probar las
nuevas funcionalidades implementadas en la segunda fase.
En las pruebas unitarias lo mas importante es la comprobacion del algoritmo (ver que
calcula bien la ruta que se elija y que devuelve la lista de estaciones por las que pasar a
modo de itinerario del camino mas corto), ver que no hay fallos en general de ejecucion,
etc.
Respecto a las pruebas de ensamblaje, lo mas importante es probar los 4 puntos crıticos
del sistema que son los puntos donde interfaz grafica y codigo se unen: las pulsaciones de
los botones, las selecciones de las estaciones y la devolucion de la ruta en cuestion en una
ventana emergente.
Por ultimo, como pruebas definitivas, se han disenado varios casos de uso en los cua-
les la utilizacion del software sera puesto a prueba, y el algoritmo tendra que buscar rutas
cada vez mas complicadas.
R.Sanz 44
Escuela Tecnica Superior de Ingenieros Informaticos Enero 2016
6.8.1. PRUEBAS UNITARIAS1. Seleccion del camino mas corto (prueba del algoritmo):
• Objetivo: Dada una estacion origen y una estacion destino, la aplicacion de-
bera devolver una ruta que sea la del camino mas corto para llegar de una
estacion a otra
• Resultado: SATISFACTORIO
Como ejemplo, para la estaciones seleccionadas: La Canyada y Les Carolines, el ca-
mino devuelto es el siguiente:
En consola obtenemos:
En ventana emergente (para usuario) obtenemos:
2. Salida del programa (algoritmo) sin seleccionar estaciones.
• Objetivo: Al estar implementadas interfaz y algoritmo en el mismo proyecto,
asegurarse de que todas las ventanas emergentes se crean y destruyen correc-
tamente sin que se den fallos o se lancen excepciones.
• Resultado inicial: FALLO
Tras la realizacion de varias pruebas, se ha encontrado el error de que se lanzaban
excepciones cuando se entraba a la aplicacion y se salıa de la misma sin haber
utilizado el algoritmo. Esto viene dado debido a que al no ejecutar el algoritmo, hay
ventanas emergentes que no se crean, y cuando se pretende salir de la aplicacion, se
intentan cerrar ventanas que no han sido creadas.
R.Sanz 45
Escuela Tecnica Superior de Ingenieros Informaticos Enero 2016
• Resultado final: SATISFACTORIO
R.Sanz 46
Escuela Tecnica Superior de Ingenieros Informaticos Enero 2016
3. Estabilidad de interfaz grafica
• Objetivo: Crear una interfaz grafica confiable a nivel de codigo, que cumpla
con sus funciones y que no de lugar a error. Que ejecute codigo de forma
optimizada y que elimine la inestabilidad inicial encontrada tras las pruebas
de la primera fase.
• Resultado inicial: FALLO : La antigua interfaz poseıa el error explicado mas
adelante. Para la segunda fase se comenzo con la reestructuracion a nivel de
codigo de la interfaz, cambiandola por completo y por lo tanto eliminando el
fallo.
Al ejecutar en numerosas ocasiones el algoritmo, se ha detectado una inestabilidad
grafica bastante grave en las rutas que se tenıan que representar muchas estaciones.
En la ventana emergente se auto-refrescaba el contenido hasta el punto de que en
alguna ocasion se ha borrado el contenido de la misma haciendola impracticable.
(NOTA: Esta prueba fue creada en inicio para la fase 1, se ha mantenido y pos-
teriormente se anadio la 6 con la diferencia de que es por fuerza bruta y de fase
2).
• Resultado final: SATISFACTORIO
R.Sanz 47
Escuela Tecnica Superior de Ingenieros Informaticos Enero 2016
4. Estado inicial de la aplicacion.
• Objetivo: Que la aplicacion este en un estado inicial el cual no tenga errores y
permita al usuario buscar su ruta.
• Resultado inicial: ***** :
Inicialmente el estado de la aplicacion no ha dado problemas o fallos como tal pero
se ha detectado que la inclusion de las opciones iniciales Elegir estacion de llega-da... y Elegir estacion de destino... generaban excepciones si por error el usuario
pulsaba Aceptar debido a que ambos elementos se incluyen dentro de la oferta de
estaciones seleccionables y obviamente no lo son por lo que no estan referencia-
dos. Esto lleva a un error inevitable por lo que se ha reestructurado esta seccion del
codigo.
• Resultado final: SATISFACTORIO
R.Sanz 48
Escuela Tecnica Superior de Ingenieros Informaticos Enero 2016
5. Forzado del algoritmo por fuerza bruta Parte I.
• Objetivo: Ejecutar el algoritmo un numero determinado de veces y comprobar
si en alguna de ellas falla.
• Resultado inicial: FALLO :
La puesta a prueba del algoritmo de esta manera, ha hecho que se pueda deducir
el error de final de thread al cerrar una ventana de forma abrupta que no fuera la
principal. Mas concretamente las ventanas de mapa y ayuda.
Gracias a esto se ha podido solucionar y la aplicacion termina su thread de for-
ma correcta en todo momento ya sea por cierre abrupto de las ventanas o por uso
de los botones dedicados a ello.
• Resultado final: SATISFACTORIO
6. Forzado del algoritmo por fuerza bruta Parte 2.
• Objetivo: Ejecutar el algoritmo un numero determinado de veces, representar-
lo graficamente y comprobar si en alguna de ellas falla.
• Resultado inicial: FALLO :
La puesta a prueba del algoritmo de esta manera, ha hecho que se pueda deducir
la inestabilidad que tenıa la representacion grafica despues de la primera fase. Se
tomo como un fallo aunque hubiera que arreglarlo igualmente.
Gracias a esta prueba se ha decidido desechar todo el modulo de codigo en cuestion
y rehacerlo desde cero para asegurar un buen funcionamiento del mismo.
• Resultado final: SATISFACTORIO
R.Sanz 49
Escuela Tecnica Superior de Ingenieros Informaticos Enero 2016
6.8.2. PRUEBAS DE ENSAMBLAJE1. Seleccion de estacion origen:
• Objetivo: Buscar mediante scroll vertical la estacion de origen que el usuario
quiera seleccionar.
• Resultado: SATISFACTORIO
2. Seleccion de estacion destino:
• Objetivo: Buscar mediante scroll vertical la estacion de destino que el usuario
quiera seleccionar.
• Resultado: SATISFACTORIO
R.Sanz 50
Escuela Tecnica Superior de Ingenieros Informaticos Enero 2016
3. Seleccion de Envıo de informacion:
• Objetivo: Una vez superadas las dos pruebas anteriores, Pulsado de boton
Aceptar. Debe devolver una ventana emergente con una lista de estaciones.
• Resultado: SATISFACTORIO
R.Sanz 51
Escuela Tecnica Superior de Ingenieros Informaticos Enero 2016
4. Ensamblado de Interfaz grafica con modulo de codigo:
• Objetivo: Comprobar que todas las selecciones y botones realizan su funcion.
Seleccionar estacion de origen y estacion destino. Una vez seleccionadas pul-
sar Aceptar.
• Devuelve: Debe generar una ventana emergente en la cual aparecera una lista
de las estaciones en cuestion que sigue el camino calculado.
• Resultado: SATISFACTORIO
Ventana de usuario:
Consola de programador:
R.Sanz 52
Escuela Tecnica Superior de Ingenieros Informaticos Enero 2016
5. Rescatado de mapa zonal de Valencia:
• Objetivo: Comprobar que la funcionalidad de mapa funciona correctamente.
• Devuelve: Ventana emergente con el mapa zonal de Valencia.
• Resultado: SATISFACTORIO
R.Sanz 53
Escuela Tecnica Superior de Ingenieros Informaticos Enero 2016
6. Rescatado del menu de ayuda:
• Objetivo: Comprobar que la funcionalidad de ayuda funciona correctamente.
• Devuelve: Ventana emergente con la ayuda disponible.
• Resultado: SATISFACTORIO
R.Sanz 54
Escuela Tecnica Superior de Ingenieros Informaticos Enero 2016
6.8.3. CASOS DE USOEn esta seccion se detallan algunos casos de uso utilizados para poner a prueba la
aplicacion. Van de menor a mayor dificultad.
1. De una estacion a otra adyacente:
Nombre Trayecto de estaciones adyacentes
Actores Usuario
Funcion Saber cual es el itinerario mas corto entre dos estaciones adyacen-
tes
Descripcion El usuario puede elegir una estacion origen y una estacion des-
tino que sean adyacentes. El usuario puede pulsar aceptar una vez
seleccionadas y recibir el itinerario de las estaciones por las que
pasara el metro.
Origen: Empalme (Linea 4)
Destino: Palau de Congressos (Linea 4)
R.Sanz 55
Escuela Tecnica Superior de Ingenieros Informaticos Enero 2016
R.Sanz 56
Escuela Tecnica Superior de Ingenieros Informaticos Enero 2016
2. De una estacion a otra de la misma linea:
Nombre Trayecto de una lınea sin transbordos
Actores Usuario
Funcion Saber cual es el itinerario mas corto entre dos estaciones de la
misma linea
Descripcion El usuario puede elegir una estacion origen y una estacion destino
dentro de la misma linea de metro. El usuario puede pulsar aceptar
una vez seleccionadas y recibir el itinerario de las estaciones por
las que pasara el metro.
Origen: Empalme (Linea 4)
Destino: Transits (Linea 4)
R.Sanz 57
Escuela Tecnica Superior de Ingenieros Informaticos Enero 2016
R.Sanz 58
Escuela Tecnica Superior de Ingenieros Informaticos Enero 2016
3. De una estacion a otra de una linea distinta con un transbordo:
Nombre Trayecto de varias lineas con un transbordo
Actores Usuario
Funcion Saber cual es el itinerario mas corto entre dos estaciones de dis-
tintas lineas
Descripcion El usuario puede elegir una estacion origen y una estacion destino
situadas en dos lineas distintas siempre y cuando solo haya un
transbordo entre ellas. El usuario puede pulsar aceptar una vez
seleccionadas y recibir el itinerario de las estaciones por las que
pasara el metro.
Origen: Sagunt (Linea 4)
Destino: Orriols (Linea 6)
R.Sanz 59
Escuela Tecnica Superior de Ingenieros Informaticos Enero 2016
R.Sanz 60
Escuela Tecnica Superior de Ingenieros Informaticos Enero 2016
4. De una estacion a otra de una linea distinta con dos transbordos:
Nombre Trayecto de una linea con dos transbordos
Actores Usuario
Funcion Saber cual es el itinerario mas corto entre dos estaciones de dis-
tintas lineas
Descripcion El usuario puede elegir una estacion origen y una estacion des-
tino situadas en dos lineas distintas siempre y cuando haya dos
transbordo entre ellas. El usuario puede pulsar aceptar una vez
seleccionadas y recibir el itinerario de las estaciones por las que
pasara el metro.
Origen: Palau de Congressos (Linea 4)
Destino: Mislata (Linea 3)
R.Sanz 61
Escuela Tecnica Superior de Ingenieros Informaticos Enero 2016
R.Sanz 62
Escuela Tecnica Superior de Ingenieros Informaticos Enero 2016
5. Usuario quiere ver quien desarrollo el proyecto:
Nombre Ver desarrollador
Actores Usuario
Funcion Consultar quien ha desarrollado la aplicacion
Descripcion El usuario puede consultar quien es ha desarrollado de la aplica-
cion
Hacer click en ’Archivo’, ’A cerca de...’
R.Sanz 63
Escuela Tecnica Superior de Ingenieros Informaticos Enero 2016
R.Sanz 64
Escuela Tecnica Superior de Ingenieros Informaticos Enero 2016
6. Usuario quiere consultar el mapa
Nombre Consultar el mapa
Actores Usuario
Funcion Consultar el programa antes de consultar una ruta o despues de
consultarla
Descripcion El usuario puede consultar el mapa Zonal en el momento que
desee sin que afecte a la consulta de la ruta
Hacer click en ’Ver’, ’Mapa’ Hacer click directo en boton ’Salir’ del menu princi-
pal.
R.Sanz 65
Escuela Tecnica Superior de Ingenieros Informaticos Enero 2016
7. Usuario quiere salir del programa
Nombre Salir del programa
Actores Usuario
Funcion Salir del programa sin haber hecho una busqueda
Descripcion El usuario puede salir del programa sin haber hecho una busqueda
previamente sin tener que cerrar la ventana de forma abrupta
Hacer click en ’Archivo’, ’Salir’.
Hacer click directo en boton ’Salir’ del menu principal.
Click directo sobre boton ’Salir’:
R.Sanz 66
Escuela Tecnica Superior de Ingenieros Informaticos Enero 2016
Click en ’Archivo’, ’Salir’:
R.Sanz 67
Escuela Tecnica Superior de Ingenieros Informaticos Enero 2016
8. Usuario quiere consultar el menu de ayuda
Nombre Menu de ayuda
Actores Usuario
Funcion Consultar el menu de ayuda para informarse
Descripcion El usuario puede consultar el menu de ayuda en cualquier mo-
mento para consultar alguna duda
Hacer click directo en boton ’Ayuda’ del menu principal.
R.Sanz 68
Escuela Tecnica Superior de Ingenieros Informaticos Enero 2016
Capıtulo 7
RESUMEN Y CONCLUSIONES
7.1. EVALUACION FINALComo se comento en la evaluacion de la primera fase, en general el desarrollo del pro-
yecto ha sido un poco complicado desde el punto de vista de tener que compaginar toda
la documentacion con el desarrollo del algoritmo. Aunque inicialmente con la creacion
del mapa conceptual de la primera fase se pudo aproximar una idea muy generalizada del
objetivo de la aplicacion, la necesidad de ampliar la misma en la segunda, provoco una
nueva modificacion del mapa para que quedase mas completo y depurado.
Una vez visto el nuevo objetivo que se pretendıa conseguir para esta segunda fase, to-
da la atencion se centro en el re-analisis de los requisitos para volver a acotar, esta vez de
forma definitiva, el problema a resolver por parte del creador del proyecto. En una reunion
intermedia con el tutor, se hablo sobre anadir alguna funcionalidad nueva a la aplicacion y
a la vez depurar el codigo, aislar errores que aparecieron y re-implementar todo lo relativo
a la devolucion de la ruta (mejora de la interfaz) la cual tenıa cierta inestabilidad. De esta
forma se sacaron nuevos requisitos y por consiguiente se agrando el proyecto en vistas a
cumplir el segundo deadline con una aplicacion mucho mas completa que en su version.
anterior.
El Diseno de Alto Nivel, no se vio afectado en esta segunda fase puesto que la propuesta
ha sido la misma, pero como es obvio, el Diseno de Bajo Nivel ha tenido que ser modifi-
cado al haberse implementado nuevos modulos de la aplicacion. La inversion de tiempo
ha sido mucho mas pequena que en la primera fase puesto que ya se tenıan los conoci-
mientos previos y no habıa que detenerse tanto para hacerlo.
R.Sanz 69
Escuela Tecnica Superior de Ingenieros Informaticos Enero 2016
Respecto al plan de pruebas, en la primera fase se diferenciaron tres tipos de pruebas:
unitarias, ensamblaje y casos de uso. Para esta segunda fase, la premisa ha sido la mis-
ma con la diferencia de que se han anadido pruebas que ayudasen a encontrar fallos al
sistema. Lo primero que se hizo fue pasar las pruebas que ya estaban creadas una vez se
implementaron los nuevos requisitos y posteriormente se anadieron y llevaron a cabo las
nuevas. De esta forma la baterıa de pruebas quedo mucho mas completa, llegando a tomar
una mayor importancia dentro del plan de pruebas los casos de uso.
La implementacion para la segunda fase, fue mucho menos costosa que en la prime-
ra ya que toda la seccion del algoritmo estaba implementada, y las horas de desarrollo
se centraron en la solucion de errores, depuracion, re-ordenacion y re-maquetacion de la
aplicacion. Durante la aplicacion del plan de pruebas, se aislaron varios errores que fueron
subsanados nada ma terminar el desarrollo por lo que el restante de horas se vio dedicado
a esta actividad. Es de destacar que las horas invertidas en desarrollo tanto en la primera
fase como en la segunda, fue mayor de lo esperado puesto que los conocimientos que se
tenıan antes del desarrollo del proyecto eran bastante limitados.
Como ya se ha comentado, al haber terminado la implementacion general del proyecto, se
comenzo a aplicar el plan de pruebas de la primera fase para asegurar el funcionamiento
de las funcionalidades anteriores y una vez hecho, se comenzaron a aplicar las nuevas
pruebas.
Varios fallos fueron localizados dentro de la aplicacion (seccion 4.8 de la memoria fi-nal). Algunos de ellos fueron:
1. Fallo en la primera ejecucion de la aplicacion:
La aplicacion funcionaba normalmente pero las dos primeras estaciones que esta-
ban situadas en el array de estaciones de llegada no funcionaban. El motivo era que
la seleccion inicial estaba vacıa y solo se llenaba cuando se hacıa click sobre una
de las opciones del array. Se soluciono haciendo una inicializacion de la seleccion
que fuera coherente.
2. Situacion inicial de la aplicacion en primera fase:
Cuando se ejecutaba la aplicacion, en la seleccion de estaciones de salida habıa una
opcion que era ”Seleccione estacion de salida...”. Era un elemento del array que no
estaba referenciado en el resto del proyecto ya que no era una estacion. Esto llevo
a su eliminacion de la interfaz tanto en Salida como en Llegada ya que presentaban
exactamente el mismo tipo de error. La localizacion de este fallo llevo directamente
a encontrar el anteriormente mencionado.
3. Situacion inicial de la aplicacion en primera fase:
Cuando se ejecutaba la aplicacion, en la seleccion de estaciones de salida habıa
una opcion que era ”Seleccione estacion de salida...”. Era un elemento del array
R.Sanz 70
Escuela Tecnica Superior de Ingenieros Informaticos Enero 2016
que no estaba referenciado en el resto del proyecto ya que no era una estacion. Esto
llevo a su eliminacion de la interfaz. La localizacion de este fallo llevo directamente
a encontrar el anteriormente mencionado.
4. Inestabilidad grafica:
Cuando se ejecutaba la aplicacion,todo funcionaba correctamente, pero cuando se
elegıan estaciones muy distantes entre sı, se daba un error muy grave de inestabi-
lidad a la hora de representar las estaciones y lıneas de la ruta. El contenido de la
ventana emergente comenzaba autorefrescarse y desaparecıa el contenido de la ruta
a pesar de que el programa la tenıa bien guardada en memoria. Se aislo el fallo y
toda la seccion de codigo fue modificada.
Igualmente, uno de los requisitos establecıa que la representacion de la ruta debıa
ser mucho mas amigable e intuitiva por lo que para la version final era algo que
habıa que cambiar obligadamente.
5. Problemas de ejecucion del hilo de la aplicacion:
Al trabajar con tantas ventanas emergentes, el hilo de ejecucion no siempre termi-
naba como era de esperar. En los casos en los que se salıa de las ventanas mediante
su boton correspondiente, el thread terminaba de forma correcta, pero en los casos
en los que se cerraba la ventana de forma abrupta, no se trataba dicho cerrado por
lo que el hilo seguıa ejecutando. Fue un fallo bastante problematico ya que se loca-
lizo justo al final del desarrollo de esta segunda fase por lo que se tardo en localizar.
Una vez localizado se fue experimentando hasta arreglarlo de la forma correcta.
Como conclusion del proceso de desarrollo del proyecto al completo, se puede afir-
mar sin duda alguna que ha sido un exito la implementacion del algoritmo (a pesar de
las dificultades tenidas al principio del mismo) y de la interfaz incluyendo sus nuevas
funcionalidades.
R.Sanz 71
Escuela Tecnica Superior de Ingenieros Informaticos Enero 2016
7.2. CONCLUSIONESLa realizacion de este proyecto sin duda alguna ha puesto a prueba mis capacidades y
los conocimientos aprendidos durante la carrera. A pesar de ser un algoritmo ampliamente
conocido, he podido comprobar de primera mano su funcionamiento y su efectividad en
una aplicacion tan necesaria como un planificador de rutas. Obviamente esta aplicacion
tiene un alcance muy limitado ya que la toma de datos ha sido propia y hecha a mano, pe-
ro la decision de hacerlo ası ha sido necesaria para evitar problemas con datos de terceros.
Si en algun momento se quisiera utilizar con informacion mas extensa, conectandola a
una base de datos ya sea en local u online, el algoritmo funcionarıa exactamente igual
por lo que las posibilidades de la aplicacion como tal son muy grandes en terminos de
funcionalidad.
Respecto a los conocimientos puestos en practica, puedo decir que los mas utiles han
sido los adquiridos en Ingenierıa del Software I y II, Inteligencia Artificial y asignaturas
de programacion. La gestion de un proyecto llevado completamente por mı, ha supuesto
una nueva forma de completar el aprendizaje que se inicio en las dos primeras asignaturas
que he mencionado. La forma en la que gestionar el proyecto fue definida por mi tutor,
pero realmente me ha dado muchas libertades para que yo eligiera de que forma hacerlo
siempre y cuando los motivos por los que escogiera mis elecciones fueran coherentes con
el proyecto.
A parte de todo lo mencionado, tengo que decir que estoy bastante contento con el trabajo
que he desarrollado puesto que considero que entre otras cosas el manejo de interfaces
graficas me vendra bien de cara al futuro a corto o medio plazo (el mercado actual del
desarrollo de aplicaciones sin duda esta al alza) y a su vez, completa en cierto grado mi
formacion como programador puesto que en mi caso no es algo que haya visto de forma
concisa en ninguna asignatura por lo que es mas que bienvenido.
R.Sanz 72
Escuela Tecnica Superior de Ingenieros Informaticos Enero 2016
Capıtulo 8
CITAS Y BIBLIOGRAFIA
[1] IEEE-STD-830-1998 : Software requirements specification.
[2] Blog, Datos en abierto (Wordpress),https://datosenabierto.wordpress.com/2011/08/14/implementacion-algoritmo-a-estrella-definicion/,2011
[3] Centro de Inteligencia Artificial, Universidad de Oviedo,http://www.aic.uniovi.es/ssii/ssii-t3-busquedaii.pdf
[4] Algoritmo a Estrella, Wikipedia,https://es.wikipedia.org, busqueda: Algoritmo a Estrella
[5] Consultorıa de Disenos y Usabilidad,Usolab,http://www.usolab.com/wl/2009/07/la-regla-de-3-clics.php
[6] Java Decision Diagram Libraries,soft112,http://java-decision-diagram-libraries.soft112.com/
[7] net.datastructures,http://net3.datastructures.net/
[8] The ObjectAid UML Explorer for Eclipse,http://www.objectaid.com/
[9] Latex-project,https://www.latex-project.org/
R.Sanz 73
Escuela Tecnica Superior de Ingenieros Informaticos Enero 2016
Capıtulo 9
ANEXO A: CODIGO
DESARROLLADO 1º FASE
9.1. Package Arbol
9.1.1. Arbol.java
1 package Arbol;
2 import java.io.IOException;
3 import java.util.ArrayList;
4 import java.util.Iterator;
5 import java.util.List;
6 import java.util.Map;
7 import jdd.graph.Edge;
8 import Grafo.*;
R.Sanz 74
Escuela Tecnica Superior de Ingenieros Informaticos Enero 2016
9 public class Arbol {
10 Nodo salida;
11 Nodo llegada;
12 Grafo grafo;
13 Map<String, List<Edge>> tabla;
14 LTree<Elemento> arbol = new LTree<Elemento>();
15 List<LTreeNode<Elemento>> posibles = new ArrayList<LTreeNode<
Elemento>>();
16 public Arbol(Nodo salida,Nodo llegada,Grafo grafo){
17 this.salida = salida;
18 this.llegada = llegada;
19 this.grafo = grafo;
20 this.arbol.addRoot(new Elemento(0,salida.distancia(llegada),
salida));
21 this.arbol.root.element().setrecorrido(salida.distancia(llegada)
);
22 this.arbol.root.setChild(grafo.getChild(this.arbol.root, llegada
));
23 addList(posibles,this.arbol.root.getChild());
24 }
25 private void addList(List<LTreeNode<Elemento>> lis,
26 List<LTreeNode<Elemento>> hijos){
27 Iterator<LTreeNode<Elemento>> it = hijos.iterator();
R.Sanz 75
Escuela Tecnica Superior de Ingenieros Informaticos Enero 2016
28 while(it.hasNext()){
29 lis.add(it.next());
30 }
31 }
32 public LTreeNode<Elemento> CalcularRecorrido(){
33 LTreeNode<Elemento> nodo = this.arbol.root;
34 if (salida.getNombre()!=llegada.getNombre()){
35 nodo = selectChild(nodo);
36 while(!isEnd(nodo)){
37 nodo = selectChild(nodo);
38 }
39 }
40 return nodo;
41 }
42 public LTreeNode<Elemento> selectChild(LTreeNode<Elemento>padre)
{
43 LTreeNode<Elemento> nodo = new LTreeNode<Elemento>(null,null,
null);
44 LTreeNode<Elemento> nod = new LTreeNode<Elemento>(null,null,null
);
45 Iterator<LTreeNode<Elemento>> iterador = posibles.iterator();
46 int gh = 0;
47 nod = iterador.next();
R.Sanz 76
Escuela Tecnica Superior de Ingenieros Informaticos Enero 2016
48 gh = gh(nod);
49 nodo=nod;
50 int i = 0;
51 int j = 0;
52 while(iterador.hasNext()){
53 nod = iterador.next();
54 i++;
55 if (gh>gh(nod) &&
56 (nod.element().getnodo().getNombre()!=
57 padre.element().getnodo().getNombre())){
58 gh = gh(nod);
59 nodo=nod;
60 j = i;
61 }
62 }
63 System.out.println(nodo.element().getnodo().getNombre());
64 nodo.element().setrecorrido(gh);
65 i=0;
66 posibles.remove(j);
67 iterador = posibles.iterator();
68 List<Integer> borrar =new ArrayList<Integer>();
69 while(iterador.hasNext()){
70 if(iterador.next().element().getnodo().getNombre()==
R.Sanz 77
Escuela Tecnica Superior de Ingenieros Informaticos Enero 2016
71 nodo.element().getnodo().getNombre())
72 borrar.add(i);
73 i++;
74 }
75 Iterator <Integer >iterad = borrar.iterator();
76 while(iterad.hasNext()){
77 posibles.remove(iterad.next());
78 }
79 if (nodo.getChild() == null){
80 nodo.setChild(grafo.getChild(nodo, llegada));
81 addList(posibles,nodo.getChild());
82 }
83 return nodo;
84 }
85 public int gh (LTreeNode<Elemento> nodo){
86 return nodo.getParent().element().recorridoParcial() +
87 nodo.element().recorridoMax();
88 }
89 public boolean isEnd(LTreeNode<Elemento>fin){
90 return (fin.element().getnodo().getNombre() == llegada.getNombre
());
91 }
92 public List<Nodo> recorridoObtimo(LTreeNode<Elemento> fin){
R.Sanz 78
Escuela Tecnica Superior de Ingenieros Informaticos Enero 2016
93 List<Nodo> recorrido = new ArrayList<Nodo>();
94 LTreeNode<Elemento> posicion = fin;
95 boolean condicion = true;
96 while(condicion){
97 if (posicion.getParent()==null){
98 recorrido.add(((Elemento)posicion.element()).getnodo());
99 condicion = false;
100 }
101 else{
102 recorrido.add(((Elemento)posicion.element()).getnodo());
103 posicion = posicion.getParent();
104 }
105 }
106 return recorrido;
107 }
108 }
R.Sanz 79
Escuela Tecnica Superior de Ingenieros Informaticos Enero 2016
9.1.2. Elemento.java
1 package Arbol;
2 import Grafo.Nodo;
3 public class Elemento {
4 private double g;
5 private int h,recorrido;
6 private Nodo nodo;
7 public Elemento(double g, int h, Nodo nodo){
8 this.g = g;
9 this.h = h;
10 this.nodo = nodo;
11 }
12 public double getG(){
13 return this.g;
14 }
15 public void setG(int g){
16 this.g = g;
17 }
18 public int getH(){
19 return this.h;
20 }
21 public void setH(int h){
22 if(h>=0)
R.Sanz 80
Escuela Tecnica Superior de Ingenieros Informaticos Enero 2016
23 this.h = h;
24 else
25 this.h = -h;
26 }
27 public Nodo getnodo(){
28 return this.nodo;
29 }
30 public void setnodo(Nodo nodo){
31 this.nodo = nodo;
32 }
33 public int getrecorrido(){
34 return this.recorrido;
35 }
36 public void setrecorrido(int recorrido){
37 this.recorrido = recorrido;
38 }
39 public int recorridoParcial(){
40 return this.recorrido-this.h;
41 }
42 public int recorridoMax(){
43 return (int)this.g+this.h;
44 }
45 }
R.Sanz 81
Escuela Tecnica Superior de Ingenieros Informaticos Enero 2016
9.1.3. LTree.java
1 package Arbol;
2 import net.datastructures.*;
3 import java.util.*;
4 public class LTree<E> implements Tree<E> {
5 protected LTreeNode<E> root=null;
6 public int size() {
7 int numPos=0;
8 for (Position<E> p: positions()) ++numPos;
9 return numPos;
10 }
11 public boolean isEmpty() {
12 return (root==null);
13 }
14 public Iterator<E> iterator() {
15 List<E> list = new LinkedList<E>();
16 for (Position<E> p: positions()) list.add(p.element());
17 return list.listIterator();
18 }
19 public Iterable<Position<E>> positions() {
20 return nodeList(root);
21 }
22 public E replace(Position<E> v, E e) {
R.Sanz 82
Escuela Tecnica Superior de Ingenieros Informaticos Enero 2016
23 LTreeNode<E> node = getLTreeNode(v);
24 E tmp = node.element();
25 node.setElement(e);
26 return tmp;
27 }
28 public Position<E> root() throws EmptyTreeException {
29 if (isEmpty()) throw new EmptyTreeException("Tree is empty");
30 return root;
31 }
32 public Position<E> parent(Position<E> v) throws
InvalidPositionException,
33 BoundaryViolationException {
34 if (isRoot(v)) throw new BoundaryViolationException("At root
node");
35 LTreeNode<E> node = getLTreeNode(v);
36 return node.getParent();
37 }
38 public Iterable<Position<E>> children(Position<E> v) throws
39 InvalidPositionException {
40 return childrenList(v);
41 }
42 public boolean isInternal(Position<E> v) throws
InvalidPositionException {
R.Sanz 83
Escuela Tecnica Superior de Ingenieros Informaticos Enero 2016
43 return !isExternal(v);
44 }
45 public boolean isExternal(Position<E> v) throws
InvalidPositionException {
46 LTreeNode<E> node = getLTreeNode(v);
47 return false;
48 }
49 public boolean isRoot(Position<E> v) throws
InvalidPositionException {
50 LTreeNode<E> node = getLTreeNode(v);
51 return node==root();
52 }
53 public Position<E> addRoot(E e) throws NonEmptyTreeException {
54 if (root != null) {
55 throw new NonEmptyTreeException("adding new root to nonempty
tree");
56 }
57 root = new LTreeNode<E>(e,null,null);
58 return root;
59 }
60 public Position<E> addChild(E e,Position<E> v)
61 throws InvalidPositionException {
62 LTreeNode<E> node = getLTreeNode(v);
R.Sanz 84
Escuela Tecnica Superior de Ingenieros Informaticos Enero 2016
63 LTreeNode<E> newNode = new LTreeNode<E>(e,node,null);
64 List<LTreeNode<E>> lista = node.getChild();
65 lista.add(lista.size(), newNode);
66 node.setChild(lista);
67 return newNode;
68 }
69 public Position<E> addChild(Tree<E> t,Position<E> v) throws
70 InvalidPositionException, EmptyTreeException {
71 LTreeNode<E> t_node = getLTreeNode(t.root());
72 LTreeNode<E> v_node = getLTreeNode(v);
73 t_node.setParent(v_node);
74 //t_node.setRight(v_node.getFirstChild());
75 //v_node.setFirstChild(t_node);
76 return t_node;
77 }
78 private LTreeNode<E> getLTreeNode(Position<E> v)
79 throws InvalidPositionException {
80 if (v == null || !(v instanceof LTreeNode<?>)) {
81 throw new InvalidPositionException("Invalid position");
82 }
83 return (LTreeNode<E>) v;
84 }
85 private Iterable<Position<E>> childrenList(Position<E> v) {
R.Sanz 85
Escuela Tecnica Superior de Ingenieros Informaticos Enero 2016
86 return null;
87 }
88 private void addChildren(Position<E> child,List<Position<E>>
list) {
89 if (child!=null) {
90 LTreeNode<E> childNode = getLTreeNode(child);
91 list.add(child);
92 //addChildren(childNode.getRight(),list);
93 }
94 }
95 private List<Position<E>> nodeList(Position<E> v) {
96 List<Position<E>> list = new LinkedList<Position<E>>();
97 addAllNodes(v,list);
98 return list;
99 }
100 private void addAllNodes(Position<E> node,List<Position<E>> list
) {
101 if (node!=null) {
102 list.add(node);
103 for (Position<E> child : childrenList(node))
104 addAllNodes(child,list);
105 }
106 }}
R.Sanz 86
Escuela Tecnica Superior de Ingenieros Informaticos Enero 2016
9.1.4. LTree.java
1 package Arbol;
2 import java.util.List;
3
4 import net.datastructures.*;
5 public class LTreeNode<E> implements Position<E> {
6 private E element;
7 private LTreeNode<E> parent;
8 private List<LTreeNode<E>> Child;
9 public LTreeNode(E e, LTreeNode<E> parent, List<LTreeNode<E>>
Child) {
10 this.element = e;
11 this.parent = parent;
12 this.Child = Child;
13 }
14 public void setElement(E element) {
15 this.element = element;
16 }
17 public E element() {
18 return element;
19 }
20 public void setParent(LTreeNode<E> parent) {
21 this.parent = parent;
R.Sanz 87
Escuela Tecnica Superior de Ingenieros Informaticos Enero 2016
22 }
23 public LTreeNode<E> getParent() {
24 return parent;
25 }
26 public void setChild(List<LTreeNode<E>> Child) {
27 this.Child = Child;
28 }
29 public List<LTreeNode<E>> getChild() {
30 return Child;
31 }
32 }
R.Sanz 88
Escuela Tecnica Superior de Ingenieros Informaticos Enero 2016
9.2. Package Grafica
9.2.1. AA.java
1 package Grafica;
2 import java.util.ArrayList;
3 import java.util.Iterator;
4 import java.util.List;
5 import jdd.graph.Edge;
6 import Arbol.Arbol;
7 import Grafo.*;
8 public class AA {
9 private Grafo grafo;
10 Nodo salida;
11 Nodo llegada;
12 public AA(String salida, String llegada){
13 grafo = new Grafo(true);
14 // Creacion de la linea de metro
15 //Estaciones
16 Nodo Villanueva_de_Castellon, Alberic, Massalaves, Montortal,
17 LAlcudia, Benimodo, Carlet, Ausias_March, Alginet,
Font_Almanguer,
18 Espioca, Omet, Picassent, Sant_Ramon, Realon, Col_legi_El_Vedat,
19 Plaza_Espanya, Turia, Campanar_La_Fe, Beniferri, Cantereria,
R.Sanz 89
Escuela Tecnica Superior de Ingenieros Informaticos Enero 2016
20 Benimamet, Les_Carolines_Fira, Campament,Paterna,Santa_Rita,
21 Fuente_del_Jarro,La_Canyada,La_Vallesa,Entrepins,El_Clot,
Montesol,
22 LEliana,Torre_del_Virrei,La_Pobla_De_Vallbona,Benaguasil_1r,
23 Benaguasil_2n,Lliria,Burjassot,Burjassot_Godella,Godella,
Rocafort,
24 Massarrojos,Montcada_Alfara,Seminari_CEU,Masies,S_Psiquiatric,
25 Betera,Torrent,Torrent_Avinguda,Picanya,Paiporta,Valencia_Sud,
26 Sant_Isidre,Safranar,Patraix,Joaquin_Sorolla,Bailen,Aragon,
27 Amistat,Ayora,Neptu,Angel_Guimera,Maritim_Serreria,Serreria,
28 Francesc_Cubells,Grau_Canyamelar,Colon,Alameda,Xativa,
29 Avinguda_del_Cid,Nou_dOctubre,Mislata,Mislata_Almassil,Faitanar,
30 Quart_de_Poblet,Salt_de_lAigua,Manises,Rosas,Aeroport,Facultats,
31 Machado,Alboraya_Palmaret,Alboraya_Peris_Arago,Almassera,
32 Meliana,Foios,Albalat_dels_Sorells,Museros,Massamagrell,
33 La_Pobla_de_Farnals,Rafelbunyol,Empalme,Benimaclet,
Mas_del_Rosari,
34 La_Coma,Tomas_y_Valiente,Santa_Gemma_Parc_Cientific_UV,
35 Ll_Llarga_Terramelar,TVV,Fira_Valencia,Vicent_Andres_Estelles,
36 Campus_de_Burjassot,Sant_Joan,La_Granja,Palau_de_Congressos,
37 Florista,Garbi ,Benicalap,Transits ,Marxalenes,Reus ,Sagunt,
38 Pont_de_Fusta,Primat_Reig,Vicent_Zaragoza ,
Universitat_Politecnica,
R.Sanz 90
Escuela Tecnica Superior de Ingenieros Informaticos Enero 2016
39 La_Carrasca,Tarongers,La_Marina ,Doctor_Lluch,La_Cadena,
40 Eugenia_Vines,Les_Arenes ,Mediterrani,Alfauir,Orriols,
41 Estadi_del_Llevant,Sant_Miquel_dels_Reis, Tossal_del_Rei;
42 Villanueva_de_Castellon = grafo.addNode("Villanueva_de_Castellon
", 0,0);
43 Alberic = grafo.addNode("Alberic", -1,7);
44 Massalaves = grafo.addNode("Massalaves", 0,12);
45 Montortal = grafo.addNode("Montortal", 0,18);
46 LAlcudia = grafo.addNode("LAlcudia", 1,22);
47 Benimodo = grafo.addNode("Benimodo", 0,27);
48 Carlet = grafo.addNode("Carlet", -1,29);
49 Ausias_March = grafo.addNode("Ausias_March",5,34);
50 Alginet = grafo.addNode("Alginet",9,36);
51 Font_Almanguer = grafo.addNode("Font_Almanguer",11,41);
52 Espioca = grafo.addNode("Espioca", 10,48);
53 Omet = grafo.addNode("Omet", 9,54);
54 Picassent = grafo.addNode("Picassent",11,55);
55 Sant_Ramon = grafo.addNode("Sant_Ramon",10,59);
56 Realon = grafo.addNode("Realon", 11,64);
57 Col_legi_El_Vedat = grafo.addNode("Col_legi_El_Vedat",11,67);
58 Plaza_Espanya = grafo.addNode("Plaza_Espanya", 27,76);
59 Turia = grafo.addNode("Turia", 25,78);
60 Campanar_La_Fe = grafo.addNode("Campanar_La_Fe",24,79);
R.Sanz 91
Escuela Tecnica Superior de Ingenieros Informaticos Enero 2016
61 Beniferri = grafo.addNode("Beniferri", 24,81);
62 Cantereria = grafo.addNode("Cantereria", 21,83);
63 Benimamet = grafo.addNode("Benimamet",20,83);
64 Les_Carolines_Fira = grafo.addNode("Les_Carolines_Fira",18,82);
65 Campament = grafo.addNode("Campament", 16,82);
66 Paterna = grafo.addNode("Paterna",15 ,82);
67 Santa_Rita = grafo.addNode("Santa_Rita", 12,84);
68 Fuente_del_Jarro = grafo.addNode("Fuente_del_Jarro",11,85);
69 La_Canyada = grafo.addNode("La_Canyada", 6,88);
70 La_Vallesa = grafo.addNode("La_Vallesa", 4,90);
71 Entrepins = grafo.addNode("Entrepins", 1,91);
72 El_Clot = grafo.addNode("El_Clot", -2,92);
73 Montesol = grafo.addNode("Montesol", -3,94);
74 LEliana = grafo.addNode("LEliana", -4,95);
75 Torre_del_Virrei = grafo.addNode("Torre_del_Virrei", -6,97);
76 La_Pobla_De_Vallbona = grafo.addNode("La_Pobla_De_Vallbona",
-9,99);
77 Benaguasil_1r = grafo.addNode("Benaguasil_1r",-12,102);
78 Benaguasil_2n = grafo.addNode("Benaguasil_2n", -13,103);
79 Lliria = grafo.addNode("Lliria", -15,108);
80 Burjassot = grafo.addNode("Burjassot", 22,84);
81 Burjassot_Godella = grafo.addNode("Burjassot_Godella",21,85);
82 Godella = grafo.addNode("Godella", 21,86);
R.Sanz 92
Escuela Tecnica Superior de Ingenieros Informaticos Enero 2016
83 Rocafort = grafo.addNode("Rocafort", 22,88);
84 Massarrojos = grafo.addNode("Massarrojos", 23,90);
85 Montcada_Alfara = grafo.addNode("Montcada_Alfara", 26,91);
86 Seminari_CEU = grafo.addNode("Seminari_CEU", 26,92);
87 Masies = grafo.addNode("Masies",22,96);
88 S_Psiquiatric = grafo.addNode("S_Psiquiatric", 15,99);
89 Betera = grafo.addNode("Betera",12,101);
90 Torrent = grafo.addNode("Torrent",11,69);
91 Torrent_Avinguda = grafo.addNode("Torrent_Avinguda",9,69);
92 Picanya = grafo.addNode("Picanya", 16,69);
93 Paiporta = grafo.addNode("Paiporta", 20,69);
94 Valencia_Sud = grafo.addNode("Valencia_Sud", 21,71);
95 Sant_Isidre = grafo.addNode("Sant_Isidre", 23,73);
96 Safranar = grafo.addNode("Safranar", 24,73);
97 Patraix = grafo.addNode("Patraix", 25,74);
98 Joaquin_Sorolla = grafo.addNode("Joaquin_Sorolla", 27,74);
99 Bailen = grafo.addNode("Bailen",28,75);
100 Aragon = grafo.addNode("Aragon", 32,77);
101 Amistat = grafo.addNode("Amistat",33,77);
102 Ayora = grafo.addNode("Ayora",35,76);
103 Neptu = grafo.addNode("Neptu", 38,77);
104 Angel_Guimera = grafo.addNode("Angel_Guimera", 26,77);
105 Maritim_Serreria = grafo.addNode("Maritim_Serreria",36,77);
R.Sanz 93
Escuela Tecnica Superior de Ingenieros Informaticos Enero 2016
106 Serreria = grafo.addNode("Serreria",36,78);
107 Francesc_Cubells = grafo.addNode("Francesc_Cubells",37,77);
108 Grau_Canyamelar = grafo.addNode("Grau_Canyamelar",37,77);
109 Colon = grafo.addNode("Colon",29,77);
110 Alameda = grafo.addNode("Alameda",30,77);
111 Xativa = grafo.addNode("Xativa",28,76);
112 Avinguda_del_Cid = grafo.addNode("Avinguda_del_Cid",24,76);
113 Nou_dOctubre = grafo.addNode("Nou_dOctubre",22,77);
114 Mislata = grafo.addNode("Mislata", 20,77);
115 Mislata_Almassil = grafo.addNode("Mislata_Almassil", 19,78);
116 Faitanar = grafo.addNode("Faitanar", 17,78);
117 Quart_de_Poblet = grafo.addNode("Quart_de_Poblet",15,79);
118 Salt_de_lAigua = grafo.addNode("Salt_de_lAigua",13,79);
119 Manises = grafo.addNode("Manises",12,80);
120 Rosas = grafo.addNode("Rosas",10,81);
121 Aeroport = grafo.addNode("Aeroport",8,81);
122 Facultats = grafo.addNode("Facultats",31,78);
123 Machado = grafo.addNode("Machado", 32,81);
124 Alboraya_Palmaret = grafo.addNode("Alboraya_Palmaret", 32,82);
125 Alboraya_Peris_Arago = grafo.addNode("Alboraya_Peris_Arago",
33,83);
126 Almassera = grafo.addNode("Almassera", 35,85);
127 Meliana = grafo.addNode("Meliana", 33,88);
R.Sanz 94
Escuela Tecnica Superior de Ingenieros Informaticos Enero 2016
128 Foios = grafo.addNode("Foios", 33,90);
129 Albalat_dels_Sorells = grafo.addNode("Albalat_dels_Sorells"
,34,92);
130 Museros = grafo.addNode("Museros",35,95);
131 Massamagrell = grafo.addNode("Massamagrell",37,97);
132 La_Pobla_de_Farnals = grafo.addNode("La_Pobla_de_Farnals",
37,98);
133 Rafelbunyol = grafo.addNode("Rafelbunyol", 37,100);
134 Empalme = grafo.addNode("Empalme", 23,82);
135 Benimaclet = grafo.addNode("Benimaclet",31,79);
136 Mas_del_Rosari = grafo.addNode("Mas_del_Rosari", 15,89);
137 La_Coma = grafo.addNode("La_Coma", 17,88);
138 Tomas_y_Valiente = grafo.addNode("Tomas_y_Valiente", 20,87);
139 Santa_Gemma_Parc_Cientific_UV = grafo.addNode("
Santa_Gemma_Parc_Cientific UV", 20,86);
140 Ll_Llarga_Terramelar = grafo.addNode("Ll_Llarga_Terramelar",
16,89);
141 TVV = grafo.addNode("TVV",20,85);
142 Fira_Valencia = grafo.addNode("Fira_Valencia",18,84);
143 Vicent_Andres_Estelles = grafo.addNode("Vicent_Andres_Estelles",
19,85);
144 Campus_de_Burjassot = grafo.addNode("Campus_de_Burjassot",
19,85);
R.Sanz 95
Escuela Tecnica Superior de Ingenieros Informaticos Enero 2016
145 Sant_Joan = grafo.addNode("Sant_Joan", 20,84);
146 La_Granja = grafo.addNode("La_Granja", 21,84);
147 Palau_de_Congressos = grafo.addNode("Palau_de_Congressos",
24,83);
148 Florista = grafo.addNode("Florista", 24,83);
149 Garbi = grafo.addNode("Garbi", 24,81);
150 Benicalap = grafo.addNode("Benicalap", 26,81);
151 Transits = grafo.addNode("Transits", 26,81);
152 Marxalenes = grafo.addNode("Marxalenes", 26,81);
153 Reus = grafo.addNode("Reus", 27,81);
154 Sagunt = grafo.addNode("Sagunt", 28,81);
155 Pont_de_Fusta = grafo.addNode("Pont_de_Fusta", 29,79);
156 Primat_Reig = grafo.addNode("Primat_Reig", 30,81);
157 Vicent_Zaragoza = grafo.addNode("Vicent_Zaragoza", 32,79);
158 Universitat_Politecnica = grafo.addNode("Universitat_Politecnica
", 33,79);
159 La_Carrasca = grafo.addNode("La_Carrasca", 34,79);
160 Tarongers = grafo.addNode("Tarongers", 35,79);
161 La_Marina = grafo.addNode("La_Marina", 37,78);
162 Doctor_Lluch = grafo.addNode("Doctor_Lluch", 37,77);
163 La_Cadena = grafo.addNode("La_Cadena", 37,78);
164 Eugenia_Vines = grafo.addNode("Eugenia_Vines", 38,78);
165 Les_Arenes = grafo.addNode("Les_Arenes", 38,77);
R.Sanz 96
Escuela Tecnica Superior de Ingenieros Informaticos Enero 2016
166 Mediterrani = grafo.addNode("Mediterrani", 37,77);
167 Alfauir = grafo.addNode("Alfauir", 30,81);
168 Orriols = grafo.addNode("Orriols", 30,82);
169 Estadi_del_Llevant = grafo.addNode("Estadi_del_Llevant", 30,83);
170 Sant_Miquel_dels_Reis = grafo.addNode("Sant_Miquel_dels_Reis",29
,83);
171 Tossal_del_Rei = grafo.addNode("Tossal_del_Rei", 28,83);
172 //Trayectos
173 grafo.addEdge (Villanueva_de_Castellon, Alberic, 4.40, "linea1")
;
174 grafo.addEdge (Alberic,Massalaves,3.10, "linea1");
175 grafo.addEdge (Massalaves,Montortal,3.48, "linea1");
176 grafo.addEdge (Montortal,LAlcudia,2.45, "linea1");
177 grafo.addEdge (LAlcudia,Benimodo,3.00, "linea1");
178 grafo.addEdge (Benimodo,Carlet,1.34, "linea1");
179 grafo.addEdge (Carlet,Ausias_March,3.95, "linea1");
180 grafo.addEdge (Ausias_March, Alginet,2.39, "linea1");
181 grafo.addEdge (Alginet,Font_Almanguer,2.95, "linea1");
182 grafo.addEdge (Font_Almanguer,Espioca,3.61, "linea1");
183 grafo.addEdge (Espioca,Omet,3.74, "linea1");
184 grafo.addEdge (Omet,Picassent,1.40, "linea1");
185 grafo.addEdge (Picassent,Sant_Ramon,2.97, "linea1");
186 grafo.addEdge (Sant_Ramon,Realon,2.61, "linea1");
R.Sanz 97
Escuela Tecnica Superior de Ingenieros Informaticos Enero 2016
187 grafo.addEdge (Realon,Col_legi_El_Vedat,1.69, "linea1");
188 grafo.addEdge (Col_legi_El_Vedat,Torrent_Avinguda,1.95, "linea1"
);
189 grafo.addEdge (Col_legi_El_Vedat,Torrent_Avinguda,1.95, "linea5"
);
190 grafo.addEdge (Col_legi_El_Vedat, Torrent,1.27, "linea 1");
191 grafo.addEdge (Torrent_Avinguda,Torrent,2.11, "linea1");
192 grafo.addEdge (Torrent_Avinguda,Torrent,2.11, "linea5");
193 grafo.addEdge (Torrent,Picanya,2.29, "linea1");
194 grafo.addEdge (Torrent,Picanya,2.29, "linea5");
195 grafo.addEdge (Picanya,Paiporta,1.73, "linea1");
196 grafo.addEdge (Picanya,Paiporta,1.73, "linea5");
197 grafo.addEdge (Paiporta,Valencia_Sud,1.17, "linea1");
198 grafo.addEdge (Paiporta,Valencia_Sud,1.17, "linea5");
199 grafo.addEdge (Valencia_Sud,Sant_Isidre,1.31, "linea1");
200 grafo.addEdge (Valencia_Sud,Sant_Isidre,1.31, "linea5");
201 grafo.addEdge (Sant_Isidre,Safranar,0.33, "linea1");
202 grafo.addEdge (Sant_Isidre,Safranar,0.33, "linea5");
203 grafo.addEdge (Safranar,Patraix,0.74, "linea1");
204 grafo.addEdge (Safranar,Patraix,0.74, "linea5");
205 grafo.addEdge (Patraix,Joaquin_Sorolla,0.63, "linea1");
206 grafo.addEdge (Patraix,Joaquin_Sorolla,0.63, "linea5");
207 grafo.addEdge (Joaquin_Sorolla,Plaza_Espanya,0.80, "linea1");
R.Sanz 98
Escuela Tecnica Superior de Ingenieros Informaticos Enero 2016
208 grafo.addEdge (Plaza_Espanya,Angel_Guimera,0.55, "linea1");
209 grafo.addEdge (Angel_Guimera,Turia,1.09, "linea1");
210 grafo.addEdge (Turia,Campanar_La_Fe,0.73, "linea1");
211 grafo.addEdge (Campanar_La_Fe,Beniferri,0.76, "linea1");
212 grafo.addEdge (Beniferri,Empalme,1.55, "linea1");
213 grafo.addEdge (Empalme,Cantereria,0.99, "linea1");
214 grafo.addEdge (Cantereria,Benimamet,0.65, "linea1");
215 grafo.addEdge (Benimamet,Les_Carolines_Fira,0.65, "linea1");
216 grafo.addEdge (Les_Carolines_Fira,Campament,1.02, "linea1");
217 grafo.addEdge (Campament,Paterna,0.69, "linea1");
218 grafo.addEdge (Paterna,Santa_Rita,1.38, "linea1");
219 grafo.addEdge (Santa_Rita,Fuente_del_Jarro,1.01, "linea1");
220 grafo.addEdge (Fuente_del_Jarro, La_Canyada,2.71, "linea1");
221 grafo.addEdge (La_Canyada,La_Vallesa,1.58, "linea1");
222 grafo.addEdge (La_Vallesa,Entrepins,1.64, "linea1");
223 grafo.addEdge (Entrepins,El_Clot,1.66, "linea1");
224 grafo.addEdge (El_Clot,Montesol,0.77, "linea1");
225 grafo.addEdge (Montesol,LEliana,0.83, "linea1");
226 grafo.addEdge (LEliana,Torre_del_Virrei,1.10, "linea1");
227 grafo.addEdge (Torre_del_Virrei,La_Pobla_De_Vallbona,2.24, "
linea1");
228 grafo.addEdge (La_Pobla_De_Vallbona,Benaguasil_1r,1.76, "linea1"
);
R.Sanz 99
Escuela Tecnica Superior de Ingenieros Informaticos Enero 2016
229 grafo.addEdge (Benaguasil_1r,Benaguasil_2n,0.84, "linea1");
230 grafo.addEdge (Benaguasil_2n,Lliria,3.21, "linea1");
231 grafo.addEdge (Empalme,Burjassot,1.09, "linea1");
232 grafo.addEdge (Burjassot,Burjassot_Godella,0.79, "linea1");
233 grafo.addEdge (Burjassot_Godella,Godella,0.69, "linea1");
234 grafo.addEdge (Godella,Rocafort,1.17, "linea1");
235 grafo.addEdge (Rocafort,Massarrojos,0.96, "linea1");
236 grafo.addEdge (Massarrojos,Montcada_Alfara,1.57, "linea1");
237 grafo.addEdge (Montcada_Alfara, Seminari_CEU,0.73, "linea1");
238 grafo.addEdge (Seminari_CEU,Masies,2.51, "linea1");
239 grafo.addEdge (Masies,S_Psiquiatric,3.87, "linea1");
240 grafo.addEdge (S_Psiquiatric,Betera,1.60, "linea1");
241 grafo.addEdge (Joaquin_Sorolla,Bailen,0.65, "linea5");
242 grafo.addEdge (Bailen,Colon,0.95, "linea5");
243 grafo.addEdge (Colon,Alameda,0.57, "linea5");
244 grafo.addEdge (Colon,Alameda,0.57, "linea3");
245 grafo.addEdge (Alameda,Aragon,0.58, "linea5");
246 grafo.addEdge (Aragon,Amistat,0.65, "linea5");
247 grafo.addEdge (Amistat,Ayora,0.84, "linea5");
248 grafo.addEdge (Ayora,Maritim_Serreria,0.44, "linea5");
249 grafo.addEdge (Maritim_Serreria,Francesc_Cubells,0.38, "linea5")
;
R.Sanz 100
Escuela Tecnica Superior de Ingenieros Informaticos Enero 2016
250 grafo.addEdge (Maritim_Serreria,Francesc_Cubells,0.38, "linea6")
;
251 grafo.addEdge (Francesc_Cubells,Grau_Canyamelar,0.74, "linea5");
252 grafo.addEdge (Francesc_Cubells,Grau_Canyamelar,0.74, "linea6");
253 grafo.addEdge (Grau_Canyamelar,Neptu,0.35, "linea5");
254 grafo.addEdge (Colon,Xativa,0.67, "linea5");
255 grafo.addEdge (Colon,Xativa,0.67, "linea3");
256 grafo.addEdge (Xativa,Angel_Guimera,0.76, "linea5");
257 grafo.addEdge (Xativa,Angel_Guimera,0.76, "linea3");
258 grafo.addEdge (Angel_Guimera,Avinguda_del_Cid,1.10, "linea5");
259 grafo.addEdge (Angel_Guimera,Avinguda_del_Cid,1.10, "linea3");
260 grafo.addEdge (Avinguda_del_Cid,Nou_dOctubre,0.89, "linea5");
261 grafo.addEdge (Avinguda_del_Cid,Nou_dOctubre,0.89, "linea3");
262 grafo.addEdge (Nou_dOctubre,Mislata,1, "linea5");
263 grafo.addEdge (Nou_dOctubre,Mislata,1, "linea3");
264 grafo.addEdge (Mislata,Mislata_Almassil,0.58, "linea5");
265 grafo.addEdge (Mislata,Mislata_Almassil,0.58, "linea3");
266 grafo.addEdge (Mislata_Almassil,Faitanar,0.78, "linea5");
267 grafo.addEdge (Faitanar,Quart_de_Poblet,0.85, "linea5");
268 grafo.addEdge (Quart_de_Poblet,Salt_de_lAigua,0.87,"linea5");
269 grafo.addEdge (Salt_de_lAigua,Manises,0.92, "linea5");
270 grafo.addEdge (Manises,Rosas,0.79, "linea5");
271 grafo.addEdge (Rosas,Aeroport,0.66, "linea5");
R.Sanz 101
Escuela Tecnica Superior de Ingenieros Informaticos Enero 2016
272 grafo.addEdge (Mislata_Almassil,Faitanar,0.78, "linea3");
273 grafo.addEdge (Faitanar,Quart_de_Poblet,0.85, "linea3");
274 grafo.addEdge (Quart_de_Poblet,Salt_de_lAigua,0.87,"linea3");
275 grafo.addEdge (Salt_de_lAigua,Manises,0.92, "linea3");
276 grafo.addEdge (Manises,Rosas,0.79, "linea3");
277 grafo.addEdge (Rosas,Aeroport,0.66, "linea3");
278 grafo.addEdge (Alameda,Facultats,0.61, "linea3");
279 grafo.addEdge (Facultats,Benimaclet,0.89, "linea3");
280 grafo.addEdge (Benimaclet,Machado,0.88, "linea3");
281 grafo.addEdge (Machado,Alboraya_Palmaret,0.49, "linea3");
282 grafo.addEdge (Alboraya_Palmaret,Alboraya_Peris_Arago,0.63, "
linea3");
283 grafo.addEdge (Alboraya_Peris_Arago, Almassera,1.30, "linea3");
284 grafo.addEdge (Almassera,Meliana,1.86, "linea3");
285 grafo.addEdge (Meliana,Foios,1.09, "linea3");
286 grafo.addEdge (Foios,Albalat_dels_Sorells,1.03, "linea3");
287 grafo.addEdge (Albalat_dels_Sorells,Museros,1.96, "linea3");
288 grafo.addEdge (Museros,Massamagrell,1.21, "linea3");
289 grafo.addEdge (Massamagrell,La_Pobla_de_Farnals,1.01, "linea3");
290 grafo.addEdge (La_Pobla_de_Farnals,Rafelbunyol,1.05, "linea3");
291 grafo.addEdge (Grau_Canyamelar,Mediterrani,0.43, "linea6");
292 grafo.addEdge (Mediterrani,Doctor_Lluch,0.36, "linea6");
293 grafo.addEdge (Mediterrani,Doctor_Lluch,0.36, "linea4");
R.Sanz 102
Escuela Tecnica Superior de Ingenieros Informaticos Enero 2016
294 grafo.addEdge (Doctor_Lluch, La_Marina,0.40, "linea6");
295 grafo.addEdge (Doctor_Lluch, La_Marina,0.40, "linea4");
296 grafo.addEdge (La_Marina, La_Cadena,0.35, "linea6");
297 grafo.addEdge (La_Marina, La_Cadena,0.35, "linea4");
298 grafo.addEdge (La_Cadena,Eugenia_Vines,0.36, "linea6");
299 grafo.addEdge (La_Cadena,Eugenia_Vines,0.36, "linea4");
300 grafo.addEdge (Eugenia_Vines,Les_Arenes,0.53, "linea6");
301 grafo.addEdge (Eugenia_Vines,Les_Arenes,0.53, "linea4");
302 grafo.addEdge (Les_Arenes,Mediterrani,0.32, "linea6");
303 grafo.addEdge (Les_Arenes,Mediterrani,0.32, "linea4");
304 grafo.addEdge (La_Cadena,Serreria,0.48, "linea6");
305 grafo.addEdge (La_Cadena,Serreria,0.48, "linea4");
306 grafo.addEdge(Benimaclet, Serreria, 2.87, "linea6");
307 grafo.addEdge (Serreria,Tarongers,0.51, "linea6");
308 grafo.addEdge (Serreria,Tarongers,0.51, "linea4");
309 grafo.addEdge (Tarongers,La_Carrasca,0.46, "linea6");
310 grafo.addEdge (Tarongers,La_Carrasca,0.46, "linea4");
311 grafo.addEdge (La_Carrasca,Universitat_Politecnica,0.51, "linea6
");
312 grafo.addEdge (La_Carrasca,Universitat_Politecnica,0.51, "linea4
");
313 grafo.addEdge (Universitat_Politecnica,Vicent_Zaragoza,0.67, "
linea6");
R.Sanz 103
Escuela Tecnica Superior de Ingenieros Informaticos Enero 2016
314 grafo.addEdge (Universitat_Politecnica,Vicent_Zaragoza,0.67, "
linea4");
315 grafo.addEdge (Vicent_Zaragoza,Benimaclet,0.72, "linea6");
316 grafo.addEdge (Vicent_Zaragoza,Benimaclet,0.72, "linea4");
317 grafo.addEdge (Benimaclet,Primat_Reig,0.46, "linea6");
318 grafo.addEdge (Benimaclet,Primat_Reig,0.46, "linea4");
319 grafo.addEdge (Primat_Reig,Alfauir,0.52, "linea6");
320 grafo.addEdge (Alfauir,Orriols,0.5, "linea6");
321 grafo.addEdge (Orriols,Estadi_del_Llevant,0.52, "linea6");
322 grafo.addEdge (Estadi_del_Llevant,Sant_Miquel_dels_Reis,0.50, "
linea6");
323 grafo.addEdge (Sant_Miquel_dels_Reis,Tossal_del_Rei,0.48, "
linea6");
324 grafo.addEdge (Primat_Reig,Pont_de_Fusta,0.84, "linea4");
325 grafo.addEdge (Pont_de_Fusta,Sagunt,1, "linea4");
326 grafo.addEdge (Sagunt,Reus,0.37, "linea4");
327 grafo.addEdge (Reus,Marxalenes,0.65, "linea4");
328 grafo.addEdge (Marxalenes,Transits,0.29, "linea4");
329 grafo.addEdge (Transits,Benicalap,0.31, "linea4");
330 grafo.addEdge (Benicalap,Garbi,0.42, "linea4");
331 grafo.addEdge (Garbi,Florista,0.32, "linea4");
332 grafo.addEdge (Florista,Palau_de_Congressos,0.42, "linea4");
333 grafo.addEdge (Palau_de_Congressos,Empalme,0.36, "linea4");
R.Sanz 104
Escuela Tecnica Superior de Ingenieros Informaticos Enero 2016
334 grafo.addEdge (Empalme,La_Granja,0.93, "linea4");
335 grafo.addEdge (La_Granja, Sant_Joan,0.22, "linea4");
336 grafo.addEdge (Sant_Joan,Campus_de_Burjassot,0.24, "linea4");
337 grafo.addEdge (Campus_de_Burjassot,Vicent_Andres_Estelles,0.18,
"linea4");
338 grafo.addEdge (Vicent_Andres_Estelles,Fira_Valencia,0.83, "
linea4");
339 grafo.addEdge (Vicent_Andres_Estelles,TVV,0.38, "linea4");
340 grafo.addEdge (TVV,Santa_Gemma_Parc_Cientific_UV,0.34, "linea4")
;
341 grafo.addEdge (TVV,Ll_Llarga_Terramelar,0.85, "linea4");
342 grafo.addEdge (Santa_Gemma_Parc_Cientific_UV,Tomas_y_Valiente
,0.35, "linea4");
343 grafo.addEdge (Tomas_y_Valiente,La_Coma,0.80, "linea4");
344 grafo.addEdge (La_Coma,Mas_del_Rosari,0.28, "linea4");
345 Iterator<Edge> l = grafo.getMap().get(salida).iterator();
346 boolean cond = true;
347 Edge tramo;
348 while(l.hasNext() && cond){
349 tramo = l.next();
350 if(((Nodo)tramo.n1).getNombre() == salida){
351 this.salida = (Nodo)tramo.n1;
352 cond = false;
R.Sanz 105
Escuela Tecnica Superior de Ingenieros Informaticos Enero 2016
353 }
354 }
355 l = grafo.getMap().get(llegada).iterator();
356 cond = true;
357 while(l.hasNext() && cond){
358 tramo = l.next();
359 if(((Nodo)tramo.n1).getNombre() == llegada){
360 this.llegada = (Nodo)tramo.n1;
361 cond = false;
362 }
363 }
364 }
365 public List<Pixel> recorridoObtimo(){
366 String linea = "";
367 String lineaA = "Linea0";
368 Arbol arbol = new Arbol(salida, llegada, grafo);
369 List<Nodo> camino = arbol.recorridoObtimo(arbol.
CalcularRecorrido());
370 List<Pixel> recorrido = new ArrayList<Pixel>();
371 Iterator<Nodo> iterador = camino.iterator();
372 Iterator<Nodo> iterador2 = camino.iterator();
373 iterador2.next();
374 while(iterador.hasNext()){
R.Sanz 106
Escuela Tecnica Superior de Ingenieros Informaticos Enero 2016
375 Nodo nodo = iterador.next();
376 Nodo nodo2;
377 if (iterador2.hasNext()){
378 nodo2 = iterador2.next();
379 Iterator<Edge> l = grafo.getMap().get(nodo.getNombre()).iterator
();
380 boolean cond = true;
381 Edge tramo;
382 while(l.hasNext() && cond){
383 tramo = l.next();
384 if(((Nodo)tramo.n2).getNombre() == nodo2.getNombre()){
385 if (cond && linea == lineaA){
386 linea = tramo.getLabel();
387 cond = false;
388 }
389 else linea = tramo.getLabel();
390 }
391 }
392 lineaA=linea;
393 }
394 else linea = "";
395 Pixel pixel = new Pixel(nodo.getX(),nodo.getY(),nodo.getNombre()
,linea);
R.Sanz 107
Escuela Tecnica Superior de Ingenieros Informaticos Enero 2016
396 recorrido.add(pixel);
397 }
398 return recorrido;
399 }
400 }
R.Sanz 108
Escuela Tecnica Superior de Ingenieros Informaticos Enero 2016
9.2.2. ChoiceLle.java
1 package Grafica;
2 import java.applet.Applet;
3 import java.awt.*;
4 import java.awt.event.*;
5 import javax.swing.JScrollPane;
6 public class ChoiceLle extends Applet implements ItemListener {
7 /* Declaration */
8 private LayoutManager Layout;
9 String [] Estaciones = new String [131];
10 List Selector = new List(30,false);
11 private Font Times;
12 Ventana llegada;
13 public ChoiceLle (Ventana llegada, JScrollPane panel, Container
contentpane) {
14 /* Declaration */
15 this.llegada = llegada;
16 int i;
17 /* Instantiation */
18 Times = new Font("TimeNewRoman", 20, 30);
19 Layout = new FlowLayout ();
20 Selector.setFont (Times);
21 Selector.setBounds(75, 200, 335, 90);
R.Sanz 109
Escuela Tecnica Superior de Ingenieros Informaticos Enero 2016
22 /* Decoration */
23 Estaciones [0] = "Estacion de llegada ...";
24 Estaciones [1]= "Aeroport";
25 Estaciones [2]= "Alameda";
26 Estaciones [3]= "Albalat_dels_Sorells";
27 Estaciones [4]= "Alboraya_Palmaret";
28 Estaciones [5]= "Alboraya_Peris_Arago";
29 Estaciones [6]= "Alberic";
30 Estaciones [7]= "Alfauir";
31 Estaciones [8]= "Alginet";
32 Estaciones [9]= "Almassera";
33 Estaciones [10]= "Amistat";
34 Estaciones [11]= "Angel_Guimera";
35 Estaciones [12]= "Aragon";
36 Estaciones [13]= "Ausias_March";
37 Estaciones [14]= "Avinguda_del_Cid";
38 Estaciones [15]= "Ayora";
39 Estaciones [16]= "Bailen";
40 Estaciones [17]= "Benaguasil_1r";
41 Estaciones [18]= "Benaguasil_2n";
42 Estaciones [19]= "Benicalap";
43 Estaciones [20]= "Beniferri";
44 Estaciones [21]= "Benimaclet";
R.Sanz 110
Escuela Tecnica Superior de Ingenieros Informaticos Enero 2016
45 Estaciones [22]= "Benimamet";
46 Estaciones [23]= "Benimodo";
47 Estaciones [24]= "Betera";
48 Estaciones [25]= "Burjassot";
49 Estaciones [26]= "Burjassot_Godella";
50 Estaciones [27]= "Campament";
51 Estaciones [28]= "Campanar_La_Fe";
52 Estaciones [29]= "Campus_de_Burjassot";
53 Estaciones [30]= "Cantereria";
54 Estaciones [31]= "Carlet";
55 Estaciones [32]= "Col_legi_El_Vedat";
56 Estaciones [33]= "Colon";
57 Estaciones [34]= "Doctor_Lluch";
58 Estaciones [35]= "El_Clot";
59 Estaciones [36]= "Empalme";
60 Estaciones [37]= "Entrepins";
61 Estaciones [38]= "Estadi_del_LLevant";
62 Estaciones [39]= "Espioca";
63 Estaciones [40]= "Eugenia_Vines";
64 Estaciones [41]= "Facultats";
65 Estaciones [42]= "Faitanar";
66 Estaciones [43]= "Fira_Valencia";
67 Estaciones [44]= "Florista";
R.Sanz 111
Escuela Tecnica Superior de Ingenieros Informaticos Enero 2016
68 Estaciones [45]= "Font_Almanguer";
69 Estaciones [46]= "Foios";
70 Estaciones [47]= "Francesc_Cubells";
71 Estaciones [48]= "Fuente_del_Jarro";
72 Estaciones [49]= "Garbi";
73 Estaciones [50]= "Godella";
74 Estaciones [51]= "Grau_Canyamelar";
75 Estaciones [52]= "Joaquin_Sorolla";
76 Estaciones [53]= "LAlcudia";
77 Estaciones [54]= "LEliana";
78 Estaciones [55]= "La_Cadena";
79 Estaciones [56]= "La_Canyada";
80 Estaciones [57]= "La_Carrasca";
81 Estaciones [58]= "La_Coma";
82 Estaciones [59]= "La_Granja";
83 Estaciones [60]= "La_Marina";
84 Estaciones [61]= "La_Pobla_de_Farnals";
85 Estaciones [62]= "La_Pobla_De_Vallbona";
86 Estaciones [63]= "La_Vallesa";
87 Estaciones [64]= "Les_Arenes";
88 Estaciones [65]= "Les_Carolines_Fira";
89 Estaciones [66]= "Ll_Llarga_Terramelar";
90 Estaciones [67]= "Lliria";
R.Sanz 112
Escuela Tecnica Superior de Ingenieros Informaticos Enero 2016
91 Estaciones [68]= "Machado";
92 Estaciones [69]= "Manises";
93 Estaciones [70]= "Maritim_Serreria";
94 Estaciones [71]= "Marxalenes";
95 Estaciones [72]= "Mas_del_Rosari";
96 Estaciones [73]= "Masies";
97 Estaciones [74]= "Massalaves";
98 Estaciones [75]= "Massamagrell";
99 Estaciones [76]= "Massarrojos";
100 Estaciones [77]= "Meliana";
101 Estaciones [78]= "Mediterrani";
102 Estaciones [79]= "Mislata";
103 Estaciones [80]= "Mislata_Almassil";
104 Estaciones [81]= "Montcada_Alfara";
105 Estaciones [82]= "Montesol";
106 Estaciones [83]= "Montortal";
107 Estaciones [84]= "Museros";
108 Estaciones [85]= "Neptu";
109 Estaciones [86]= "Nou_d’Octubre";
110 Estaciones [87]= "Omet";
111 Estaciones [88]= "Orriols";
112 Estaciones [89]= "Paiporta";
113 Estaciones [90]= "Palau_de_Congressos";
R.Sanz 113
Escuela Tecnica Superior de Ingenieros Informaticos Enero 2016
114 Estaciones [91]= "Paterna";
115 Estaciones [92]= "Patraix";
116 Estaciones [93]= "Picanya";
117 Estaciones [94]= "Picassent";
118 Estaciones [95]= "PlazaEspanya";
119 Estaciones [96]= "Pont_de_Fusta";
120 Estaciones [97]= "Primat_Reig";
121 Estaciones [98]= "Quart_de_Poblet";
122 Estaciones [99]= "Rafelbunyol";
123 Estaciones [100]= "Realon";
124 Estaciones [101]= "Reus";
125 Estaciones [102]= "Rocafort";
126 Estaciones [103]= "Rosas";
127 Estaciones [104]= "S_Psiquiatric";
128 Estaciones [105]= "Safranar";
129 Estaciones [106]= "Sagunt";
130 Estaciones [107]= "Salt_de_lAigua";
131 Estaciones [108]= "Sant_Isidre";
132 Estaciones [109]= "Sant_Joan";
133 Estaciones [110]= "Sant_Miquel_dels_Reis";
134 Estaciones [111]= "Sant_Ramon";
135 Estaciones [112]= "Santa_Gemma_Parc_Cientific_UV";
136 Estaciones [113]= "Santa_Rita";
R.Sanz 114
Escuela Tecnica Superior de Ingenieros Informaticos Enero 2016
137 Estaciones [114]= "Seminari_CEU";
138 Estaciones [115]= "Serreria";
139 Estaciones [116]= "Tarongers";
140 Estaciones [117]= "Tomas_y_Valiente";
141 Estaciones [118]= "Torre_del_Virrei";
142 Estaciones [119]= "Torrent";
143 Estaciones [120]= "Torrent_Avinguda";
144 Estaciones [121]= "Tossal_del_Rei";
145 Estaciones [122]= "Transits";
146 Estaciones [123]= "Turia";
147 Estaciones [124]= "TVV";
148 Estaciones [125]= "Universitat_Politecnica";
149 Estaciones [126]= "Valencia_Sud";
150 Estaciones [127]= "Vicent_Andres_Estelles";
151 Estaciones [128]= "Vicent_Zaragoza";
152 Estaciones [129]= "Villanueva_de_Castellon";
153 Estaciones [130]= "Xativa";
154 for (i = 0; i < Estaciones.length; ++i) {
155 Selector.addItem(Estaciones[i],i);
156 }
157 /* Location */
158 setLayout (Layout);
159 Selector.setBounds(525, 200, 335, 400);
R.Sanz 115
Escuela Tecnica Superior de Ingenieros Informaticos Enero 2016
160 panel.add(Selector);
161 contentpane.add(Selector);
162 /* Configuration */
163 Selector.addItemListener (this);
164 /* Initialization */
165 Selector.select (0);
166 }
167 public void itemStateChanged(ItemEvent e) {
168 int Selection;
169 Selection = Selector.getSelectedIndex();
170 llegada.setllegada(Estaciones[Selection]);
171 }
172 }
R.Sanz 116
Escuela Tecnica Superior de Ingenieros Informaticos Enero 2016
9.2.3. ChoiceSal.java
1 package Grafica;
2 import java.applet.Applet;
3 import java.awt.*;
4 import java.awt.event.*;
5 import javax.swing.JScrollPane;
6 public class ChoiceSal extends Applet implements ItemListener {
7 /* Declaration */
8 private LayoutManager Layout;
9 String [] Estaciones = new String [131];
10 List Selector = new List(30,false);
11 private Font Times;
12 Ventana salida;
13 public ChoiceSal (Ventana salida, JScrollPane panel, Container
contentpane) {
14 /* Declaration */
15 this.salida = salida;
16 int i;
17 /* Instantiation */
18 Times = new Font("TimeNewRoman", 20, 30);
19 Layout = new FlowLayout ();
20 Selector.setFont (Times);
21 Selector.setBounds(40, 200, 335, 90);
R.Sanz 117
Escuela Tecnica Superior de Ingenieros Informaticos Enero 2016
22 /* Decoration */
23 Estaciones [0] = "Estacion de Salida ...";
24 Estaciones [1]= "Aeroport";
25 Estaciones [2]= "Alameda";
26 Estaciones [3]= "Albalat_dels_Sorells";
27 Estaciones [4]= "Alboraya_Palmaret";
28 Estaciones [5]= "Alboraya_Peris_Arago";
29 Estaciones [6]= "Alberic";
30 Estaciones [7]= "Alfauir";
31 Estaciones [8]= "Alginet";
32 Estaciones [9]= "Almassera";
33 Estaciones [10]= "Amistat";
34 Estaciones [11]= "Angel_Guimera";
35 Estaciones [12]= "Aragon";
36 Estaciones [13]= "Ausias_March";
37 Estaciones [14]= "Avinguda_del_Cid";
38 Estaciones [15]= "Ayora";
39 Estaciones [16]= "Bailen";
40 Estaciones [17]= "Benaguasil_1r";
41 Estaciones [18]= "Benaguasil_2n";
42 Estaciones [19]= "Benicalap";
43 Estaciones [20]= "Beniferri";
44 Estaciones [21]= "Benimaclet";
R.Sanz 118
Escuela Tecnica Superior de Ingenieros Informaticos Enero 2016
45 Estaciones [22]= "Benimamet";
46 Estaciones [23]= "Benimodo";
47 Estaciones [24]= "Betera";
48 Estaciones [25]= "Burjassot";
49 Estaciones [26]= "Burjassot_Godella";
50 Estaciones [27]= "Campament";
51 Estaciones [28]= "Campanar_La_Fe";
52 Estaciones [29]= "Campus_de_Burjassot";
53 Estaciones [30]= "Cantereria";
54 Estaciones [31]= "Carlet";
55 Estaciones [32]= "Col_legi_El_Vedat";
56 Estaciones [33]= "Colon";
57 Estaciones [34]= "Doctor_Lluch";
58 Estaciones [35]= "El_Clot";
59 Estaciones [36]= "Empalme";
60 Estaciones [37]= "Entrepins";
61 Estaciones [38]= "Estadi_del_LLevant";
62 Estaciones [39]= "Espioca";
63 Estaciones [40]= "Eugenia_Vines";
64 Estaciones [41]= "Facultats";
65 Estaciones [42]= "Faitanar";
66 Estaciones [43]= "Fira_Valencia";
67 Estaciones [44]= "Florista";
R.Sanz 119
Escuela Tecnica Superior de Ingenieros Informaticos Enero 2016
68 Estaciones [45]= "Font_Almanguer";
69 Estaciones [46]= "Foios";
70 Estaciones [47]= "Francesc_Cubells";
71 Estaciones [48]= "Fuente_del_Jarro";
72 Estaciones [49]= "Garbi";
73 Estaciones [50]= "Godella";
74 Estaciones [51]= "Grau_Canyamelar";
75 Estaciones [52]= "Joaquin_Sorolla";
76 Estaciones [53]= "LAlcudia";
77 Estaciones [54]= "LEliana";
78 Estaciones [55]= "La_Cadena";
79 Estaciones [56]= "La_Canyada";
80 Estaciones [57]= "La_Carrasca";
81 Estaciones [58]= "La_Coma";
82 Estaciones [59]= "La_Granja";
83 Estaciones [60]= "La_Marina";
84 Estaciones [61]= "La_Pobla_de_Farnals";
85 Estaciones [62]= "La_Pobla_De_Vallbona";
86 Estaciones [63]= "La_Vallesa";
87 Estaciones [64]= "Les_Arenes";
88 Estaciones [65]= "Les_Carolines_Fira";
89 Estaciones [66]= "Ll_Llarga_Terramelar";
90 Estaciones [67]= "Lliria";
R.Sanz 120
Escuela Tecnica Superior de Ingenieros Informaticos Enero 2016
91 Estaciones [68]= "Machado";
92 Estaciones [69]= "Manises";
93 Estaciones [70]= "Maritim_Serreria";
94 Estaciones [71]= "Marxalenes";
95 Estaciones [72]= "Mas_del_Rosari";
96 Estaciones [73]= "Masies";
97 Estaciones [74]= "Massalaves";
98 Estaciones [75]= "Massamagrell";
99 Estaciones [76]= "Massarrojos";
100 Estaciones [77]= "Meliana";
101 Estaciones [78]= "Mediterrani";
102 Estaciones [79]= "Mislata";
103 Estaciones [80]= "Mislata_Almassil";
104 Estaciones [81]= "Montcada_Alfara";
105 Estaciones [82]= "Montesol";
106 Estaciones [83]= "Montortal";
107 Estaciones [84]= "Museros";
108 Estaciones [85]= "Neptu";
109 Estaciones [86]= "Nou_d’Octubre";
110 Estaciones [87]= "Omet";
111 Estaciones [88]= "Orriols";
112 Estaciones [89]= "Paiporta";
113 Estaciones [90]= "Palau_de_Congressos";
R.Sanz 121
Escuela Tecnica Superior de Ingenieros Informaticos Enero 2016
114 Estaciones [91]= "Paterna";
115 Estaciones [92]= "Patraix";
116 Estaciones [93]= "Picanya";
117 Estaciones [94]= "Picassent";
118 Estaciones [95]= "PlazaEspanya";
119 Estaciones [96]= "Pont_de_Fusta";
120 Estaciones [97]= "Primat_Reig";
121 Estaciones [98]= "Quart_de_Poblet";
122 Estaciones [99]= "Rafelbunyol";
123 Estaciones [100]= "Realon";
124 Estaciones [101]= "Reus";
125 Estaciones [102]= "Rocafort";
126 Estaciones [103]= "Rosas";
127 Estaciones [104]= "S_Psiquiatric";
128 Estaciones [105]= "Safranar";
129 Estaciones [106]= "Sagunt";
130 Estaciones [107]= "Salt_de_lAigua";
131 Estaciones [108]= "Sant_Isidre";
132 Estaciones [109]= "Sant_Joan";
133 Estaciones [110]= "Sant_Miquel_dels_Reis";
134 Estaciones [111]= "Sant_Ramon";
135 Estaciones [112]= "Santa_Gemma_Parc_Cientific_UV";
136 Estaciones [113]= "Santa_Rita";
R.Sanz 122
Escuela Tecnica Superior de Ingenieros Informaticos Enero 2016
137 Estaciones [114]= "Seminari_CEU";
138 Estaciones [115]= "Serreria";
139 Estaciones [116]= "Tarongers";
140 Estaciones [117]= "Tomas_y_Valiente";
141 Estaciones [118]= "Torre_del_Virrei";
142 Estaciones [119]= "Torrent";
143 Estaciones [120]= "Torrent_Avinguda";
144 Estaciones [121]= "Tossal_del_Rei";
145 Estaciones [122]= "Transits";
146 Estaciones [123]= "Turia";
147 Estaciones [124]= "TVV";
148 Estaciones [125]= "Universitat_Politecnica";
149 Estaciones [126]= "Valencia_Sud";
150 Estaciones [127]= "Vicent_Andres_Estelles";
151 Estaciones [128]= "Vicent_Zaragoza";
152 Estaciones [129]= "Villanueva_de_Castellon";
153 Estaciones [130]= "Xativa";
154 for (i = 0; i < Estaciones.length; ++i) {
155 Selector.addItem(Estaciones[i],i);
156 }
157 /* Location */
158 setLayout (Layout);
159 Selector.setBounds(40, 200, 335, 400);
R.Sanz 123
Escuela Tecnica Superior de Ingenieros Informaticos Enero 2016
160 panel.add(Selector);
161 contentpane.add(Selector);
162 /* Configuration */
163 Selector.addItemListener (this);
164 /* Initialization */
165 Selector.select (0);
166 }
167 public void itemStateChanged(ItemEvent e) {
168 int Selection;
169 Selection = Selector.getSelectedIndex();
170 salida.setsalida(Estaciones[Selection]);
171 }
172 }
R.Sanz 124
Escuela Tecnica Superior de Ingenieros Informaticos Enero 2016
9.2.4. Dibujo.java
1 package Grafica;
2 import java.awt.*;
3 import java.awt.event.*;
4 import java.util.List;
5 import javax.swing.*;
6 public class Dibujo extends Frame{
7 private JTextArea areaTexto1;
8 // configurar GUI
9 public Dibujo(List<Pixel> lista){
10 super( "Camino optimo" );
11 // establecer menu Archivo y sus elementos de menu
12 Menu menuArchivo = new Menu( "Archivo" );
13 // establecer elemento de menu Acerca de...
14 MenuItem elementoAcerca = new MenuItem( "Acerca de..." );
15 menuArchivo.add( elementoAcerca );
16 elementoAcerca.addActionListener(
17 new ActionListener() { // clase interna anonima
18 // mostrar cuadro de dialogo de mensaje
19 // cuando el usuario seleccione Acerca de...
20 public void actionPerformed( ActionEvent evento )
21 {
22 JOptionPane.showMessageDialog( Dibujo.this,
R.Sanz 125
Escuela Tecnica Superior de Ingenieros Informaticos Enero 2016
23 "Este software fue disenado por: \nRicardo Sanz Hinojosas" +
24 "\n",
25 "Acerca de", JOptionPane.PLAIN_MESSAGE );
26 }
27 } // fin de la clase interna anonima
28 ); // fin de la llamada a addActionListener
29 // establecer elemento de menu Salir
30 MenuItem elementoSalir = new MenuItem( "Salir" );
31 menuArchivo.add( elementoSalir );
32 elementoSalir.addActionListener(
33 new ActionListener() { // clase interna anonima
34 // terminar la aplicacion cuando el usuario haga clic en
elementoSalir
35 public void actionPerformed( ActionEvent evento )
36 {
37 System.exit( 0 );
38 }
39 } // fin de la clase interna anonima
40 ); // fin de la llamada a addActionListener
41 // crear barra de menus y adjuntarla a la ventana
42 MenuBar barra = new MenuBar();
43 setMenuBar( barra );
44 barra.add( menuArchivo );
R.Sanz 126
Escuela Tecnica Superior de Ingenieros Informaticos Enero 2016
45 // Clase anidada que permite terminar la ejecucion de la
animacion
46 this.addWindowListener(
47 // Definicion de la clase anonima para controlar el cierre de
48 // la ventana
49 new WindowAdapter() {
50 public void windowClosing( WindowEvent evt ) {
51 // Se concluye el programa
52 System.exit( 0 );
53 }
54 } );
55 //////////////////////////////////////
56 setSize( 1000, 750 );
57 setVisible(true);
58 String cadena = "";
59 for (int i = lista.size()-1; i >-1 ;i--){
60 cadena = cadena + lista.get(i).getNombre() + "\n";
61 if (i > 0){
62 cadena = cadena + " | ("+lista.get(i-1).getLinea()+")
\n";
63 }
64 }
65 // establecer areaTexto1
R.Sanz 127
Escuela Tecnica Superior de Ingenieros Informaticos Enero 2016
66 areaTexto1 = new JTextArea( cadena, 700, 300 );
67 add( new JScrollPane( areaTexto1 ) );
68 areaTexto1.setFont(new Font("TimeNewRoman", 10, 18));
69 } // fin del constructor
70 }
R.Sanz 128
Escuela Tecnica Superior de Ingenieros Informaticos Enero 2016
9.2.5. Pixel.java
1 package Grafica;
2 public class Pixel {
3 String Nombre, linea;
4 int x,y;
5 public Pixel(int x, int y, String Nombre, String linea) {
6 this.x = x;
7 this.y = y;
8 this.Nombre = Nombre;
9 this.linea = linea;
10 }
11 public void setNombre(String nombre){
12 this.Nombre = nombre;
13 }
14 public String getNombre(){
15 return this.Nombre;
16 }
17 public void setLinea(String linea){
18 this.linea = linea;
19 }
20 public String getLinea(){
21 return this.linea;
22 }
R.Sanz 129
Escuela Tecnica Superior de Ingenieros Informaticos Enero 2016
23 public void setCoordenas(int x, int y){
24 this.x = x;
25 this.y = y;
26 }
27 public int getX(){
28 return this.x;
29 }
30 public int getY(){
31 return this.y;
32 }
33 }
R.Sanz 130
Escuela Tecnica Superior de Ingenieros Informaticos Enero 2016
9.2.6. Ventana.java
1 package Grafica;
2 import java.awt.*;
3 import java.awt.event.*;
4 import javax.swing.*;
5 public class Ventana extends JFrame{
6 private JLabel pantallaEtiqueta;
7 private String salida;
8 private String llegada;
9 public void setsalida(String salida){
10 this.salida = salida;
11 }
12 public void setllegada(String llegada){
13 this.llegada = llegada;
14 }
15 // configurar GUI
16 public Ventana(){
17 super( "Camino optimo" );
18 // establecer menu Archivo y sus elementos de menu
19 JMenu menuArchivo = new JMenu( "Archivo" );
20 menuArchivo.setMnemonic( ’A’ );
21 // establecer elemento de menu Acerca de...
22 JMenuItem elementoAcerca = new JMenuItem( "Acerca de..." );
R.Sanz 131
Escuela Tecnica Superior de Ingenieros Informaticos Enero 2016
23 elementoAcerca.setMnemonic( ’A’ );
24 menuArchivo.add( elementoAcerca );
25 elementoAcerca.addActionListener(
26 new ActionListener() { // clase interna anonima
27 // mostrar cuadro de dialogo de mensaje
28 //cuando el usuario seleccione Acerca de...
29 public void actionPerformed( ActionEvent evento )
30 {
31 JOptionPane.showMessageDialog( Ventana.this,
32 "Este software fue disenado por: \nRicardo Sanz Hinojosas" +
33 "\n",
34 "Acerca de", JOptionPane.PLAIN_MESSAGE );
35 }
36 } // fin de la clase interna anonima
37 ); // fin de la llamada a addActionListener
38 // establecer elemento de menu Salir
39 JMenuItem elementoSalir = new JMenuItem( "Salir" );
40 elementoSalir.setMnemonic( ’S’ );
41 menuArchivo.add( elementoSalir );
42 elementoSalir.addActionListener(
43 new ActionListener() { // clase interna anonima
44 // terminar la aplicacion cuando el usuario haga clic en
elementoSalir
R.Sanz 132
Escuela Tecnica Superior de Ingenieros Informaticos Enero 2016
45 public void actionPerformed( ActionEvent evento )
46 {
47 System.exit( 0 );
48 }
49 } // fin de la clase interna anonima
50 ); // fin de la llamada a addActionListener
51 // crear barra de menus y adjuntarla a la ventana
52 JMenuBar barra = new JMenuBar();
53 setJMenuBar( barra );
54 barra.add( menuArchivo );
55 //////////////////////////////////////
56 final JScrollPane panel = new JScrollPane();
57 panel.setLayout(null);
58 panel.setAutoscrolls(true);
59 final Container contentpane = getContentPane();
60 ChoiceSal Salida = new ChoiceSal(this,panel,contentpane);
61 ChoiceLle Llegada = new ChoiceLle(this,panel,contentpane);
62 JButton Aceptar = new JButton("Aceptar");
63 Aceptar.setFont(new Font("TimeNewRoman", 20, 24));
64 Aceptar.setBounds(390, 250, 120, 40);
65 contentpane.add(Aceptar);
66 Aceptar.addActionListener(
67 new ActionListener() { // clase interna anonima
R.Sanz 133
Escuela Tecnica Superior de Ingenieros Informaticos Enero 2016
68 // terminar la aplicacion cuando el usuario haga clic en
elementoSalir
69 public void actionPerformed( ActionEvent evento )
70 {
71 System.out.print(salida);
72 System.out.print(" - ");
73 System.out.println(llegada);
74 AA AEstrella = new AA(salida,llegada);
75 JFrame.setDefaultLookAndFeelDecorated(false);
76 // AreaTexto texto = new AreaTexto(AEstrella.recorridoObtimo());
77 // texto.setDefaultCloseOperation( JFrame.EXIT_ON_CLOSE );
78 Dibujo aplicacion = new Dibujo(AEstrella.recorridoObtimo());
79 }
80 } // fin de la clase interna anonima
81 ); // fin de la llamada a addActionListener
82 //////////////////////
83 // establecer etiqueta para mostrar texto
84 pantallaEtiqueta = new JLabel( "Metro de Valencia",
SwingConstants.CENTER);
85 pantallaEtiqueta.setBounds(10, 10, 0, 0);
86 pantallaEtiqueta.setForeground( Color.black );
87 pantallaEtiqueta.setFont( new Font( "Serif", Font.PLAIN, 72 ) );
88 getContentPane().setBackground( Color.white );
R.Sanz 134
Escuela Tecnica Superior de Ingenieros Informaticos Enero 2016
89 getContentPane().add( pantallaEtiqueta, BorderLayout.NORTH );
90 setSize( 900, 700 );
91 setVisible( true );
92 } // fin del constructor
93 public static void main( String args[] )
94 {
95 JFrame.setDefaultLookAndFeelDecorated(false);
96 Ventana aplicacion = new Ventana();
97 aplicacion.setDefaultCloseOperation( JFrame.EXIT_ON_CLOSE );
98 }
99
100 }
R.Sanz 135
Escuela Tecnica Superior de Ingenieros Informaticos Enero 2016
9.3. Package Grafo
9.3.1. Grafo.java
1 package Grafo;
2
3 import java.util.ArrayList;
4 import java.util.HashMap;
5 import java.util.Iterator;
6 import java.util.List;
7 import java.util.Map;
8 import Arbol.*;
9 import Grafica.Pixel;
10 import jdd.graph.*;
11 public class Grafo extends jdd.graph.Graph{
12 List<Nodo> nodos = new ArrayList<Nodo>();;
13 List<Edge> edges = new ArrayList<Edge>();;
14 Map<String, List<Edge>> tabla = new HashMap<String, List<Edge
>>();;
15 public Grafo(boolean arg0) {
16 super(arg0);
17 }
18 public Nodo addNode (String nombre, int x, int y){
19 //Nodo nodo = (Nodo)super.addNode();
R.Sanz 136
Escuela Tecnica Superior de Ingenieros Informaticos Enero 2016
20 Nodo nodo = new Nodo(10);
21 nodos.add(nodo);
22 nodo.addNombre(nombre);
23 nodo.addCoordenas(x, y);
24 return nodo;
25 }
26
27 public Edge addEdge (Nodo n1, Nodo n2, double d, String linea){
28 Edge arista1 = new Edge(n1,n2,(int) d);
29 edges.add(arista1);
30 arista1.setWeight(d);
31 arista1.setLabel(linea);
32 if (tabla.isEmpty()){
33 tabla.put(n1.getNombre(), new ArrayList<Edge>());
34 tabla.put(n2.getNombre(), new ArrayList<Edge>());
35 }
36 if (tabla.containsKey(n1.getNombre())){
37 List<Edge> lista = tabla.get(n1.getNombre());
38 lista.add(arista1);
39 tabla.remove(n1.getNombre());
40 tabla.put(n1.getNombre(),lista);
41 }
42 else{
R.Sanz 137
Escuela Tecnica Superior de Ingenieros Informaticos Enero 2016
43 List<Edge> lista = new ArrayList<Edge>();
44 lista.add(arista1);
45 tabla.put(n1.getNombre(),lista);
46 }
47 Edge arista2 = super.addEdge(n2, n1);
48 arista2.setWeight(d);
49 arista2.setLabel(linea);
50 if (tabla.containsKey(n2.getNombre())){
51 List<Edge> lista = tabla.get(n2.getNombre());
52 lista.add(arista2);
53 tabla.remove(n2.getNombre());
54 tabla.put(n2.getNombre(),lista);
55 }
56 else{
57 List<Edge> lista = new ArrayList<Edge>();
58 lista.add(arista2);
59 tabla.put(n2.getNombre(),lista);
60 }
61 return arista1;
62 }
63 public List<LTreeNode<Elemento>> getChild(LTreeNode<Elemento>
nodo, Nodo fin){
R.Sanz 138
Escuela Tecnica Superior de Ingenieros Informaticos Enero 2016
64 List <LTreeNode<Elemento>> lista = new ArrayList<LTreeNode<
Elemento>>();
65 List<Edge> aristas = tabla.get(nodo.element().getnodo().
getNombre());
66 Iterator<Edge> iterador = aristas.iterator();
67 String nombre = "";
68 if (nodo.getParent() != null){
69 nombre = nodo.getParent().element().getnodo().getNombre();
70 }
71 while(iterador.hasNext()){
72 Edge arista = iterador.next();
73 Nodo hijo = (Nodo) arista.n2;
74 if (hijo.getNombre()!= nombre){
75 Elemento elemento = new Elemento(arista.weight,hijo.distancia(
fin),hijo);
76 LTreeNode<Elemento> node = new LTreeNode<Elemento>(elemento,nodo
,null);
77 lista.add(node);
78 }
79 }
80 return lista;
81 }
82 public Map<String, List<Edge>> getMap (){
R.Sanz 139
Escuela Tecnica Superior de Ingenieros Informaticos Enero 2016
83 return this.tabla;
84 }
85 }
R.Sanz 140
Escuela Tecnica Superior de Ingenieros Informaticos Enero 2016
9.3.2. Nodo.java
1 package Grafo;
2 import java.math.*;
3 public class Nodo extends jdd.graph.Node{
4 String Nombre;
5 int x,y;
6 public Nodo(int arg0, String arg1) {
7 super(arg0, arg1);
8 // TODO Auto-generated constructor stub
9 }
10 public Nodo(int arg0) {
11 super(arg0);
12 // TODO Auto-generated constructor stub
13 }
14 public int distancia(Nodo n){
15 int j,k;
16 j = (this.x - n.x);
17 k = (this.y - n.y);
18 int re = (int) Math.sqrt((j*j)+(k*k));
19 return Math.abs(re);
20 }
21 public void addNombre(String nombre){
22 this.Nombre = nombre;
R.Sanz 141
Escuela Tecnica Superior de Ingenieros Informaticos Enero 2016
23 }
24 public String getNombre(){
25 return this.Nombre;
26 }
27 public void addCoordenas(int x, int y){
28 this.x = x;
29 this.y = y;
30 }
31 public int getX(){
32 return this.x;
33 }
34 public int getY(){
35 return this.y;
36 }
37 }
R.Sanz 142
Escuela Tecnica Superior de Ingenieros Informaticos Enero 2016
Capıtulo 10
ANEXO B: CODIGO
DESARROLLADO 2º FASE
10.1. Package Arbol
10.1.1. Arbol.java
1 package Arbol;
2
3 import java.io.IOException;
4 import java.util.ArrayList;
5 import java.util.Iterator;
6 import java.util.List;
7 import java.util.Map;
8
R.Sanz 143
Escuela Tecnica Superior de Ingenieros Informaticos Enero 2016
9 import jdd.graph.Edge;
10 import Grafo.*;
11
12 //Estructura de Arbol A*
13 public class Arbol {
14
15 Nodo salida;
16 Nodo llegada;
17 Grafo grafo;
18 Map<String, List<Edge>> tabla;
19 LTree<Elemento> arbol = new LTree<Elemento>();
20 List<LTreeNode<Elemento>> posibles = new ArrayList<LTreeNode<
Elemento>>();
21
22 public Arbol(Nodo salida,Nodo llegada,Grafo grafo){
23 this.salida = salida;
24 this.llegada = llegada;
25 this.grafo = grafo;
26 this.arbol.addRoot(new Elemento(0,salida.distancia(llegada),
salida));
27 this.arbol.root.element().setrecorrido(salida.distancia(llegada)
);
R.Sanz 144
Escuela Tecnica Superior de Ingenieros Informaticos Enero 2016
28 this.arbol.root.setChild(grafo.getChild(this.arbol.root, llegada
));
29 addList(posibles,this.arbol.root.getChild());
30 }
31
32 private void addList(List<LTreeNode<Elemento>> lis,
33 List<LTreeNode<Elemento>> hijos){
34 Iterator<LTreeNode<Elemento>> it = hijos.iterator();
35 while(it.hasNext()){
36 lis.add(it.next());
37 }
38 }
39
40 public LTreeNode<Elemento> CalcularRecorrido(){
41 LTreeNode<Elemento> nodo = this.arbol.root;
42 if (salida.getNombre()!=llegada.getNombre()){
43 nodo = selectChild(nodo);
44 while(!isEnd(nodo)){
45 nodo = selectChild(nodo);
46 }
47 }
48 return nodo;
49 }
R.Sanz 145
Escuela Tecnica Superior de Ingenieros Informaticos Enero 2016
50
51 public LTreeNode<Elemento> selectChild(LTreeNode<Elemento>padre)
{
52 LTreeNode<Elemento> nodo = new LTreeNode<Elemento>(null,null,
null);
53 LTreeNode<Elemento> nod = new LTreeNode<Elemento>(null,null,null
);
54 Iterator<LTreeNode<Elemento>> iterador = posibles.iterator();
55 int gh = 0;
56 nod = iterador.next();
57 gh = gh(nod);
58 nodo=nod;
59 int i = 0;
60 int j = 0;
61 while(iterador.hasNext()){
62 nod = iterador.next();
63 i++;
64 if (gh>gh(nod) &&
65 (nod.element().getnodo().getNombre()!=
66 padre.element().getnodo().getNombre())){
67 gh = gh(nod);
68 nodo=nod;
69 j = i;
R.Sanz 146
Escuela Tecnica Superior de Ingenieros Informaticos Enero 2016
70 }
71 }
72 System.out.println(nodo.element().getnodo().getNombre());
73
74 nodo.element().setrecorrido(gh);
75
76 i=0;
77 posibles.remove(j);
78 iterador = posibles.iterator();
79 List<Integer> borrar =new ArrayList<Integer>();
80 while(iterador.hasNext()){
81 if(iterador.next().element().getnodo().getNombre()==
82 nodo.element().getnodo().getNombre())
83 borrar.add(i);
84 i++;
85 }
86
87 Iterator <Integer >iterad = borrar.iterator();
88 while(iterad.hasNext()){
89 posibles.remove(iterad.next());
90 }
91
92 if (nodo.getChild() == null){
R.Sanz 147
Escuela Tecnica Superior de Ingenieros Informaticos Enero 2016
93 nodo.setChild(grafo.getChild(nodo, llegada));
94 addList(posibles,nodo.getChild());
95 }
96 return nodo;
97 }
98
99 public int gh (LTreeNode<Elemento> nodo){
100 return nodo.getParent().element().recorridoParcial() +
101 nodo.element().recorridoMax();
102 }
103
104 public boolean isEnd(LTreeNode<Elemento>fin){
105 return (fin.element().getnodo().getNombre() == llegada.getNombre
());
106 }
107
108 public List<Nodo> recorridoObtimo(LTreeNode<Elemento> fin){
109 List<Nodo> recorrido = new ArrayList<Nodo>();
110 LTreeNode<Elemento> posicion = fin;
111 boolean condicion = true;
112 while(condicion){
113 if (posicion.getParent()==null){
114 recorrido.add(((Elemento)posicion.element()).getnodo());
R.Sanz 148
Escuela Tecnica Superior de Ingenieros Informaticos Enero 2016
115 condicion = false;
116 }
117 else{
118 recorrido.add(((Elemento)posicion.element()).getnodo());
119 posicion = posicion.getParent();
120 }
121 }
122 return recorrido;
123 }
124 }
R.Sanz 149
Escuela Tecnica Superior de Ingenieros Informaticos Enero 2016
10.1.2. Elemento.java
1 package Arbol;
2
3 import Grafo.Nodo;
4
5 //Elementos del Algoritmo
6 public class Elemento \{
7
8 private double g;
9 private int h,recorrido;
10 private Nodo nodo;
11
12 public Elemento(double g, int h, Nodo nodo)\{
13 this.g = g;
14 this.h = h;
15 this.nodo = nodo;
16 \}
17
18 public double getG()\{
19 return this.g;
20 \}
21
22 public void setG(int g)\{
R.Sanz 150
Escuela Tecnica Superior de Ingenieros Informaticos Enero 2016
23 this.g = g;
24 \}
25
26 public int getH()\{
27 return this.h;
28 \}
29
30 public void setH(int h)\{
31 if(h>=0)
32 this.h = h;
33 else
34 this.h = -h;
35 \}
36
37 public Nodo getnodo()\{
38 return this.nodo;
39 \}
40
41 public void setnodo(Nodo nodo)\{
42 this.nodo = nodo;
43 \}
44
45 public int getrecorrido()\{
R.Sanz 151
Escuela Tecnica Superior de Ingenieros Informaticos Enero 2016
46 return this.recorrido;
47 \}
48
49 public void setrecorrido(int recorrido)\{
50 this.recorrido = recorrido;
51 \}
52
53 public int recorridoParcial()\{
54 return this.recorrido-this.h;
55 \}
56
57 public int recorridoMax()\{
58 return (int)this.g+this.h;
59 \}
60 \}
R.Sanz 152
Escuela Tecnica Superior de Ingenieros Informaticos Enero 2016
10.1.3. LTree.java
1 package Arbol;
2
3 import net.datastructures.*;
4
5 import java.util.*;
6
7 //Estructura Arbol
8 public class LTree<E> implements Tree<E> {
9 protected LTreeNode<E> root=null;
10
11 public int size() {
12 int numPos=0;
13 for (Position<E> p: positions()) ++numPos;
14 return numPos;
15 }
16
17 public boolean isEmpty() {
18 return (root==null);
19 }
20
21 public Iterator<E> iterator() {
22 List<E> list = new LinkedList<E>();
R.Sanz 153
Escuela Tecnica Superior de Ingenieros Informaticos Enero 2016
23 for (Position<E> p: positions()) list.add(p.element());
24 return list.listIterator();
25 }
26
27 public Iterable<Position<E>> positions() {
28 return nodeList(root);
29 }
30
31 public E replace(Position<E> v, E e) {
32 LTreeNode<E> node = getLTreeNode(v);
33 E tmp = node.element();
34 node.setElement(e);
35 return tmp;
36 }
37
38 public Position<E> root() throws EmptyTreeException {
39 if (isEmpty()) throw new EmptyTreeException("Tree is empty");
40 return root;
41 }
42
43 public Position<E> parent(Position<E> v) throws
InvalidPositionException,
44 BoundaryViolationException {
R.Sanz 154
Escuela Tecnica Superior de Ingenieros Informaticos Enero 2016
45 if (isRoot(v)) throw new BoundaryViolationException("At root
node");
46 LTreeNode<E> node = getLTreeNode(v);
47 return node.getParent();
48 }
49
50 public Iterable<Position<E>> children(Position<E> v) throws
51 InvalidPositionException {
52 return childrenList(v);
53 }
54
55 public boolean isInternal(Position<E> v) throws
InvalidPositionException {
56 return !isExternal(v);
57 }
58
59 public boolean isExternal(Position<E> v) throws
InvalidPositionException {
60 LTreeNode<E> node = getLTreeNode(v);
61 return false;
62 }
63
R.Sanz 155
Escuela Tecnica Superior de Ingenieros Informaticos Enero 2016
64 public boolean isRoot(Position<E> v) throws
InvalidPositionException {
65 LTreeNode<E> node = getLTreeNode(v);
66 return node==root();
67 }
68
69 public Position<E> addRoot(E e) throws NonEmptyTreeException {
70 if (root != null) {
71 throw new NonEmptyTreeException("adding new root to nonempty
tree");
72 }
73 root = new LTreeNode<E>(e,null,null);
74 return root;
75 }
76
77 public Position<E> addChild(E e,Position<E> v)
78 throws InvalidPositionException {
79 LTreeNode<E> node = getLTreeNode(v);
80 LTreeNode<E> newNode = new LTreeNode<E>(e,node,null);
81 List<LTreeNode<E>> lista = node.getChild();
82 lista.add(lista.size(), newNode);
83 node.setChild(lista);
84 return newNode;
R.Sanz 156
Escuela Tecnica Superior de Ingenieros Informaticos Enero 2016
85 }
86
87 public Position<E> addChild(Tree<E> t,Position<E> v) throws
88 InvalidPositionException, EmptyTreeException {
89 LTreeNode<E> t_node = getLTreeNode(t.root());
90 LTreeNode<E> v_node = getLTreeNode(v);
91 t_node.setParent(v_node);
92 return t_node;
93 }
94
95 private LTreeNode<E> getLTreeNode(Position<E> v)
96 throws InvalidPositionException {
97 if (v == null || !(v instanceof LTreeNode<?>)) {
98 throw new InvalidPositionException("Invalid position");
99 }
100 return (LTreeNode<E>) v;
101 }
102
103 private Iterable<Position<E>> childrenList(Position<E> v) {
104 return null;
105 }
106
R.Sanz 157
Escuela Tecnica Superior de Ingenieros Informaticos Enero 2016
107 private void addChildren(Position<E> child,List<Position<E>>
list) {
108 if (child!=null) {
109 LTreeNode<E> childNode = getLTreeNode(child);
110 list.add(child);
111 }
112 }
113
114 private List<Position<E>> nodeList(Position<E> v) {
115 List<Position<E>> list = new LinkedList<Position<E>>();
116 addAllNodes(v,list);
117 return list;
118 }
119
120 private void addAllNodes(Position<E> node,
121 List<Position<E>> list) {
122 if (node!=null) {
123 list.add(node);
124 for (Position<E> child : childrenList(node))
125 addAllNodes(child,list);
126 }
127 }
128 }
R.Sanz 158
Escuela Tecnica Superior de Ingenieros Informaticos Enero 2016
10.1.4. LTreeNode.java
1 package Arbol;
2 import java.util.List;
3
4 import net.datastructures.*;
5
6 //Nodo de Arbol
7 public class LTreeNode<E> implements Position<E> {
8 private E element;
9 private LTreeNode<E> parent;
10 private List<LTreeNode<E>> Child;
11
12 public LTreeNode(E e, LTreeNode<E> parent, List<
LTreeNode<E>> Child) {
13 this.element = e;
14 this.parent = parent;
15 this.Child = Child;
16 }
17
18 public void setElement(E element) {
19 this.element = element;
20 }
21
R.Sanz 159
Escuela Tecnica Superior de Ingenieros Informaticos Enero 2016
22 public E element() {
23 return element;
24 }
25
26 public void setParent(LTreeNode<E> parent) {
27 this.parent = parent;
28 }
29
30 public LTreeNode<E> getParent() {
31 return parent;
32 }
33
34 public void setChild(List<LTreeNode<E>> Child) {
35 this.Child = Child;
36 }
37
38 public List<LTreeNode<E>> getChild() {
39 return Child;
40 }
41 }
R.Sanz 160
Escuela Tecnica Superior de Ingenieros Informaticos Enero 2016
10.2. Package Grafica
10.2.1. AA.java
1 package Grafica;
2
3 import java.util.ArrayList;
4 import java.util.Iterator;
5 import java.util.List;
6
7 import jdd.graph.Edge;
8
9 import Arbol.Arbol;
10 import Grafo.*;
11
12 public class AA {
13
14 private Grafo grafo;
15 Nodo salida;
16 Nodo llegada;
17
18 public AA(String salida, String llegada){
19
20 grafo = new Grafo(true);
R.Sanz 161
Escuela Tecnica Superior de Ingenieros Informaticos Enero 2016
21
22 // Creacion de la linea de metro
23
24 //Estaciones
25 Nodo Villanueva_de_Castellon, Alberic, Massalaves, Montortal,
26 LAlcudia, Benimodo, Carlet, Ausias_March, Alginet,
Font_Almanguer,
27 Espioca, Omet, Picassent, Sant_Ramon, Realon, Col_legi_El_Vedat,
28 Plaza_Espanya, Turia, Campanar_La_Fe, Beniferri, Cantereria,
29 Benimamet, Les_Carolines_Fira, Campament,Paterna,Santa_Rita,
30 Fuente_del_Jarro,La_Canyada,La_Vallesa,Entrepins,El_Clot,
Montesol,
31 LEliana,Torre_del_Virrei,La_Pobla_De_Vallbona,Benaguasil_1r,
32 Benaguasil_2n,Lliria,Burjassot,Burjassot_Godella,Godella,
Rocafort,
33 Massarrojos,Montcada_Alfara,Seminari_CEU,Masies,S_Psiquiatric,
34 Betera,Torrent,Torrent_Avinguda,Picanya,Paiporta,Valencia_Sud,
35 Sant_Isidre,Safranar,Patraix,Joaquin_Sorolla,Bailen,Aragon,
36 Amistat,Ayora,Neptu,Angel_Guimera,Maritim_Serreria,Serreria,
37 Francesc_Cubells,Grau_Canyamelar,Colon,Alameda,Xativa,
38 Avinguda_del_Cid,Nou_dOctubre,Mislata,Mislata_Almassil,Faitanar,
39 Quart_de_Poblet,Salt_de_lAigua,Manises,Rosas,Aeroport,Facultats,
40 Machado,Alboraya_Palmaret,Alboraya_Peris_Arago,Almassera,
R.Sanz 162
Escuela Tecnica Superior de Ingenieros Informaticos Enero 2016
41 Meliana,Foios,Albalat_dels_Sorells,Museros,Massamagrell,
42 La_Pobla_de_Farnals,Rafelbunyol,Empalme,Benimaclet,
Mas_del_Rosari,
43 La_Coma,Tomas_y_Valiente,Santa_Gemma_Parc_Cientific_UV,
44 Ll_Llarga_Terramelar,TVV,Fira_Valencia,Vicent_Andres_Estelles,
45 Campus_de_Burjassot,Sant_Joan,La_Granja,Palau_de_Congressos,
46 Florista,Garbi ,Benicalap,Transits ,Marxalenes,Reus ,Sagunt,
47 Pont_de_Fusta,Primat_Reig,Vicent_Zaragoza ,
Universitat_Politecnica,
48 La_Carrasca,Tarongers,La_Marina ,Doctor_Lluch,La_Cadena,
49 Eugenia_Vines,Les_Arenes ,Mediterrani,Alfauir,Orriols,
50 Estadi_del_Llevant,Sant_Miquel_dels_Reis, Tossal_del_Rei;
51
52 Villanueva_de_Castellon = grafo.addNode("Villanueva_de_Castellon
", 0,0);
53 Alberic = grafo.addNode("Alberic", -1,7);
54 Massalaves = grafo.addNode("Massalaves", 0,12);
55 Montortal = grafo.addNode("Montortal", 0,18);
56 LAlcudia = grafo.addNode("LAlcudia", 1,22);
57 Benimodo = grafo.addNode("Benimodo", 0,27);
58 Carlet = grafo.addNode("Carlet", -1,29);
59 Ausias_March = grafo.addNode("Ausias_March",5,34);
60 Alginet = grafo.addNode("Alginet",9,36);
R.Sanz 163
Escuela Tecnica Superior de Ingenieros Informaticos Enero 2016
61 Font_Almanguer = grafo.addNode("Font_Almanguer",11,41);
62 Espioca = grafo.addNode("Espioca", 10,48);
63 Omet = grafo.addNode("Omet", 9,54);
64 Picassent = grafo.addNode("Picassent",11,55);
65 Sant_Ramon = grafo.addNode("Sant_Ramon",10,59);
66 Realon = grafo.addNode("Realon", 11,64);
67 Col_legi_El_Vedat = grafo.addNode("Col_legi_El_Vedat",11,67);
68 Plaza_Espanya = grafo.addNode("Plaza_Espanya", 27,76);
69 Turia = grafo.addNode("Turia", 25,78);
70 Campanar_La_Fe = grafo.addNode("Campanar_La_Fe",24,79);
71 Beniferri = grafo.addNode("Beniferri", 24,81);
72 Cantereria = grafo.addNode("Cantereria", 21,83);
73 Benimamet = grafo.addNode("Benimamet",20,83);
74 Les_Carolines_Fira = grafo.addNode("Les_Carolines_Fira",18,82);
75 Campament = grafo.addNode("Campament", 16,82);
76 Paterna = grafo.addNode("Paterna",15 ,82);
77 Santa_Rita = grafo.addNode("Santa_Rita", 12,84);
78 Fuente_del_Jarro = grafo.addNode("Fuente_del_Jarro",11,85);
79 La_Canyada = grafo.addNode("La_Canyada", 6,88);
80 La_Vallesa = grafo.addNode("La_Vallesa", 4,90);
81 Entrepins = grafo.addNode("Entrepins", 1,91);
82 El_Clot = grafo.addNode("El_Clot", -2,92);
83 Montesol = grafo.addNode("Montesol", -3,94);
R.Sanz 164
Escuela Tecnica Superior de Ingenieros Informaticos Enero 2016
84 LEliana = grafo.addNode("LEliana", -4,95);
85 Torre_del_Virrei = grafo.addNode("Torre_del_Virrei", -6,97);
86 La_Pobla_De_Vallbona = grafo.addNode("La_Pobla_De_Vallbona",
-9,99);
87 Benaguasil_1r = grafo.addNode("Benaguasil_1r",-12,102);
88 Benaguasil_2n = grafo.addNode("Benaguasil_2n", -13,103);
89 Lliria = grafo.addNode("Lliria", -15,108);
90 Burjassot = grafo.addNode("Burjassot", 22,84);
91 Burjassot_Godella = grafo.addNode("Burjassot_Godella",21,85);
92 Godella = grafo.addNode("Godella", 21,86);
93 Rocafort = grafo.addNode("Rocafort", 22,88);
94 Massarrojos = grafo.addNode("Massarrojos", 23,90);
95 Montcada_Alfara = grafo.addNode("Montcada_Alfara", 26,91);
96 Seminari_CEU = grafo.addNode("Seminari_CEU", 26,92);
97 Masies = grafo.addNode("Masies",22,96);
98 S_Psiquiatric = grafo.addNode("S_Psiquiatric", 15,99);
99 Betera = grafo.addNode("Betera",12,101);
100 Torrent = grafo.addNode("Torrent",11,69);
101 Torrent_Avinguda = grafo.addNode("Torrent_Avinguda",9,69);
102 Picanya = grafo.addNode("Picanya", 16,69);
103 Paiporta = grafo.addNode("Paiporta", 20,69);
104 Valencia_Sud = grafo.addNode("Valencia_Sud", 21,71);
105 Sant_Isidre = grafo.addNode("Sant_Isidre", 23,73);
R.Sanz 165
Escuela Tecnica Superior de Ingenieros Informaticos Enero 2016
106 Safranar = grafo.addNode("Safranar", 24,73);
107 Patraix = grafo.addNode("Patraix", 25,74);
108 Joaquin_Sorolla = grafo.addNode("Joaquin_Sorolla", 27,74);
109 Bailen = grafo.addNode("Bailen",28,75);
110 Aragon = grafo.addNode("Aragon", 32,77);
111 Amistat = grafo.addNode("Amistat",33,77);
112 Ayora = grafo.addNode("Ayora",35,76);
113 Neptu = grafo.addNode("Neptu", 38,77);
114 Angel_Guimera = grafo.addNode("Angel_Guimera", 26,77);
115 Maritim_Serreria = grafo.addNode("Maritim_Serreria",36,77);
116 Serreria = grafo.addNode("Serreria",36,78);
117 Francesc_Cubells = grafo.addNode("Francesc_Cubells",37,77);
118 Grau_Canyamelar = grafo.addNode("Grau_Canyamelar",37,77);
119 Colon = grafo.addNode("Colon",29,77);
120 Alameda = grafo.addNode("Alameda",30,77);
121 Xativa = grafo.addNode("Xativa",28,76);
122 Avinguda_del_Cid = grafo.addNode("Avinguda_del_Cid",24,76);
123 Nou_dOctubre = grafo.addNode("Nou_dOctubre",22,77);
124 Mislata = grafo.addNode("Mislata", 20,77);
125 Mislata_Almassil = grafo.addNode("Mislata_Almassil", 19,78);
126 Faitanar = grafo.addNode("Faitanar", 17,78);
127 Quart_de_Poblet = grafo.addNode("Quart_de_Poblet",15,79);
128 Salt_de_lAigua = grafo.addNode("Salt_de_lAigua",13,79);
R.Sanz 166
Escuela Tecnica Superior de Ingenieros Informaticos Enero 2016
129 Manises = grafo.addNode("Manises",12,80);
130 Rosas = grafo.addNode("Rosas",10,81);
131 Aeroport = grafo.addNode("Aeroport",8,81);
132 Facultats = grafo.addNode("Facultats",31,78);
133 Machado = grafo.addNode("Machado", 32,81);
134 Alboraya_Palmaret = grafo.addNode("Alboraya_Palmaret", 32,82);
135 Alboraya_Peris_Arago = grafo.addNode("Alboraya_Peris_Arago",
33,83);
136 Almassera = grafo.addNode("Almassera", 35,85);
137 Meliana = grafo.addNode("Meliana", 33,88);
138 Foios = grafo.addNode("Foios", 33,90);
139 Albalat_dels_Sorells = grafo.addNode("Albalat_dels_Sorells"
,34,92);
140 Museros = grafo.addNode("Museros",35,95);
141 Massamagrell = grafo.addNode("Massamagrell",37,97);
142 La_Pobla_de_Farnals = grafo.addNode("La_Pobla_de_Farnals",
37,98);
143 Rafelbunyol = grafo.addNode("Rafelbunyol", 37,100);
144 Empalme = grafo.addNode("Empalme", 23,82);
145 Benimaclet = grafo.addNode("Benimaclet",31,79);
146 Mas_del_Rosari = grafo.addNode("Mas_del_Rosari", 15,89);
147 La_Coma = grafo.addNode("La_Coma", 17,88);
148 Tomas_y_Valiente = grafo.addNode("Tomas_y_Valiente", 20,87);
R.Sanz 167
Escuela Tecnica Superior de Ingenieros Informaticos Enero 2016
149 Santa_Gemma_Parc_Cientific_UV = grafo.addNode("
Santa_Gemma_Parc_Cientific UV", 20,86);
150 Ll_Llarga_Terramelar = grafo.addNode("Ll_Llarga_Terramelar",
16,89);
151 TVV = grafo.addNode("TVV",20,85);
152 Fira_Valencia = grafo.addNode("Fira_Valencia",18,84);
153 Vicent_Andres_Estelles = grafo.addNode("Vicent_Andres_Estelles",
19,85);
154 Campus_de_Burjassot = grafo.addNode("Campus_de_Burjassot",
19,85);
155 Sant_Joan = grafo.addNode("Sant_Joan", 20,84);
156 La_Granja = grafo.addNode("La_Granja", 21,84);
157 Palau_de_Congressos = grafo.addNode("Palau_de_Congressos",
24,83);
158 Florista = grafo.addNode("Florista", 24,83);
159 Garbi = grafo.addNode("Garbi", 24,81);
160 Benicalap = grafo.addNode("Benicalap", 26,81);
161 Transits = grafo.addNode("Transits", 26,81);
162 Marxalenes = grafo.addNode("Marxalenes", 26,81);
163 Reus = grafo.addNode("Reus", 27,81);
164 Sagunt = grafo.addNode("Sagunt", 28,81);
165 Pont_de_Fusta = grafo.addNode("Pont_de_Fusta", 29,79);
166 Primat_Reig = grafo.addNode("Primat_Reig", 30,81);
R.Sanz 168
Escuela Tecnica Superior de Ingenieros Informaticos Enero 2016
167 Vicent_Zaragoza = grafo.addNode("Vicent_Zaragoza", 32,79);
168 Universitat_Politecnica = grafo.addNode("Universitat_Politecnica
", 33,79);
169 La_Carrasca = grafo.addNode("La_Carrasca", 34,79);
170 Tarongers = grafo.addNode("Tarongers", 35,79);
171 La_Marina = grafo.addNode("La_Marina", 37,78);
172 Doctor_Lluch = grafo.addNode("Doctor_Lluch", 37,77);
173 La_Cadena = grafo.addNode("La_Cadena", 37,78);
174 Eugenia_Vines = grafo.addNode("Eugenia_Vines", 38,78);
175 Les_Arenes = grafo.addNode("Les_Arenes", 38,77);
176 Mediterrani = grafo.addNode("Mediterrani", 37,77);
177 Alfauir = grafo.addNode("Alfauir", 30,81);
178 Orriols = grafo.addNode("Orriols", 30,82);
179 Estadi_del_Llevant = grafo.addNode("Estadi_del_Llevant", 30,83);
180 Sant_Miquel_dels_Reis = grafo.addNode("Sant_Miquel_dels_Reis",29
,83);
181 Tossal_del_Rei = grafo.addNode("Tossal_del_Rei", 28,83);
182
183 //Trayectos
184 grafo.addEdge (Villanueva_de_Castellon, Alberic, 4.40, "linea1")
;
185 grafo.addEdge (Alberic,Massalaves,3.10, "linea1");
186 grafo.addEdge (Massalaves,Montortal,3.48, "linea1");
R.Sanz 169
Escuela Tecnica Superior de Ingenieros Informaticos Enero 2016
187 grafo.addEdge (Montortal,LAlcudia,2.45, "linea1");
188 grafo.addEdge (LAlcudia,Benimodo,3.00, "linea1");
189 grafo.addEdge (Benimodo,Carlet,1.34, "linea1");
190 grafo.addEdge (Carlet,Ausias_March,3.95, "linea1");
191 grafo.addEdge (Ausias_March, Alginet,2.39, "linea1");
192 grafo.addEdge (Alginet,Font_Almanguer,2.95, "linea1");
193 grafo.addEdge (Font_Almanguer,Espioca,3.61, "linea1");
194 grafo.addEdge (Espioca,Omet,3.74, "linea1");
195 grafo.addEdge (Omet,Picassent,1.40, "linea1");
196 grafo.addEdge (Picassent,Sant_Ramon,2.97, "linea1");
197 grafo.addEdge (Sant_Ramon,Realon,2.61, "linea1");
198 grafo.addEdge (Realon,Col_legi_El_Vedat,1.69, "linea1");
199 grafo.addEdge (Col_legi_El_Vedat,Torrent_Avinguda,1.95, "linea1"
);
200 grafo.addEdge (Col_legi_El_Vedat,Torrent_Avinguda,1.95, "linea5"
);
201 grafo.addEdge (Col_legi_El_Vedat, Torrent,1.27, "linea 1");
202 grafo.addEdge (Torrent_Avinguda,Torrent,2.11, "linea1");
203 grafo.addEdge (Torrent_Avinguda,Torrent,2.11, "linea5");
204 grafo.addEdge (Torrent,Picanya,2.29, "linea1");
205 grafo.addEdge (Torrent,Picanya,2.29, "linea5");
206 grafo.addEdge (Picanya,Paiporta,1.73, "linea1");
207 grafo.addEdge (Picanya,Paiporta,1.73, "linea5");
R.Sanz 170
Escuela Tecnica Superior de Ingenieros Informaticos Enero 2016
208 grafo.addEdge (Paiporta,Valencia_Sud,1.17, "linea1");
209 grafo.addEdge (Paiporta,Valencia_Sud,1.17, "linea5");
210 grafo.addEdge (Valencia_Sud,Sant_Isidre,1.31, "linea1");
211 grafo.addEdge (Valencia_Sud,Sant_Isidre,1.31, "linea5");
212 grafo.addEdge (Sant_Isidre,Safranar,0.33, "linea1");
213 grafo.addEdge (Sant_Isidre,Safranar,0.33, "linea5");
214 grafo.addEdge (Safranar,Patraix,0.74, "linea1");
215 grafo.addEdge (Safranar,Patraix,0.74, "linea5");
216 grafo.addEdge (Patraix,Joaquin_Sorolla,0.63, "linea1");
217 grafo.addEdge (Patraix,Joaquin_Sorolla,0.63, "linea5");
218 grafo.addEdge (Joaquin_Sorolla,Plaza_Espanya,0.80, "linea1");
219 grafo.addEdge (Plaza_Espanya,Angel_Guimera,0.55, "linea1");
220 grafo.addEdge (Angel_Guimera,Turia,1.09, "linea1");
221 grafo.addEdge (Turia,Campanar_La_Fe,0.73, "linea1");
222 grafo.addEdge (Campanar_La_Fe,Beniferri,0.76, "linea1");
223 grafo.addEdge (Beniferri,Empalme,1.55, "linea1");
224 grafo.addEdge (Empalme,Cantereria,0.99, "linea1");
225 grafo.addEdge (Cantereria,Benimamet,0.65, "linea1");
226 grafo.addEdge (Benimamet,Les_Carolines_Fira,0.65, "linea1");
227 grafo.addEdge (Les_Carolines_Fira,Campament,1.02, "linea1");
228 grafo.addEdge (Campament,Paterna,0.69, "linea1");
229 grafo.addEdge (Paterna,Santa_Rita,1.38, "linea1");
230 grafo.addEdge (Santa_Rita,Fuente_del_Jarro,1.01, "linea1");
R.Sanz 171
Escuela Tecnica Superior de Ingenieros Informaticos Enero 2016
231 grafo.addEdge (Fuente_del_Jarro, La_Canyada,2.71, "linea1");
232 grafo.addEdge (La_Canyada,La_Vallesa,1.58, "linea1");
233 grafo.addEdge (La_Vallesa,Entrepins,1.64, "linea1");
234 grafo.addEdge (Entrepins,El_Clot,1.66, "linea1");
235 grafo.addEdge (El_Clot,Montesol,0.77, "linea1");
236 grafo.addEdge (Montesol,LEliana,0.83, "linea1");
237 grafo.addEdge (LEliana,Torre_del_Virrei,1.10, "linea1");
238 grafo.addEdge (Torre_del_Virrei,La_Pobla_De_Vallbona,2.24, "
linea1");
239 grafo.addEdge (La_Pobla_De_Vallbona,Benaguasil_1r,1.76, "linea1"
);
240 grafo.addEdge (Benaguasil_1r,Benaguasil_2n,0.84, "linea1");
241 grafo.addEdge (Benaguasil_2n,Lliria,3.21, "linea1");
242 grafo.addEdge (Empalme,Burjassot,1.09, "linea1");
243 grafo.addEdge (Burjassot,Burjassot_Godella,0.79, "linea1");
244 grafo.addEdge (Burjassot_Godella,Godella,0.69, "linea1");
245 grafo.addEdge (Godella,Rocafort,1.17, "linea1");
246 grafo.addEdge (Rocafort,Massarrojos,0.96, "linea1");
247 grafo.addEdge (Massarrojos,Montcada_Alfara,1.57, "linea1");
248 grafo.addEdge (Montcada_Alfara, Seminari_CEU,0.73, "linea1");
249 grafo.addEdge (Seminari_CEU,Masies,2.51, "linea1");
250 grafo.addEdge (Masies,S_Psiquiatric,3.87, "linea1");
251 grafo.addEdge (S_Psiquiatric,Betera,1.60, "linea1");
R.Sanz 172
Escuela Tecnica Superior de Ingenieros Informaticos Enero 2016
252 grafo.addEdge (Joaquin_Sorolla,Bailen,0.65, "linea5");
253 grafo.addEdge (Bailen,Colon,0.95, "linea5");
254 grafo.addEdge (Colon,Alameda,0.57, "linea5");
255 grafo.addEdge (Colon,Alameda,0.57, "linea3");
256 grafo.addEdge (Alameda,Aragon,0.58, "linea5");
257 grafo.addEdge (Aragon,Amistat,0.65, "linea5");
258 grafo.addEdge (Amistat,Ayora,0.84, "linea5");
259 grafo.addEdge (Ayora,Maritim_Serreria,0.44, "linea5");
260 grafo.addEdge (Maritim_Serreria,Francesc_Cubells,0.38, "linea5")
;
261 grafo.addEdge (Maritim_Serreria,Francesc_Cubells,0.38, "linea6")
;
262 grafo.addEdge (Francesc_Cubells,Grau_Canyamelar,0.74, "linea5");
263 grafo.addEdge (Francesc_Cubells,Grau_Canyamelar,0.74, "linea6");
264 grafo.addEdge (Grau_Canyamelar,Neptu,0.35, "linea5");
265 grafo.addEdge (Colon,Xativa,0.67, "linea5");
266 grafo.addEdge (Colon,Xativa,0.67, "linea3");
267 grafo.addEdge (Xativa,Angel_Guimera,0.76, "linea5");
268 grafo.addEdge (Xativa,Angel_Guimera,0.76, "linea3");
269 grafo.addEdge (Angel_Guimera,Avinguda_del_Cid,1.10, "linea5");
270 grafo.addEdge (Angel_Guimera,Avinguda_del_Cid,1.10, "linea3");
271 grafo.addEdge (Avinguda_del_Cid,Nou_dOctubre,0.89, "linea5");
272 grafo.addEdge (Avinguda_del_Cid,Nou_dOctubre,0.89, "linea3");
R.Sanz 173
Escuela Tecnica Superior de Ingenieros Informaticos Enero 2016
273 grafo.addEdge (Nou_dOctubre,Mislata,1, "linea5");
274 grafo.addEdge (Nou_dOctubre,Mislata,1, "linea3");
275 grafo.addEdge (Mislata,Mislata_Almassil,0.58, "linea5");
276 grafo.addEdge (Mislata,Mislata_Almassil,0.58, "linea3");
277 grafo.addEdge (Mislata_Almassil,Faitanar,0.78, "linea5");
278 grafo.addEdge (Faitanar,Quart_de_Poblet,0.85, "linea5");
279 grafo.addEdge (Quart_de_Poblet,Salt_de_lAigua,0.87,"linea5");
280 grafo.addEdge (Salt_de_lAigua,Manises,0.92, "linea5");
281 grafo.addEdge (Manises,Rosas,0.79, "linea5");
282 grafo.addEdge (Rosas,Aeroport,0.66, "linea5");
283 grafo.addEdge (Mislata_Almassil,Faitanar,0.78, "linea3");
284 grafo.addEdge (Faitanar,Quart_de_Poblet,0.85, "linea3");
285 grafo.addEdge (Quart_de_Poblet,Salt_de_lAigua,0.87,"linea3");
286 grafo.addEdge (Salt_de_lAigua,Manises,0.92, "linea3");
287 grafo.addEdge (Manises,Rosas,0.79, "linea3");
288 grafo.addEdge (Rosas,Aeroport,0.66, "linea3");
289 grafo.addEdge (Alameda,Facultats,0.61, "linea3");
290 grafo.addEdge (Facultats,Benimaclet,0.89, "linea3");
291 grafo.addEdge (Benimaclet,Machado,0.88, "linea3");
292 grafo.addEdge (Machado,Alboraya_Palmaret,0.49, "linea3");
293 grafo.addEdge (Alboraya_Palmaret,Alboraya_Peris_Arago,0.63, "
linea3");
294 grafo.addEdge (Alboraya_Peris_Arago, Almassera,1.30, "linea3");
R.Sanz 174
Escuela Tecnica Superior de Ingenieros Informaticos Enero 2016
295 grafo.addEdge (Almassera,Meliana,1.86, "linea3");
296 grafo.addEdge (Meliana,Foios,1.09, "linea3");
297 grafo.addEdge (Foios,Albalat_dels_Sorells,1.03, "linea3");
298 grafo.addEdge (Albalat_dels_Sorells,Museros,1.96, "linea3");
299 grafo.addEdge (Museros,Massamagrell,1.21, "linea3");
300 grafo.addEdge (Massamagrell,La_Pobla_de_Farnals,1.01, "linea3");
301 grafo.addEdge (La_Pobla_de_Farnals,Rafelbunyol,1.05, "linea3");
302 grafo.addEdge (Grau_Canyamelar,Mediterrani,0.43, "linea6");
303 grafo.addEdge (Mediterrani,Doctor_Lluch,0.36, "linea6");
304 grafo.addEdge (Mediterrani,Doctor_Lluch,0.36, "linea4");
305 grafo.addEdge (Doctor_Lluch, La_Marina,0.40, "linea6");
306 grafo.addEdge (Doctor_Lluch, La_Marina,0.40, "linea4");
307 grafo.addEdge (La_Marina, La_Cadena,0.35, "linea6");
308 grafo.addEdge (La_Marina, La_Cadena,0.35, "linea4");
309 grafo.addEdge (La_Cadena,Eugenia_Vines,0.36, "linea6");
310 grafo.addEdge (La_Cadena,Eugenia_Vines,0.36, "linea4");
311 grafo.addEdge (Eugenia_Vines,Les_Arenes,0.53, "linea6");
312 grafo.addEdge (Eugenia_Vines,Les_Arenes,0.53, "linea4");
313 grafo.addEdge (Les_Arenes,Mediterrani,0.32, "linea6");
314 grafo.addEdge (Les_Arenes,Mediterrani,0.32, "linea4");
315 grafo.addEdge (La_Cadena,Serreria,0.48, "linea6");
316 grafo.addEdge (La_Cadena,Serreria,0.48, "linea4");
317 grafo.addEdge(Benimaclet, Serreria, 2.87, "linea6");
R.Sanz 175
Escuela Tecnica Superior de Ingenieros Informaticos Enero 2016
318 grafo.addEdge (Serreria,Tarongers,0.51, "linea6");
319 grafo.addEdge (Serreria,Tarongers,0.51, "linea4");
320 grafo.addEdge (Tarongers,La_Carrasca,0.46, "linea6");
321 grafo.addEdge (Tarongers,La_Carrasca,0.46, "linea4");
322 grafo.addEdge (La_Carrasca,Universitat_Politecnica,0.51, "linea6
");
323 grafo.addEdge (La_Carrasca,Universitat_Politecnica,0.51, "linea4
");
324 grafo.addEdge (Universitat_Politecnica,Vicent_Zaragoza,0.67, "
linea6");
325 grafo.addEdge (Universitat_Politecnica,Vicent_Zaragoza,0.67, "
linea4");
326 grafo.addEdge (Vicent_Zaragoza,Benimaclet,0.72, "linea6");
327 grafo.addEdge (Vicent_Zaragoza,Benimaclet,0.72, "linea4");
328 grafo.addEdge (Benimaclet,Primat_Reig,0.46, "linea6");
329 grafo.addEdge (Benimaclet,Primat_Reig,0.46, "linea4");
330 grafo.addEdge (Primat_Reig,Alfauir,0.52, "linea6");
331 grafo.addEdge (Alfauir,Orriols,0.5, "linea6");
332 grafo.addEdge (Orriols,Estadi_del_Llevant,0.52, "linea6");
333 grafo.addEdge (Estadi_del_Llevant,Sant_Miquel_dels_Reis,0.50, "
linea6");
334 grafo.addEdge (Sant_Miquel_dels_Reis,Tossal_del_Rei,0.48, "
linea6");
R.Sanz 176
Escuela Tecnica Superior de Ingenieros Informaticos Enero 2016
335 grafo.addEdge (Primat_Reig,Pont_de_Fusta,0.84, "linea4");
336 grafo.addEdge (Pont_de_Fusta,Sagunt,1, "linea4");
337 grafo.addEdge (Sagunt,Reus,0.37, "linea4");
338 grafo.addEdge (Reus,Marxalenes,0.65, "linea4");
339 grafo.addEdge (Marxalenes,Transits,0.29, "linea4");
340 grafo.addEdge (Transits,Benicalap,0.31, "linea4");
341 grafo.addEdge (Benicalap,Garbi,0.42, "linea4");
342 grafo.addEdge (Garbi,Florista,0.32, "linea4");
343 grafo.addEdge (Florista,Palau_de_Congressos,0.42, "linea4");
344 grafo.addEdge (Palau_de_Congressos,Empalme,0.36, "linea4");
345 grafo.addEdge (Empalme,La_Granja,0.93, "linea4");
346 grafo.addEdge (La_Granja, Sant_Joan,0.22, "linea4");
347 grafo.addEdge (Sant_Joan,Campus_de_Burjassot,0.24, "linea4");
348 grafo.addEdge (Campus_de_Burjassot,Vicent_Andres_Estelles,0.18,
"linea4");
349 grafo.addEdge (Vicent_Andres_Estelles,Fira_Valencia,0.83, "
linea4");
350 grafo.addEdge (Vicent_Andres_Estelles,TVV,0.38, "linea4");
351 grafo.addEdge (TVV,Santa_Gemma_Parc_Cientific_UV,0.34, "linea4")
;
352 grafo.addEdge (TVV,Ll_Llarga_Terramelar,0.85, "linea4");
353 grafo.addEdge (Santa_Gemma_Parc_Cientific_UV,Tomas_y_Valiente
,0.35, "linea4");
R.Sanz 177
Escuela Tecnica Superior de Ingenieros Informaticos Enero 2016
354 grafo.addEdge (Tomas_y_Valiente,La_Coma,0.80, "linea4");
355 grafo.addEdge (La_Coma,Mas_del_Rosari,0.28, "linea4");
356
357 Iterator<Edge> l = grafo.getMap().get(salida).iterator();
358 boolean cond = true;
359 Edge tramo;
360 while(l.hasNext() && cond){
361 tramo = l.next();
362 if(((Nodo)tramo.n1).getNombre() == salida){
363 this.salida = (Nodo)tramo.n1;
364 cond = false;
365 }
366 }
367
368 l = grafo.getMap().get(llegada).iterator();
369 cond = true;
370 while(l.hasNext() && cond){
371 tramo = l.next();
372 if(((Nodo)tramo.n1).getNombre() == llegada){
373 this.llegada = (Nodo)tramo.n1;
374 cond = false;
375 }
376 }
R.Sanz 178
Escuela Tecnica Superior de Ingenieros Informaticos Enero 2016
377 }
378
379 public List<Pixel> recorridoObtimo(){
380 String linea = "";
381 String lineaA = "Linea0";
382 Arbol arbol = new Arbol(salida, llegada, grafo);
383 List<Nodo> camino = arbol.recorridoObtimo(arbol.
CalcularRecorrido());
384 List<Pixel> recorrido = new ArrayList<Pixel>();
385 Iterator<Nodo> iterador = camino.iterator();
386 Iterator<Nodo> iterador2 = camino.iterator();
387 iterador2.next();
388 while(iterador.hasNext()){
389 Nodo nodo = iterador.next();
390 Nodo nodo2;
391 if (iterador2.hasNext()){
392 nodo2 = iterador2.next();
393 Iterator<Edge> l = grafo.getMap().get(nodo.getNombre()).iterator
();
394 boolean cond = true;
395 Edge tramo;
396 while(l.hasNext() && cond){
397 tramo = l.next();
R.Sanz 179
Escuela Tecnica Superior de Ingenieros Informaticos Enero 2016
398 if(((Nodo)tramo.n2).getNombre() == nodo2.getNombre()){
399 if (cond && linea == lineaA){
400 linea = tramo.getLabel();
401 cond = false;
402 }
403 else linea = tramo.getLabel();
404 }
405 }
406 lineaA=linea;
407 }
408 else linea = "";
409 Pixel pixel = new Pixel(nodo.getX(),nodo.getY(),nodo.getNombre()
,linea);
410 recorrido.add(pixel);
411 }
412 return recorrido;
413 }
414
415 }
R.Sanz 180
Escuela Tecnica Superior de Ingenieros Informaticos Enero 2016
10.2.2. ChoiceLle.java
1 package Grafica;
2
3 import java.applet.Applet;
4 import java.awt.*;
5 import java.awt.event.*;
6
7 import javax.swing.BorderFactory;
8 import javax.swing.JScrollPane;
9 import javax.swing.border.TitledBorder;
10
11
12 public class ChoiceLle extends Applet implements ItemListener {
13 /* Declaration */
14 private LayoutManager Layout;
15 String [] Estaciones = new String [131];
16 List Selector = new List(30,false);
17 private Font Times;
18 Ventana llegada;
19
20 public ChoiceLle (Ventana llegada, JScrollPane panel, Container
contentpane) {
21 /* Declaration */
R.Sanz 181
Escuela Tecnica Superior de Ingenieros Informaticos Enero 2016
22 this.llegada = llegada;
23 int i;
24
25 /* Instantiation */
26 Times = new Font("TimeNewRoman", 20, 25);
27 Layout = new FlowLayout ();
28 Selector.setFont (Times);
29 Selector.setBounds(75, 200, 335, 90);
30
31 /* Decoration */
32 //Estaciones [0] = "Estacion de llegada ...";
33 Estaciones [1]= "Aeroport";
34 Estaciones [2]= "Alameda";
35 Estaciones [3]= "Albalat_dels_Sorells";
36 Estaciones [4]= "Alboraya_Palmaret";
37 Estaciones [5]= "Alboraya_Peris_Arago";
38 Estaciones [6]= "Alberic";
39 Estaciones [7]= "Alfauir";
40 Estaciones [8]= "Alginet";
41 Estaciones [9]= "Almassera";
42 Estaciones [10]= "Amistat";
43 Estaciones [11]= "Angel_Guimera";
44 Estaciones [12]= "Aragon";
R.Sanz 182
Escuela Tecnica Superior de Ingenieros Informaticos Enero 2016
45 Estaciones [13]= "Ausias_March";
46 Estaciones [14]= "Avinguda_del_Cid";
47 Estaciones [15]= "Ayora";
48 Estaciones [16]= "Bailen";
49 Estaciones [17]= "Benaguasil_1r";
50 Estaciones [18]= "Benaguasil_2n";
51 Estaciones [19]= "Benicalap";
52 Estaciones [20]= "Beniferri";
53 Estaciones [21]= "Benimaclet";
54 Estaciones [22]= "Benimamet";
55 Estaciones [23]= "Benimodo";
56 Estaciones [24]= "Betera";
57 Estaciones [25]= "Burjassot";
58 Estaciones [26]= "Burjassot_Godella";
59 Estaciones [27]= "Campament";
60 Estaciones [28]= "Campanar_La_Fe";
61 Estaciones [29]= "Campus_de_Burjassot";
62 Estaciones [30]= "Cantereria";
63 Estaciones [31]= "Carlet";
64 Estaciones [32]= "Col_legi_El_Vedat";
65 Estaciones [33]= "Colon";
66 Estaciones [34]= "Doctor_Lluch";
67 Estaciones [35]= "El_Clot";
R.Sanz 183
Escuela Tecnica Superior de Ingenieros Informaticos Enero 2016
68 Estaciones [36]= "Empalme";
69 Estaciones [37]= "Entrepins";
70 Estaciones [38]= "Estadi_del_Llevant";
71 Estaciones [39]= "Espioca";
72 Estaciones [40]= "Eugenia_Vinies";
73 Estaciones [41]= "Facultats";
74 Estaciones [42]= "Faitanar";
75 Estaciones [43]= "Fira_Valencia";
76 Estaciones [44]= "Florista";
77 Estaciones [45]= "Font_Almanguer";
78 Estaciones [46]= "Foios";
79 Estaciones [47]= "Francesc_Cubells";
80 Estaciones [48]= "Fuente_del_Jarro";
81 Estaciones [49]= "Garbi";
82 Estaciones [50]= "Godella";
83 Estaciones [51]= "Grau_Canyamelar";
84 Estaciones [52]= "Joaquin_Sorolla";
85 Estaciones [53]= "LAlcudia";
86 Estaciones [54]= "LEliana";
87 Estaciones [55]= "La_Cadena";
88 Estaciones [56]= "La_Canyada";
89 Estaciones [57]= "La_Carrasca";
90 Estaciones [58]= "La_Coma";
R.Sanz 184
Escuela Tecnica Superior de Ingenieros Informaticos Enero 2016
91 Estaciones [59]= "La_Granja";
92 Estaciones [60]= "La_Marina";
93 Estaciones [61]= "La_Pobla_de_Farnals";
94 Estaciones [62]= "La_Pobla_De_Vallbona";
95 Estaciones [63]= "La_Vallesa";
96 Estaciones [64]= "Les_Arenes";
97 Estaciones [65]= "Les_Carolines_Fira";
98 Estaciones [66]= "Ll_Llarga_Terramelar";
99 Estaciones [67]= "Lliria";
100 Estaciones [68]= "Machado";
101 Estaciones [69]= "Manises";
102 Estaciones [70]= "Maritim_Serreria";
103 Estaciones [71]= "Marxalenes";
104 Estaciones [72]= "Mas_del_Rosari";
105 Estaciones [73]= "Masies";
106 Estaciones [74]= "Massalaves";
107 Estaciones [75]= "Massamagrell";
108 Estaciones [76]= "Massarrojos";
109 Estaciones [77]= "Meliana";
110 Estaciones [78]= "Mediterrani";
111 Estaciones [79]= "Mislata";
112 Estaciones [80]= "Mislata_Almassil";
113 Estaciones [81]= "Montcada_Alfara";
R.Sanz 185
Escuela Tecnica Superior de Ingenieros Informaticos Enero 2016
114 Estaciones [82]= "Montesol";
115 Estaciones [83]= "Montortal";
116 Estaciones [84]= "Museros";
117 Estaciones [85]= "Neptu";
118 Estaciones [86]= "Nou_d’Octubre";
119 Estaciones [87]= "Omet";
120 Estaciones [88]= "Orriols";
121 Estaciones [89]= "Paiporta";
122 Estaciones [90]= "Palau_de_Congressos";
123 Estaciones [91]= "Paterna";
124 Estaciones [92]= "Patraix";
125 Estaciones [93]= "Picanya";
126 Estaciones [94]= "Picassent";
127 Estaciones [95]= "PlazaEspanya";
128 Estaciones [96]= "Pont_de_Fusta";
129 Estaciones [97]= "Primat_Reig";
130 Estaciones [98]= "Quart_de_Poblet";
131 Estaciones [99]= "Rafelbunyol";
132 Estaciones [100]= "Realon";
133 Estaciones [101]= "Reus";
134 Estaciones [102]= "Rocafort";
135 Estaciones [103]= "Rosas";
136 Estaciones [104]= "S_Psiquiatric";
R.Sanz 186
Escuela Tecnica Superior de Ingenieros Informaticos Enero 2016
137 Estaciones [105]= "Safranar";
138 Estaciones [106]= "Sagunt";
139 Estaciones [107]= "Salt_de_lAigua";
140 Estaciones [108]= "Sant_Isidre";
141 Estaciones [109]= "Sant_Joan";
142 Estaciones [110]= "Sant_Miquel_dels_Reis";
143 Estaciones [111]= "Sant_Ramon";
144 Estaciones [112]= "Santa_Gemma_Parc_Cientific_UV";
145 Estaciones [113]= "Santa_Rita";
146 Estaciones [114]= "Seminari_CEU";
147 Estaciones [115]= "Serreria";
148 Estaciones [116]= "Tarongers";
149 Estaciones [117]= "Tomas_y_Valiente";
150 Estaciones [118]= "Torre_del_Virrei";
151 Estaciones [119]= "Torrent";
152 Estaciones [120]= "Torrent_Avinguda";
153 Estaciones [121]= "Tossal_del_Rei";
154 Estaciones [122]= "Transits";
155 Estaciones [123]= "Turia";
156 Estaciones [124]= "TVV";
157 Estaciones [125]= "Universitat_Politecnica";
158 Estaciones [126]= "Valencia_Sud";
159 Estaciones [127]= "Vicent_Andres_Estelles";
R.Sanz 187
Escuela Tecnica Superior de Ingenieros Informaticos Enero 2016
160 Estaciones [128]= "Vicent_Zaragoza";
161 Estaciones [129]= "Villanueva_de_Castellon";
162 Estaciones [130]= "Xativa";
163
164 //for (i = 0; i < Estaciones.length; ++i) {
165 for (i = 1; i < Estaciones.length; ++i) {
166 Selector.addItem(Estaciones[i],i);
167 }
168
169 /* Location */
170 setLayout (Layout);
171 Selector.setBounds(480, 225, 375, 400);
172 panel.add(Selector);
173 contentpane.add(Selector);
174
175 /* Configuration */
176 Selector.addItemListener (this);
177
178 /* Initialization */
179 Selector.select (0);
180 this.llegada.setllegada(Estaciones[1]);
181
182 }
R.Sanz 188
Escuela Tecnica Superior de Ingenieros Informaticos Enero 2016
183
184 public void itemStateChanged(ItemEvent e) {
185 int Selection;
186 Selection = Selector.getSelectedIndex() + 1;
187 llegada.setllegada(Estaciones[Selection]);
188 System.out.println("Llegada:::::::: " + Selection);
189 }
190
191 }
R.Sanz 189
Escuela Tecnica Superior de Ingenieros Informaticos Enero 2016
10.2.3. ChoiceSal.java
1 package Grafica;
2 import java.applet.Applet;
3 import java.awt.*;
4 import java.awt.event.*;
5
6 import javax.swing.BorderFactory;
7 import javax.swing.JScrollPane;
8 import javax.swing.border.TitledBorder;
9
10
11 public class ChoiceSal extends Applet implements ItemListener {
12 /* Declaration */
13 private LayoutManager Layout;
14 String [] Estaciones = new String [131];
15 List Selector = new List(30,false);
16 private Font Times;
17 Ventana salida;
18
19 public ChoiceSal (Ventana salida, JScrollPane panel, Container
contentpane) {
20 /* Declaration */
21 this.salida = salida;
R.Sanz 190
Escuela Tecnica Superior de Ingenieros Informaticos Enero 2016
22 int i;
23
24 /* Instantiation */
25 Times = new Font("TimeNewRoman", 20, 25);
26 Layout = new FlowLayout ();
27 Selector.setFont(Times);
28 Selector.setBounds(40, 200, 335, 90);
29
30 /* Decoration */
31 //Estaciones [0] = "Estacion de Salida ...";
32 Estaciones [1]= "Aeroport";
33 Estaciones [2]= "Alameda";
34 Estaciones [3]= "Albalat_dels_Sorells";
35 Estaciones [4]= "Alboraya_Palmaret";
36 Estaciones [5]= "Alboraya_Peris_Arago";
37 Estaciones [6]= "Alberic";
38 Estaciones [7]= "Alfauir";
39 Estaciones [8]= "Alginet";
40 Estaciones [9]= "Almassera";
41 Estaciones [10]= "Amistat";
42 Estaciones [11]= "Angel_Guimera";
43 Estaciones [12]= "Aragon";
44 Estaciones [13]= "Ausias_March";
R.Sanz 191
Escuela Tecnica Superior de Ingenieros Informaticos Enero 2016
45 Estaciones [14]= "Avinguda_del_Cid";
46 Estaciones [15]= "Ayora";
47 Estaciones [16]= "Bailen";
48 Estaciones [17]= "Benaguasil_1r";
49 Estaciones [18]= "Benaguasil_2n";
50 Estaciones [19]= "Benicalap";
51 Estaciones [20]= "Beniferri";
52 Estaciones [21]= "Benimaclet";
53 Estaciones [22]= "Benimamet";
54 Estaciones [23]= "Benimodo";
55 Estaciones [24]= "Betera";
56 Estaciones [25]= "Burjassot";
57 Estaciones [26]= "Burjassot_Godella";
58 Estaciones [27]= "Campament";
59 Estaciones [28]= "Campanar_La_Fe";
60 Estaciones [29]= "Campus_de_Burjassot";
61 Estaciones [30]= "Cantereria";
62 Estaciones [31]= "Carlet";
63 Estaciones [32]= "Col_legi_El_Vedat";
64 Estaciones [33]= "Colon";
65 Estaciones [34]= "Doctor_Lluch";
66 Estaciones [35]= "El_Clot";
67 Estaciones [36]= "Empalme";
R.Sanz 192
Escuela Tecnica Superior de Ingenieros Informaticos Enero 2016
68 Estaciones [37]= "Entrepins";
69 Estaciones [38]= "Estadi_del_Llevant";
70 Estaciones [39]= "Espioca";
71 Estaciones [40]= "Eugenia_Vinies";
72 Estaciones [41]= "Facultats";
73 Estaciones [42]= "Faitanar";
74 Estaciones [43]= "Fira_Valencia";
75 Estaciones [44]= "Florista";
76 Estaciones [45]= "Font_Almanguer";
77 Estaciones [46]= "Foios";
78 Estaciones [47]= "Francesc_Cubells";
79 Estaciones [48]= "Fuente_del_Jarro";
80 Estaciones [49]= "Garbi";
81 Estaciones [50]= "Godella";
82 Estaciones [51]= "Grau_Canyamelar";
83 Estaciones [52]= "Joaquin_Sorolla";
84 Estaciones [53]= "LAlcudia";
85 Estaciones [54]= "LEliana";
86 Estaciones [55]= "La_Cadena";
87 Estaciones [56]= "La_Canyada";
88 Estaciones [57]= "La_Carrasca";
89 Estaciones [58]= "La_Coma";
90 Estaciones [59]= "La_Granja";
R.Sanz 193
Escuela Tecnica Superior de Ingenieros Informaticos Enero 2016
91 Estaciones [60]= "La_Marina";
92 Estaciones [61]= "La_Pobla_de_Farnals";
93 Estaciones [62]= "La_Pobla_De_Vallbona";
94 Estaciones [63]= "La_Vallesa";
95 Estaciones [64]= "Les_Arenes";
96 Estaciones [65]= "Les_Carolines_Fira";
97 Estaciones [66]= "Ll_Llarga_Terramelar";
98 Estaciones [67]= "Lliria";
99 Estaciones [68]= "Machado";
100 Estaciones [69]= "Manises";
101 Estaciones [70]= "Maritim_Serreria";
102 Estaciones [71]= "Marxalenes";
103 Estaciones [72]= "Mas_del_Rosari";
104 Estaciones [73]= "Masies";
105 Estaciones [74]= "Massalaves";
106 Estaciones [75]= "Massamagrell";
107 Estaciones [76]= "Massarrojos";
108 Estaciones [77]= "Meliana";
109 Estaciones [78]= "Mediterrani";
110 Estaciones [79]= "Mislata";
111 Estaciones [80]= "Mislata_Almassil";
112 Estaciones [81]= "Montcada_Alfara";
113 Estaciones [82]= "Montesol";
R.Sanz 194
Escuela Tecnica Superior de Ingenieros Informaticos Enero 2016
114 Estaciones [83]= "Montortal";
115 Estaciones [84]= "Museros";
116 Estaciones [85]= "Neptu";
117 Estaciones [86]= "Nou_d’Octubre";
118 Estaciones [87]= "Omet";
119 Estaciones [88]= "Orriols";
120 Estaciones [89]= "Paiporta";
121 Estaciones [90]= "Palau_de_Congressos";
122 Estaciones [91]= "Paterna";
123 Estaciones [92]= "Patraix";
124 Estaciones [93]= "Picanya";
125 Estaciones [94]= "Picassent";
126 Estaciones [95]= "PlazaEspanya";
127 Estaciones [96]= "Pont_de_Fusta";
128 Estaciones [97]= "Primat_Reig";
129 Estaciones [98]= "Quart_de_Poblet";
130 Estaciones [99]= "Rafelbunyol";
131 Estaciones [100]= "Realon";
132 Estaciones [101]= "Reus";
133 Estaciones [102]= "Rocafort";
134 Estaciones [103]= "Rosas";
135 Estaciones [104]= "S_Psiquiatric";
136 Estaciones [105]= "Safranar";
R.Sanz 195
Escuela Tecnica Superior de Ingenieros Informaticos Enero 2016
137 Estaciones [106]= "Sagunt";
138 Estaciones [107]= "Salt_de_lAigua";
139 Estaciones [108]= "Sant_Isidre";
140 Estaciones [109]= "Sant_Joan";
141 Estaciones [110]= "Sant_Miquel_dels_Reis";
142 Estaciones [111]= "Sant_Ramon";
143 Estaciones [112]= "Santa_Gemma_Parc_Cientific_UV";
144 Estaciones [113]= "Santa_Rita";
145 Estaciones [114]= "Seminari_CEU";
146 Estaciones [115]= "Serreria";
147 Estaciones [116]= "Tarongers";
148 Estaciones [117]= "Tomas_y_Valiente";
149 Estaciones [118]= "Torre_del_Virrei";
150 Estaciones [119]= "Torrent";
151 Estaciones [120]= "Torrent_Avinguda";
152 Estaciones [121]= "Tossal_del_Rei";
153 Estaciones [122]= "Transits";
154 Estaciones [123]= "Turia";
155 Estaciones [124]= "TVV";
156 Estaciones [125]= "Universitat_Politecnica";
157 Estaciones [126]= "Valencia_Sud";
158 Estaciones [127]= "Vicent_Andres_Estelles";
159 Estaciones [128]= "Vicent_Zaragoza";
R.Sanz 196
Escuela Tecnica Superior de Ingenieros Informaticos Enero 2016
160 Estaciones [129]= "Villanueva_de_Castellon";
161 Estaciones [130]= "Xativa";
162
163 //for (i = 0; i < Estaciones.length; ++i) {
164 for (i = 1; i < Estaciones.length; ++i) {
165 Selector.addItem(Estaciones[i],i);
166 }
167
168 /* Location */
169 setLayout (Layout);
170 Selector.setBounds(40, 225, 375, 400);
171 panel.add(Selector);
172 contentpane.add(Selector);
173
174 /* Configuration */
175 Selector.addItemListener (this);
176
177 /* Initialization */
178 Selector.select(0);
179 this.salida.setsalida(Estaciones[1]);
180
181 }
182
R.Sanz 197
Escuela Tecnica Superior de Ingenieros Informaticos Enero 2016
183 public void itemStateChanged(ItemEvent e) {
184 int Selection;
185 Selection = Selector.getSelectedIndex() + 1;
186 salida.setsalida(Estaciones[Selection]);
187 System.out.println("Salida::::::: " + Selection);
188
189 }
190
191 }
R.Sanz 198
Escuela Tecnica Superior de Ingenieros Informaticos Enero 2016
10.2.4. Dibujo.java
1 package Grafica;
2 import java.awt.*;
3 import java.awt.event.*;
4 import java.util.List;
5
6 import javax.swing.*;
7 import javax.swing.border.TitledBorder;
8
9 public class Dibujo extends Frame{
10
11 //private static JTextArea areaTexto1;
12 //private static boolean evitar2veces = false;
13 private static JPanel panel_estaciones = new JPanel();
14 private static JScrollPane panel_estaciones2;
15 private static JPanel menu_sur;
16 private static JButton btn_Salir;
17
18 private static JLabel cartel;
19 private static Font Times;
20
21 private static JLabel caja_vacia;
22 private static JLabel estacion;
R.Sanz 199
Escuela Tecnica Superior de Ingenieros Informaticos Enero 2016
23
24 public Dibujo(List<Pixel> lista){
25 super( "MetVal Project" );
26
27 //////////////////////////////////////
28 // BARRA DE MENUS SUPERIOR
29 //////////////////////////////////////
30 Menu menuArchivo = new Menu( "Archivo" );
31
32 // establecer elemento de menu Acerca de...
33 MenuItem elementoAcerca = new MenuItem( "Acerca de..." );
34 menuArchivo.add( elementoAcerca );
35 elementoAcerca.addActionListener( new ActionListener() {
36 // mostrar cuadro de dialogo de mensaje cuando el usuario
seleccione Acerca de...
37 public void actionPerformed( ActionEvent evento )
38 {
39 JOptionPane.showMessageDialog( Dibujo.this,
40 "Este software fue diseniado por: \nRicardo Sanz Hinojosas" +
41 "\n",
42 "Acerca de", JOptionPane.PLAIN_MESSAGE );
43 }
44
R.Sanz 200
Escuela Tecnica Superior de Ingenieros Informaticos Enero 2016
45 });
46
47 MenuItem elementoSalir = new MenuItem( "Salir" );
48 menuArchivo.add( elementoSalir );
49 elementoSalir.addActionListener( new ActionListener() {
50 // terminar la aplicacion cuando el usuario haga clic en
elementoSalir
51 public void actionPerformed( ActionEvent evento ) {
52 dispose();
53 panel_estaciones.removeAll();
54 estacion.removeAll();
55 caja_vacia.removeAll();
56 validate();
57
58 }
59 });
60
61 // crear barra de menus y adjuntarla a la ventana
62 MenuBar barra = new MenuBar();
63 setMenuBar( barra );
64 barra.add( menuArchivo );
65
R.Sanz 201
Escuela Tecnica Superior de Ingenieros Informaticos Enero 2016
66 // Clase anidada que permite terminar la ejecucion de la
animacion
67 this.addWindowListener( new WindowAdapter() {
68 public void windowClosing( WindowEvent evt ) {
69 dispose();
70 panel_estaciones.removeAll();
71 estacion.removeAll();
72 caja_vacia.removeAll();
73 validate();
74
75 }
76 });
77
78
79 //////////////////////////////////////
80 // MOSTRADO DEL DIBUJO
81 //////////////////////////////////////
82
83 setLayout(new BorderLayout());
84
85 cartel = new JLabel();
86 cartel.setText(" LA RUTA MAS RAPIDA ES");
87 cartel.setAlignmentX(CENTER_ALIGNMENT);
R.Sanz 202
Escuela Tecnica Superior de Ingenieros Informaticos Enero 2016
88 for (int i = lista.size() - 1 ; i >= 0; i--){
89 estacion = new JLabel(" "+ lista.get(i).getNombre()+" ",
SwingConstants.CENTER);
90 caja_vacia = new JLabel("");
91
92 estacion.setBorder(BorderFactory.createLineBorder(Color.black));
93 estacion.setPreferredSize(new Dimension(150,30));
94
95 caja_vacia.setPreferredSize(new Dimension(80,5));
96 caja_vacia.setOpaque(true);
97
98 panel_estaciones.add(estacion);
99
100 if (i > 0) {
101 switch (lista.get(i-1).getLinea()) {
102 case "linea1":
103 caja_vacia.setBackground(Color.YELLOW);
104 caja_vacia.setBorder(BorderFactory.createLineBorder(Color.yellow
));
105 break;
106
107 case "linea2":
108 caja_vacia.setBackground(Color.MAGENTA);
R.Sanz 203
Escuela Tecnica Superior de Ingenieros Informaticos Enero 2016
109 caja_vacia.setBorder(BorderFactory.createLineBorder(Color.
magenta));
110 break;
111
112 case "linea3":
113 caja_vacia.setBackground(Color.RED);
114 caja_vacia.setBorder(BorderFactory.createLineBorder(Color.red));
115 break;
116
117 case "linea4":
118 caja_vacia.setBackground(Color.BLUE);
119 caja_vacia.setBorder(BorderFactory.createLineBorder(Color.blue))
;
120 break;
121
122 case "linea5":
123 caja_vacia.setBackground(Color.GREEN);
124 caja_vacia.setBorder(BorderFactory.createLineBorder(Color.GREEN)
);
125 break;
126
127 case "linea6":
128 caja_vacia.setBackground(Color.MAGENTA);
R.Sanz 204
Escuela Tecnica Superior de Ingenieros Informaticos Enero 2016
129 caja_vacia.setBorder(BorderFactory.createLineBorder(Color.
magenta));
130 break;
131
132 }
133 panel_estaciones.add(caja_vacia, BorderLayout.NORTH);
134
135 }
136
137 }
138
139 //////////////////////////////////////
140 // MOSTRADO DEL DIBUJO
141 //////////////////////////////////////
142 panel_estaciones2 = new JScrollPane(panel_estaciones);
143 panel_estaciones2.setSize(700,100);
144
145 panel_estaciones.setBackground(Color.WHITE);
146 panel_estaciones2.setBackground(Color.WHITE);
147
148 Times = new Font("TimeNewRoman", 20, 25);
149 cartel.setFont (Times);
150 cartel.setBounds(75, 200, 335, 90);
R.Sanz 205
Escuela Tecnica Superior de Ingenieros Informaticos Enero 2016
151 cartel.setBackground(Color.WHITE);
152
153 //////////////////////////////////////
154 // MENU SUR
155 //////////////////////////////////////
156 menu_sur = new JPanel();
157 btn_Salir = new JButton("Salir");
158 btn_Salir.addActionListener(new ActionListener() {
159 public void actionPerformed(ActionEvent e){
160 dispose();
161 panel_estaciones.removeAll();
162 estacion.removeAll();
163 caja_vacia.removeAll();
164 validate();
165 }
166 });
167
168 menu_sur.add(btn_Salir);
169 menu_sur.setBackground(Color.darkGray);
170
171 add(cartel, BorderLayout.NORTH);
172 add(panel_estaciones2, BorderLayout.CENTER);
173 add(menu_sur, BorderLayout.SOUTH);
R.Sanz 206
Escuela Tecnica Superior de Ingenieros Informaticos Enero 2016
174
175 setSize( 1000, 200 );
176
177 setVisible(true);
178
179 }
180
181 }
R.Sanz 207
Escuela Tecnica Superior de Ingenieros Informaticos Enero 2016
10.2.5. menuayuda.java
1 package Grafica;
2
3 import java.awt.*;
4 import java.awt.event.*;
5 import java.net.URL;
6
7 import javax.swing.*;
8 import javax.swing.border.TitledBorder;
9
10 public class menu_ayuda extends JFrame {
11 //Menu de ayuda
12 private static JPanel p_menu_ayuda;
13 //Imagen del mapa
14 private static ImageIcon image1;
15 private static JLabel label_img1;
16 //Menu sur
17 private static JPanel p_menu_sur;
18 private static JButton btn_Salir;
19
20 public menu_ayuda() {
21 p_menu_ayuda = new JPanel();
22
R.Sanz 208
Escuela Tecnica Superior de Ingenieros Informaticos Enero 2016
23 p_menu_sur = new JPanel();
24 btn_Salir = new JButton("Salir");
25
26 URL url = menu_mapa.class.getResource("/resource/Menu_Ayuda.png"
);
27 image1 = new ImageIcon(url);
28 label_img1 = new JLabel("", image1, JLabel.CENTER);
29
30 p_menu_ayuda.add(label_img1);
31 p_menu_ayuda.setBackground(Color.darkGray);
32
33 //ADD COMPONENTS TO JPANELS
34 p_menu_sur.add(btn_Salir);
35 p_menu_sur.setBackground(Color.darkGray);
36
37 //Set Layout
38 setLayout(new BorderLayout());
39
40 //FRAME CONFIGURATION
41 add(p_menu_ayuda, BorderLayout.CENTER);
42 add(p_menu_sur, BorderLayout.SOUTH);
43
44 //LayOut Properties
R.Sanz 209
Escuela Tecnica Superior de Ingenieros Informaticos Enero 2016
45 setSize(776,684);
46 setLocationRelativeTo(null);
47 setTitle("...:: Ayuda ::...");
48 pack();
49
50 // ACTIONS CONFIGURATION
51 btn_Salir.addActionListener(new ActionListener() {
52 public void actionPerformed(ActionEvent e){
53 dispose();
54 validate();
55 }
56 });
57
58 //Ventana se cierra de la ’X’
59 addWindowListener(new WindowAdapter() {
60 @Override
61 public void windowClosing(WindowEvent e) {
62 dispose();
63 validate();
64 }
65 });
66
67 }
R.Sanz 210
Escuela Tecnica Superior de Ingenieros Informaticos Enero 2016
68 }
R.Sanz 211
Escuela Tecnica Superior de Ingenieros Informaticos Enero 2016
10.2.6. menumapa.java
1 package Grafica;
2
3 import java.awt.*;
4 import java.awt.event.*;
5 import java.net.URL;
6
7 import javax.swing.*;
8 import javax.swing.border.TitledBorder;
9
10 public class menu_mapa extends JFrame {
11 //JPanel de mostrado de mapa
12 private static JPanel p_mapa;
13 private static JScrollPane p_mapa2;
14 private static JPanel p_menu_sur;
15 private static JButton btn_Salir;
16 //Imagen del mapa
17 private static ImageIcon image1;
18 private static JLabel label_img1;
19
20 public menu_mapa() {
21 p_mapa = new JPanel();
22 p_mapa2 = new JScrollPane(p_mapa);
R.Sanz 212
Escuela Tecnica Superior de Ingenieros Informaticos Enero 2016
23 p_menu_sur = new JPanel();
24 btn_Salir = new JButton("Salir");
25
26 URL url = menu_mapa.class.getResource("/resource/metro-valencia.
jpg");
27 image1 = new ImageIcon(url);
28 label_img1 = new JLabel("", image1, JLabel.CENTER);
29
30 //ADD COMPONENTS TO JPANELS
31 p_mapa.add(label_img1);
32 p_menu_sur.add(btn_Salir);
33 p_mapa.setBackground(Color.darkGray);
34 p_menu_sur.setBackground(Color.darkGray);
35
36 p_mapa2.setSize(new Dimension(200,200));
37
38 //Set Layout
39 setLayout(new BorderLayout());
40
41 //FRAME CONFIGURATION
42 add(p_mapa2,BorderLayout.CENTER);
43 add(p_menu_sur,BorderLayout.SOUTH);
44
R.Sanz 213
Escuela Tecnica Superior de Ingenieros Informaticos Enero 2016
45 //LayOut Properties
46 setSize(700,700);
47 setLocationRelativeTo(null);
48 setTitle("...:: Mapa Zonal ::...");
49 pack();
50
51 // ACTIONS CONFIGURATION
52 btn_Salir.addActionListener(new ActionListener() {
53 public void actionPerformed(ActionEvent e){
54 dispose();
55 validate();
56 }
57 });
58
59 //Ventana se cierra de la ’X’
60 addWindowListener(new WindowAdapter() {
61 @Override
62 public void windowClosing(WindowEvent e) {
63 dispose();
64 validate();
65 }
66 });
67
R.Sanz 214
Escuela Tecnica Superior de Ingenieros Informaticos Enero 2016
68 }
69
70 }
R.Sanz 215
Escuela Tecnica Superior de Ingenieros Informaticos Enero 2016
10.2.7. Pixel.java
1 package Grafica;
2
3 public class Pixel {
4 String Nombre, linea;
5 int x,y;
6
7 public Pixel(int x, int y, String Nombre, String linea) {
8 this.x = x;
9 this.y = y;
10 this.Nombre = Nombre;
11 this.linea = linea;
12 }
13
14 public void setNombre(String nombre){
15 this.Nombre = nombre;
16 }
17
18 public String getNombre(){
19 return this.Nombre;
20 }
21
22 public void setLinea(String linea){
R.Sanz 216
Escuela Tecnica Superior de Ingenieros Informaticos Enero 2016
23 this.linea = linea;
24 }
25
26 public String getLinea(){
27 return this.linea;
28 }
29
30 public void setCoordenas(int x, int y){
31 this.x = x;
32 this.y = y;
33 }
34
35 public int getX(){
36 return this.x;
37 }
38
39 public int getY(){
40 return this.y;
41 }
42 }
R.Sanz 217
Escuela Tecnica Superior de Ingenieros Informaticos Enero 2016
10.2.8. Principal.java
1 package Grafica;
2
3 import javax.swing.*;
4
5 public class Principal {
6
7 public static void main (String Args[]) {
8 //Main object
9 Ventana frame_menu = new Ventana();
10
11 //Frame on the center of the screen
12 frame_menu.setLocationRelativeTo(null);
13
14 //Show Frame
15 frame_menu.setVisible(true);
16
17 //Close thread when click on close
18 frame_menu.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
19
20 }
21 }
R.Sanz 218
Escuela Tecnica Superior de Ingenieros Informaticos Enero 2016
10.2.9. Ventana.java
1 package Grafica;
2
3 import java.awt.*;
4 import java.awt.event.*;
5 import java.net.URL;
6
7 import javax.swing.*;
8 import javax.swing.border.TitledBorder;
9
10 public class Ventana extends JFrame {
11
12 private static JPanel pantallaEtiqueta;
13 private static JPanel menu_sur;
14 private static ImageIcon image1;
15 private static JLabel label_img1;
16
17 private static menu_mapa menu_mapa;
18 private static menu_ayuda menu_ayuda;
19
20 private static Dibujo aplicacion;
21
22 private static JMenuItem elementoAcerca;
R.Sanz 219
Escuela Tecnica Superior de Ingenieros Informaticos Enero 2016
23 private static JMenuItem elementoSalir;
24 private static JMenuItem elementoMapa;
25
26 private static JMenu menuArchivo;
27 private static JMenuBar barra;
28 private static JMenu menuVer;
29
30 private static JButton Aceptar;
31 private static JButton Salir;
32 private static JButton Mapa;
33 private static JButton Ayuda;
34
35 private static boolean hay_mapa = false;
36 private static boolean hay_ruta = false;
37 private static boolean hay_ayuda = false;
38 final JScrollPane panel;
39 final Container contentpane;
40
41 private String salida;
42 private String llegada;
43
44 public void setsalida(String salida) {
45 this.salida = salida;
R.Sanz 220
Escuela Tecnica Superior de Ingenieros Informaticos Enero 2016
46 }
47
48 public void setllegada(String llegada) {
49 this.llegada = llegada;
50 }
51
52 // configurar GUI
53 public Ventana() {
54 super("MetVal Project");
55
56 //////////////////////////////////////
57 // BARRA DE MENUS SUPERIOR
58 //////////////////////////////////////
59 // SECCION: VER
60
61 menuVer = new JMenu("Ver");
62 elementoMapa = new JMenuItem("Mapa");
63 menuVer.add(elementoMapa);
64 elementoMapa.addActionListener(new ActionListener() {
65 public void actionPerformed(ActionEvent evento) {
66 menu_mapa = new menu_mapa();
67 hay_mapa = true;
68 menu_mapa.setVisible(true);
R.Sanz 221
Escuela Tecnica Superior de Ingenieros Informaticos Enero 2016
69 validate();
70 }
71 });
72
73 // SECCION: ARCHIVO
74 menuArchivo = new JMenu("Archivo");
75
76 elementoAcerca = new JMenuItem("Acerca de...");
77 menuArchivo.add(elementoAcerca);
78 elementoAcerca.addActionListener(new ActionListener() {
79 // Mostrado de dialog cuando se pulsa
80 public void actionPerformed(ActionEvent evento) {
81 JOptionPane.showMessageDialog(Ventana.this,
82 "Este software fue diseniado por: \nRicardo Sanz Hinojosas" + "\
n", "Acerca de",
83 JOptionPane.PLAIN_MESSAGE);
84 }
85
86 });
87
88 elementoSalir = new JMenuItem("Salir");
89 menuArchivo.add(elementoSalir);
90 elementoSalir.addActionListener(new ActionListener() {
R.Sanz 222
Escuela Tecnica Superior de Ingenieros Informaticos Enero 2016
91 public void actionPerformed(ActionEvent evento) {
92 dispose();
93 if (hay_mapa == true) {
94 menu_mapa.dispose();
95 }
96 if (hay_ruta == true) {
97 aplicacion.dispose();
98 }
99 if (hay_ayuda == true) {
100 menu_ayuda.dispose();
101 }
102 dispose();
103 validate();
104 }
105 });
106
107 // crear barra de menus y adjuntarla a la ventana
108 barra = new JMenuBar();
109 setJMenuBar(barra);
110 barra.add(menuArchivo);
111 barra.add(menuVer);
112
113 panel = new JScrollPane();
R.Sanz 223
Escuela Tecnica Superior de Ingenieros Informaticos Enero 2016
114 panel.setLayout(null);
115 panel.setAutoscrolls(true);
116 contentpane = getContentPane();
117
118 ChoiceSal Salida = new ChoiceSal(this, panel, contentpane);
119 ChoiceLle Llegada = new ChoiceLle(this, panel, contentpane);
120
121 //////////////////////////////////////
122 // CABECERA DE LA APLICACION
123 //////////////////////////////////////
124 URL url = Ventana.class.getResource("/resource/met_val.png");
125 image1 = new ImageIcon(url);
126 label_img1 = new JLabel("", image1, JLabel.CENTER);
127
128 pantallaEtiqueta = new JPanel();
129 pantallaEtiqueta.add(label_img1);
130 pantallaEtiqueta.setBackground(Color.BLACK);
131
132 //////////////////////////////////////
133 // MENU INFERIOR
134 //////////////////////////////////////
135 Aceptar = new JButton("Aceptar");
136 // Aceptar.setFont(new Font("TimeNewRoman", 20, 24));
R.Sanz 224
Escuela Tecnica Superior de Ingenieros Informaticos Enero 2016
137 // Aceptar.setBounds(390, 250, 120, 40);
138 contentpane.add(Aceptar);
139 Aceptar.addActionListener(new ActionListener() {
140 public void actionPerformed(ActionEvent evento) {
141 hay_ruta = true;
142 System.out.print(salida);
143 System.out.print(" - ");
144 System.out.println(llegada);
145 AA AEstrella = new AA(salida, llegada);
146 JFrame.setDefaultLookAndFeelDecorated(false);
147 aplicacion = new Dibujo(AEstrella.recorridoObtimo());
148 // Aestrella.recor... es la lista de pixels
149 }
150 });
151
152 Ayuda = new JButton("Ayuda");
153 // Salir.setFont(new Font("TimeNewRoman", 20, 24));
154 // Salir.setBounds(390, 250, 120, 40);
155 Ayuda.addActionListener(new ActionListener() {
156 public void actionPerformed(ActionEvent evento) {
157 menu_ayuda = new menu_ayuda();
158 hay_ayuda = true;
159 menu_ayuda.setVisible(true);
R.Sanz 225
Escuela Tecnica Superior de Ingenieros Informaticos Enero 2016
160 validate();
161 }
162 });
163
164 Salir = new JButton("Salir");
165 // Salir.setFont(new Font("TimeNewRoman", 20, 24));
166 // Salir.setBounds(390, 250, 120, 40);
167 Salir.addActionListener(new ActionListener() {
168 public void actionPerformed(ActionEvent evento) {
169 dispose();
170 if (hay_mapa == true) {
171 menu_mapa.dispose();
172 }
173 if (hay_ruta == true) {
174 aplicacion.dispose();
175 }
176 if (hay_ayuda == true) {
177 menu_ayuda.dispose();
178 }
179 dispose();
180 validate();
181 }
182 });
R.Sanz 226
Escuela Tecnica Superior de Ingenieros Informaticos Enero 2016
183
184 menu_sur = new JPanel();
185
186 menu_sur.add(Aceptar);
187 menu_sur.add(Salir);
188 menu_sur.add(Ayuda);
189 menu_sur.setBackground(Color.DARK_GRAY);
190
191 //////////////////////////////////////
192 // CONFIGURACION DE CONTENTPANE
193 //////////////////////////////////////
194 //contentpane.setBackground(Color.lightGray);
195 contentpane.setBackground(new Color(205, 19, 42));
196
197 //////////////////////////////////////
198 // CONFIGURACION DEL FRAME
199 //////////////////////////////////////
200
201 //Set Layout
202 setLayout(new BorderLayout());
203
204 add(pantallaEtiqueta, BorderLayout.NORTH);
205 add(menu_sur, BorderLayout.SOUTH);
R.Sanz 227
Escuela Tecnica Superior de Ingenieros Informaticos Enero 2016
206 setSize(900, 750);
207 setLocationRelativeTo(null);
208
209 }
210
211 }
R.Sanz 228
Escuela Tecnica Superior de Ingenieros Informaticos Enero 2016
10.3. Package Grafo
10.3.1. Grafo.java
1 package Grafo;
2
3 import java.util.ArrayList;
4 import java.util.HashMap;
5 import java.util.Iterator;
6 import java.util.List;
7 import java.util.Map;
8
9 import Arbol.*;
10 import Grafica.Pixel;
11 import jdd.graph.*;
12
13 //Grafo para los calculos de recorrido.
14 public class Grafo extends jdd.graph.Graph{
15 List<Nodo> nodos = new ArrayList<Nodo>();;
16 List<Edge> edges = new ArrayList<Edge>();;
17 Map<String, List<Edge>> tabla = new HashMap<String, List<Edge
>>();;
18
19 public Grafo(boolean arg0) {
R.Sanz 229
Escuela Tecnica Superior de Ingenieros Informaticos Enero 2016
20 super(arg0);
21 }
22
23 public Nodo addNode (String nombre, int x, int y){
24 Nodo nodo = new Nodo(10);
25 nodos.add(nodo);
26 nodo.addNombre(nombre);
27 nodo.addCoordenas(x, y);
28 return nodo;
29 }
30
31 public Edge addEdge (Nodo n1, Nodo n2, double d, String linea){
32 Edge arista1 = new Edge(n1,n2,(int) d);
33 edges.add(arista1);
34 arista1.setWeight(d);
35 arista1.setLabel(linea);
36 if (tabla.isEmpty()){
37 tabla.put(n1.getNombre(), new ArrayList<Edge>());
38 tabla.put(n2.getNombre(), new ArrayList<Edge>());
39 }
40 if (tabla.containsKey(n1.getNombre())){
41 List<Edge> lista = tabla.get(n1.getNombre());
42 lista.add(arista1);
R.Sanz 230
Escuela Tecnica Superior de Ingenieros Informaticos Enero 2016
43 tabla.remove(n1.getNombre());
44 tabla.put(n1.getNombre(),lista);
45 }
46 else{
47 List<Edge> lista = new ArrayList<Edge>();
48 lista.add(arista1);
49 tabla.put(n1.getNombre(),lista);
50 }
51 Edge arista2 = super.addEdge(n2, n1);
52 arista2.setWeight(d);
53 arista2.setLabel(linea);
54 if (tabla.containsKey(n2.getNombre())){
55 List<Edge> lista = tabla.get(n2.getNombre());
56 lista.add(arista2);
57 tabla.remove(n2.getNombre());
58 tabla.put(n2.getNombre(),lista);
59 }
60 else{
61 List<Edge> lista = new ArrayList<Edge>();
62 lista.add(arista2);
63 tabla.put(n2.getNombre(),lista);
64 }
65 return arista1;
R.Sanz 231
Escuela Tecnica Superior de Ingenieros Informaticos Enero 2016
66 }
67
68 public List<LTreeNode<Elemento>> getChild(LTreeNode<Elemento>
nodo, Nodo fin){
69 List <LTreeNode<Elemento>> lista = new ArrayList<LTreeNode<
Elemento>>();
70 List<Edge> aristas = tabla.get(nodo.element().getnodo().
getNombre());
71 Iterator<Edge> iterador = aristas.iterator();
72 String nombre = "";
73 if (nodo.getParent() != null){
74 nombre = nodo.getParent().element().getnodo().getNombre();
75 }
76 while(iterador.hasNext()){
77 Edge arista = iterador.next();
78 Nodo hijo = (Nodo) arista.n2;
79 if (hijo.getNombre()!= nombre){
80 Elemento elemento = new Elemento(arista.weight,hijo.distancia(
fin),hijo);
81 LTreeNode<Elemento> node = new LTreeNode<Elemento>(elemento,nodo
,null);
82 lista.add(node);
83 }
R.Sanz 232
Escuela Tecnica Superior de Ingenieros Informaticos Enero 2016
84 }
85 return lista;
86 }
87
88 public Map<String, List<Edge>> getMap (){
89 return this.tabla;
90 }
91 }
R.Sanz 233
Escuela Tecnica Superior de Ingenieros Informaticos Enero 2016
10.3.2. Nodo.java
1 package Grafo;
2
3 import java.util.ArrayList;
4 import java.util.HashMap;
5 import java.util.Iterator;
6 import java.util.List;
7 import java.util.Map;
8
9 import Arbol.*;
10 import Grafica.Pixel;
11 import jdd.graph.*;
12
13 //Grafo para los calculos de recorrido.
14 public class Grafo extends jdd.graph.Graph{
15 List<Nodo> nodos = new ArrayList<Nodo>();;
16 List<Edge> edges = new ArrayList<Edge>();;
17 Map<String, List<Edge>> tabla = new HashMap<String, List<Edge
>>();;
18
19 public Grafo(boolean arg0) {
20 super(arg0);
21 }
R.Sanz 234
Escuela Tecnica Superior de Ingenieros Informaticos Enero 2016
22
23 public Nodo addNode (String nombre, int x, int y){
24 Nodo nodo = new Nodo(10);
25 nodos.add(nodo);
26 nodo.addNombre(nombre);
27 nodo.addCoordenas(x, y);
28 return nodo;
29 }
30
31 public Edge addEdge (Nodo n1, Nodo n2, double d, String linea){
32 Edge arista1 = new Edge(n1,n2,(int) d);
33 edges.add(arista1);
34 arista1.setWeight(d);
35 arista1.setLabel(linea);
36 if (tabla.isEmpty()){
37 tabla.put(n1.getNombre(), new ArrayList<Edge>());
38 tabla.put(n2.getNombre(), new ArrayList<Edge>());
39 }
40 if (tabla.containsKey(n1.getNombre())){
41 List<Edge> lista = tabla.get(n1.getNombre());
42 lista.add(arista1);
43 tabla.remove(n1.getNombre());
44 tabla.put(n1.getNombre(),lista);
R.Sanz 235
Escuela Tecnica Superior de Ingenieros Informaticos Enero 2016
45 }
46 else{
47 List<Edge> lista = new ArrayList<Edge>();
48 lista.add(arista1);
49 tabla.put(n1.getNombre(),lista);
50 }
51 Edge arista2 = super.addEdge(n2, n1);
52 arista2.setWeight(d);
53 arista2.setLabel(linea);
54 if (tabla.containsKey(n2.getNombre())){
55 List<Edge> lista = tabla.get(n2.getNombre());
56 lista.add(arista2);
57 tabla.remove(n2.getNombre());
58 tabla.put(n2.getNombre(),lista);
59 }
60 else{
61 List<Edge> lista = new ArrayList<Edge>();
62 lista.add(arista2);
63 tabla.put(n2.getNombre(),lista);
64 }
65 return arista1;
66 }
67
R.Sanz 236
Escuela Tecnica Superior de Ingenieros Informaticos Enero 2016
68 public List<LTreeNode<Elemento>> getChild(LTreeNode<Elemento>
nodo, Nodo fin){
69 List <LTreeNode<Elemento>> lista = new ArrayList<LTreeNode<
Elemento>>();
70 List<Edge> aristas = tabla.get(nodo.element().getnodo().
getNombre());
71 Iterator<Edge> iterador = aristas.iterator();
72 String nombre = "";
73 if (nodo.getParent() != null){
74 nombre = nodo.getParent().element().getnodo().getNombre();
75 }
76 while(iterador.hasNext()){
77 Edge arista = iterador.next();
78 Nodo hijo = (Nodo) arista.n2;
79 if (hijo.getNombre()!= nombre){
80 Elemento elemento = new Elemento(arista.weight,hijo.distancia(
fin),hijo);
81 LTreeNode<Elemento> node = new LTreeNode<Elemento>(elemento,nodo
,null);
82 lista.add(node);
83 }
84 }
85 return lista;
R.Sanz 237
Escuela Tecnica Superior de Ingenieros Informaticos Enero 2016
86 }
87
88 public Map<String, List<Edge>> getMap (){
89 return this.tabla;
90 }
91 }
R.Sanz 238
Este documento esta firmado porFirmante CN=tfgm.fi.upm.es, OU=CCFI, O=Facultad de Informatica - UPM,
C=ES
Fecha/Hora Mon Jan 09 01:14:03 CET 2017
Emisor delCertificado
[email protected], CN=CA Facultad deInformatica, O=Facultad de Informatica - UPM, C=ES
Numero de Serie 630
Metodo urn:adobe.com:Adobe.PPKLite:adbe.pkcs7.sha1 (AdobeSignature)