Programa complejo en java

JPval

Lanero Reconocido
Se unió
25 Ago 2004
Mensajes
221
Amigos LANeros:

Tengo una practica en Java para presentar en la universidad, y la idea es la siguiente:

PRIMERO: Que aquellos que lean este tma y tenga conocimiento de como se puede realizar, haga su comentario.
SEGUNDO: No estoy pidiendo que me manden el codigo para evitar malos entendidos.
TERCERO: Quien me pueda colaborar muchas gracias por sus aportes.

PROBLEMA:

La idea es elaborar un proyecto en Java que haga lo siguiente. Hay una malla vial en la cual interactuan cinco clases u objetos de la siguiente manera: Puede haber un accidente en un determinado lugar y en otro con sus respectivas coordenadas una ambulancia, a su vez centros de atencion donde llegan las ambulancias.

Entonces el programa es hacer que cuando el usuario ingrese los puntos donde hay emergencia, las ambulancias y los sitios de atencion el programa les diga cual ambulancia atiende el incidente y a que centro de atencion lleva los heridos.
-------------------------------------------------------------------------------------------------------

Entonces hasta el momento creo que es mejor hacerlo por una matriz que sea heredada por objetos ambulancia y centros de atencion,pero obviamente que haya en objeto que sea accidentes en la malla vial.

espero haya sido claro con el problema, de lo contrario ahi esta el foro.

Muchas gracias por sus sugerencias.
 

[WT]Zer0

Lanero Reconocido
Se unió
19 Jul 2004
Mensajes
802
Pero a que nivel de complejidad te lo solicitaron en la U, me refiero, hay que implementar algoritmos de grafos para determinar la ruta mas corta, o solucion de sistema de ecuaciones lineales para maximizar el numero de heridos que recojan las ambulancias, o simplemente que cualquier ambulancia recoja a cualquier herido sin importar la optimizacion ?????
 

FoxM

Lanero Reconocido
Se unió
25 Jun 2004
Mensajes
938
Nah hombre... no se complique la vida... utilice la clase java.awt.Point o alguna de las inner clases de java.awt.geom.Point2D para determinar las posiciones de los centros de atención, las ambulancias y los incidentes, obviamente respecto a un eje de coordenadas teórico que ud determina. Luego utilice los métodos de Point2D para hallar la distancia entre los puntos implicados y verifique las distancias más cortas.

Listo. Casi que le hago el ejercicio ;)

Hahahaha NO mentiras... es broma. Quiero decir que así es como yo le entendí el problema y le sugiero una posible solución.
 

T#3_#@RD3R

Lanero Reconocido
Se unió
5 Oct 2004
Mensajes
122
Siiiii claro por alla lo dijeron, con grafos se haría un buen trabajo, algoritmos tipo Kruskal....
 

=LT=totobany

Lanero Reconocido
Se unió
12 Feb 2002
Mensajes
1,245
Si es como lo entendi creo que la solucion mas factible, seria trabajando con formula de distancia, que no es una cosa tan complicada, y lo de como representar los objetos, pues podria ser con botones o una clase que herede de estos, y que contenfan los datos que harian la diferencia entre, ambulacia y las otras mensionadas.
 

LordCyb3R

Lanero Reconocido
Se unió
5 Jul 2002
Mensajes
280
Mira lo que yo te sugiero hacer es lo siguiente:

Como ya te dice el problema tienes una maya vial que va a ser tratada como un conjunto de puntos interconectados asi, un punto en una esquina estara conectado con otros 2, mientras que uno en el centro esta conectado con otros 4.

Supongamos que la distancia entre un punto y su punto adyacente seran iguales siempre, esto para que no te compliques dandole valores a la distancia entre punto y punto.

Veo que dices que utilizaras cinco clases principales, pero yo usaria 3 si es como te entiendo: "Herido", "Centro de atencion" y "Ambulancia", cada una con sus respectivas coordenas en la maya vial.

Y lo que haces es que primero calculas el algoritmo de Kruskal entre el Herido y las ambulancias para determinar cual esta mas cerca y luego de que llegue la ambulancia, calculas Kruskal entre esa ambulancia o el herido ( En este momento tendran las mismas coordenadas asi que no importa) y los centros de atencion y listo.

Es lo mismo que dijeron todos, espero te hayamos podido colaborar en algo.

PD: Por cierto tambien deberias mirar el algoritmo de Djistra es mas creo que ese es algoritmo correcto.
 

pL-DANM147

Lanero Reconocido
Se unió
6 May 2004
Mensajes
670
Bueno la idea es la siguiente, yo tengo tres objeos de una clase principal llamada malla vial pero como paso la posicion de los elementos de la matriz a un vector, por ejemplo si tengo una matriz de cuatro posiciones como hago para identificar cuales son las posiciones que tienen elemento diferente de cero para poderlas mandar a un vector(teniendo en cuenta que lo que quiero que vaya dentro del vector sean las posiciones de la matriz). Por favor me colaboran quienes quieran y puedan estoy trabajando pL-JPval en este problemita
 

