Programa complejo en java

JPval

Lanero Reconocido
25 Ago 2004
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.
 
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 ?????
 
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.
 
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.
 
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.
 
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
 
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
 
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.
 
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?)
 
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.
 
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.
 
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 ;-)
 
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.
 
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.
 
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!
 

Los últimos temas