LordCyb3R

Lanero Reconocido
Se unió
5 Jul 2002
Mensajes
280
PD: Por cierto tambien deberias mirar el algoritmo de Djistra es mas creo que ese es algoritmo correcto.
Bueno aqui me corrijo, el algoritmo correcto para eso tal y como lo habia dicho es Dijkstra que sirve para en encontrar el camino menos costoso(no necesariamente el camino menos costoso es el mas corto y no me refiero a dinero en si jejeje) entre nodos en un grafo.

Aqui hey un codigo del algoritmo en java para que lo pillen.
www.cs.rpi.edu/~puninj/XMLJ/projects/stuproj/turned/XMLProject/Dijkstra.java

El algoritmo de Kruskal sirve es para hacer el minimo Spanning Tree de un grafo, es decir eliminar conecciones redundantes a algo asi, se que es pero es muy dificil explicar sin dibujito o algo asi jejeje.

Bueno la idea es la siguiente, yo tengo tres objeos de una clase principal llamada malla vial pero como paso la posicion de los elementos de la matriz a un vector, por ejemplo si tengo una matriz de cuatro posiciones como hago para identificar cuales son las posiciones que tienen elemento diferente de cero para poderlas mandar a un vector(teniendo en cuenta que lo que quiero que vaya dentro del vector sean las posiciones de la matriz). Por favor me colaboran quienes quieran y puedan estoy trabajando pL-JPval en este problemita

Vamos a tomarlo asi:

OOOOOOOOO
COOOOAOOO
OOOHOOOOO
OOOOOOOAO
OOCOOOOOO

mmm veamos si me hago entender.

Tenemos la malla vial, representada en esta matriz de 9 x 5 donde C seran los centros de salud A las ambulancias y adivinen que es H ;-).

Lo primero es sacarnos la idea de que es una matriz por que no lo es, en realidad en es un grafo si lo vemos de esta manera:

C--O--O--O--O--A
|.....|......|......|.....|......|
O--O--O--H--O--O
|.....|......|......|.....|......|
O--O--O--O--O--O

(Los punticos que aparecen ahi por favor olvidarlos, los puse por que no permitia espacios en blanco)

Ahi represente un pedacito del grafo, como ya habiamos supuesto que tenian el mismo viajar de un nodo a otro. la ambulancia que esta en la posicion (6,2) (En la matriz de arriba uso el concepto de matriz solo para explicar aqui pero recordemos que es un grafo) usando Dijkstra tendra dos caminos correctos y con el mismo costo para ir donde el herido puede tomar:

[(6,3), (5,3), (4,3)] o
[(5,2), (4,2), (4,3)] Incluso podria tomar
[(5,2), (5,3), (4,3)] y tambien estaria correcto.

Al final Dijkstra solo toma una, pero ya viste que cualquiera es valida puesto que tienen el mismo costo.

Pueden saber cual esta mas cerca, mirando cual es numero de nodos que tendra que recorrer la ambulancia para llegar al centro de salud por ejemplo.

Tengan en cuenta que los grafos no se representan en matrices ni como pares ordenados, les sugiero que estudien Teoria de grafos, eso es facil de entender y les aseguro que les va a servir mucho.


Suerte y espero me hayan comprendido el enredo. :D
 

JPval

Lanero Reconocido
Se unió
25 Ago 2004
Mensajes
221
Gracias por la colaboracion de ustedes, en el dia de mañana les mandare un codigo que estoy haciendo para que por favor me refinen con lo que sepan.
 

FoxM

Lanero Reconocido
Se unió
25 Jun 2004
Mensajes
938
Código:
 :P
LordCyb3R dijo:
Lo primero es sacarnos la idea de que es una matriz por que no lo es, en realidad en es un grafo si lo vemos de esta manera:

C--O--O--O--O--A
|.....|......|......|.....|......|
O--O--O--H--O--O
|.....|......|......|.....|......|
O--O--O--O--O--O

(Los punticos que aparecen ahi por favor olvidarlos, los puse por que no permitia espacios en blanco)
Bacano todo el post. Cuando quieras hacer "ASCII art" mejor utiliza el "code tag"

Código:
C--O--O--O--O--A
|  |  |  |  |  |
O--O--O--H--O--O
|  |  |  |  |  |
O--O--O--O--O--O
(Creo que es más o menos esto lo que quieres expresar, ¿verdad?)
 

LordCyb3R

Lanero Reconocido
Se unió
5 Jul 2002
Mensajes
280
(Creo que es más o menos esto lo que quieres expresar, ¿verdad?)
Gracias FoxM, si eso era lo que queria mostrar, me alegra saber que por lo menos se entiende jejejeje
 

JPval

Lanero Reconocido
Se unió
25 Ago 2004
Mensajes
221
La ultima vez que intentamos hacer el ejercicio lo intentamos hacer desde un vector, pero nos quedamos estancados en la forma como capturariamos las dos cordenadas XY en un vector para luego compararlo y determinar la cercania de las ambulancias y de los centros de atencion.

De todas maneras pueden seguir colaborando quienes quieran.
 

FoxM

Lanero Reconocido
Se unió
25 Jun 2004
Mensajes
938
pL-JPval dijo:
La ultima vez que intentamos hacer el ejercicio lo intentamos hacer desde un vector, pero nos quedamos estancados en la forma como capturariamos las dos cordenadas XY en un vector para luego compararlo y determinar la cercania de las ambulancias y de los centros de atencion.

De todas maneras pueden seguir colaborando quienes quieran.

Para manejo de vectores está el package "javax.vecmath" en las librerías de Java 3D. Eso hasta le normaliza los vectores y le halla el ángulo entre vectores :p aproveche.
 

LordCyb3R

Lanero Reconocido
Se unió
5 Jul 2002
Mensajes
280
La ultima vez que intentamos hacer el ejercicio lo intentamos hacer desde un vector, pero nos quedamos estancados en la forma como capturariamos las dos cordenadas XY en un vector para luego compararlo y determinar la cercania de las ambulancias y de los centros de atencion.

De todas maneras pueden seguir colaborando quienes quieran.
Por que no postean el codigo, asi les colaboramos mejor, y se vuelve una tarea OpenSource jejeje

Me la impresion de que no estan usando grafos

Para manejo de vectores está el package "java.vecmath" en las librerías de Java 3D. Eso hasta le normaliza los vectores y le halla el ángulo entre vectores aproveche.
Es muy buena libreria, este man es el matematico de java ;-)
 

JPval

Lanero Reconocido
Se unió
25 Ago 2004
Mensajes
221
nada como les parece que presentamos lo que teniamos el lunes y el profe nos dijo que nada de grafos, solo tres clases objetuales ni estructuras ni nada.
Entonces ahi vamos con nuevas formas de hacer el ejercicio.
 

pL-DANM147

Lanero Reconocido
Se unió
6 May 2004
Mensajes
670
con las tres clases se puede solucionar sin necesidad de utilizar los grafos
 

FoxM

Lanero Reconocido
Se unió
25 Jun 2004
Mensajes
938
Implemente Comparable!

Una solución que es de Grafos, pero creo que simplificada :p y es casi lo que le dije al comienzo.

Son tres clases: emergencia, ambulancia y centro de atención, cada una con un field que le sirva para localizar el objeto (use java.awt.Point, creo que es lo mejor). Puede implementar el compareTo de la interface Comparable, obligando a que el "orden natural" de los objetos sea determinado por la distancia que hay entre ellos.

Dado que la clase que tiene más importancia es la emergencia, simplifíquese la vida y defina que solo puede haber 1 objeto de la clase emergencia. (Después le puede añadir más funcionalidad a la cosa)

Luego, haga un vector de ambulancias y uno de centros de atención. Estos datos los va obteniendo del usuario, a medida que va ingresando un nuevo objeto ambulancia o centro de atención, solo le pone
Código:
ambulancias.add(nuevaAmbulancia) y centros.add(nuevoCentro)
o algo así...

Cuando ya tiene toda la información, de ambulancias y centros de atención en sus sendos vectores, utilice la clase Collections para localizar su ambulancia y su centro más cercanos. Una puede ser utilizar
Código:
Collections.min(ambulancias) y Collections.min(centros)
Pero otra puede ser organizar las listas de menor a mayor con
Código:
Collections.sort(ambulancias) y Collections.sort(centros)
y cuando esten organizadas, pues no es sino obtener la ambulancia más cercana y el centro más cercano con
Código:
ambulancias.get(0) y centros.get(0)
Para hacer más elegante la cosa, sobrecargue el toString() para todas las clases y mánda eso a un
Código:
JOptionPane.showMessageDialog()
o directamente a la consola con el tradicional
Código:
System.out.println()
P.D. Le recuerdo que para poder utilizar Collections DEBE implementar Comparable, es decir, definir un método
Código:
public int compareTo(Object o)
que compara dos objetos del mismo tipo y retorna negativo si el objeto es menor al que llega como parámetro, 0 si es igual y positivo si es mayor. Vea el A.P.I. de la interface Comparable para más información.
 

llunoll

Lanero Activo
Se unió
25 Nov 2008
Mensajes
1
ya pasaron 3 años y problamente no sigan como usuarios, pero yo andaba buscando algo parecido a esto, en realidad busco implementar un mapa de mi ciudad y que el usuario marque un punto de partida hasta otro punto de destino y el el resultado se represente en el mapa y al costado el listado de calles.
podria ser que si lo pudieron hacer lo compartan conmigo al codigo? gracias!
 
Arriba