Implementación de Grafos Ponderados, haciendo uso de Programación Orientado a Objetos (POO), que en esta oportunidad se realizó bajo la plataforma de Java, y usando NetBeans como entorno de desarrollo.
1. UNIVERSIDAD NACIONAL EXPERIMENTAL DE GUAYANA
VICERRECTORADO ACADEMICO
COORDINACIÓN GENERAL DE INVESTIGACIÓN Y POSTGRADO
MAESTRÍA EN TECNOLOGÍAS DE LA INFORMACIÓN
GRAFOS PONDERADOS
IMPLEMENTACIÓN
Profesor:
GUEVARA, Carlos
Realizado por
APONTE, Marcel – C.I. 15.372.122
CORTEZ, Ramón – C.I. 15.633.653
HERNANDEZ, Yonel – C.I. 18.948.585
Ciudad Bolívar, Mayo 2015
2. 2
IMPLEMENTACIÓN
Con el fin de realizar la implementación de Grafos Ponderados, haciendo uso de
Programación Orientado a Objetos (POO), que en esta oportunidad se realizó bajo la
plataforma de Java, y usando NetBeans como entorno de desarrollo.
Haciendo uso de la programación orientada a objetos, se procedió a elaborar paquetes de
clases en donde se agrupo de acuerdo a lo siguiente:
Objetos: En este paquete (package), se definen las clases que se usarán como
base de la parte gráfica (Círculo, Coordenada, LíneaQuebrada) y de la implementación de
los grafos ponderados (Arista, Enlace, Grafo, ListaNodo, Nodo).
Operaciones: En este paquete (package), se definen las clases de ejecución de los
algoritmos de grafos ponderados a utilizar. En este caso, esquematizamos la
implementación del Algoritmo de Dijkstra y de las Ecuaciones de Bellman.
Ventana: En este paquete (package), se incluye una sola clase, la cual se encarga
de gestionar todos los eventos del ratón (mouse), y la interfaz del usuario con la
implementación.
DESCRIPCIÓN DE CLASES Y ESTRUCTURAS
Package Objetos
public class Arista: Representa las aristas del Grafo Ponderado, incluyendo el
Nombre, el Peso de la Arista, así como los datos que representa graficamente a la arista a
través del uso de la clase LineaQuebrada. Se incluyen métodos que permiten la
modificación y/o uso de los atributos de cada arista.
public class Arista{
private int idArista;
private String nombreArista;
private int peso;//Distancia
private LineaQuebrada lineaQuebrada; //Ésta es la via representada
graficamente
private boolean habilitado;
Constructor de la clase, con toda la información requerida.
public Arista(int idArista,String nombreArista,int peso){
this.idArista = idArista;
this.nombreArista = nombreArista;
this.peso = peso;
lineaQuebrada = null;
habilitado = true;
}
public class circulo: Clase para representar la información gráfica de cada vértice del grafo
ponderado (coordenadas, color, diámetro, etiqueta), así como los métodos para modificar u
3. 3
obtener los atributos de cada vértice; de igual manera, se incluyen los métodos que permiten
dibujar los círculos (vértices) que hacen uso de funciones básicas de Java para ello.
public class Circulo {
private Coordenadas coordenadas;
private Color color;
private int diametro;
private String etiqueta;
private Font fuente;
private int izquierda;
private int grosorBorde;
Constructor de la clase, con toda la información requerida.
public Circulo(Coordenadas coordenadas){
this.coordenadas = coordenadas;
color = Color.yellow;
diametro = 10;
etiqueta = "";
fuente = null;
izquierda = 0;
grosorBorde = 2;
}
Método para el dibujo de cada círculo haciendo uso de las funciones de Java para
ello.
public void dibujarCirculo(Graphics g){
if(coordenadas.size() > 0){
((Graphics2D)g).setColor(color);
((Graphics2D)g).setStroke(new BasicStroke(getGrosorBorde()));
((Graphics2D)g).fillOval(coordenadas.get(0)[0],coordenadas.get(0)[1],diametro,diametro);
((Graphics2D)g).setColor(Color.black);
((Graphics2D)g).drawOval(coordenadas.get(0)[0],coordenadas.get(0)[1],diametro,diametro);
if(!"".equals(etiqueta)){
if(fuente != null){
g.setFont(fuente);
}
((Graphics2D)g).drawString(etiqueta,coordenadas.get(0)[0] -
(izquierda),coordenadas.get(0)[1]);
((Graphics2D)g).setRenderingHint(RenderingHints.KEY_ANTIALIASING,
RenderingHints.VALUE_ANTIALIAS_ON);
}
}
else{
System.out.println("No hay coordenadas para el circulo");
}
}
4. 4
public class Coordenadas: Esta clase hereda de la clase ArrayList (de Java), en donde se
almacenan las coordenadas en números enteros, y que dicha clase se usa en la clase Círculo.
public class Coordenadas extends ArrayList < int[] >{
private int xMaxima;
private int yMaxima;
Constructores de la clase coordenadas, recibiendo varios parámetros.
public Coordenadas(int xMaxima, int yMaxima){
super();
this.xMaxima = xMaxima;
this.yMaxima = yMaxima;
}
public Coordenadas(int xMaxima, int yMaxima,int x, int y){
super();
this.xMaxima = xMaxima;
this.yMaxima = yMaxima;
addCoordenada(x,y);
}
public void addCoordenada(int x, int y){
if(x >= 0 && x <= xMaxima && y >= 0 && y <= yMaxima){
int[] parXY = {x, y};
add(parXY);
}
}
public class Enlace: Representa la unión entre la arista y el nodo, para la
implementación de los grafos ponderados. Hace uso en sus atributos de un objeto de la
clase Arista, y un objeto de la clase Nodo.
public class Enlace{
private Arista arista;
private Nodo nodo;
public Enlace(){
this(new Arista(),new Nodo());
}
public Enlace(Arista arista,Nodo nodo){
this.arista = arista;
this.nodo = nodo;
}
public class Grafo: Clase principal de la implementación de los grafos
ponderados realizadas, donde incluye como atributo un ArrayList de Nodos (clase Nodo).
Este ArrayList es un estructura de datos dinámica que permite almacenar datos en
memoria de forma similar a los arreglos, con la ventaja de que el número de elementos
que almacena, lo hace de forma dinámica, es decir, que no es necesario declarar su
tamaño como pasa con los arreglos.
5. 5
public class Grafo{
private ArrayList<Nodo> listaNodo;
Constructor de la clase Grafo, en donde se crea un nuevo ArrayList.
public Grafo(){
listaNodo = new ArrayList<Nodo>();
}
Método de adjuntar nodo al Grafo, en donde se recibe un nodo y se añade al
ArrayList del grafo. En esta clase se van almacenando todos y cada uno de los nodos.
public boolean adjuntarNodo(Nodo nodo){
Nodo nodoTemp = buscarNodo(nodo.getDato());
if(nodoTemp == null){
listaNodo.add(nodo);
return true;
}
else{
return false;
}
}
En esta clase, se encuentran los metodos para: crear enlaces (añadiendo
nodos adyacentes a un nodo dado), buscar nodo (buscar nodo en el grafo),
obtener adyacentes (getAdyacentes) (para obtener una lista de los nodos adyacentes al
nodo dado), es adyacente (isAdyacente) (recibe dos nodos y retorna si son o no
adyacentes), y así otros métodos para eliminar aristas, nodos, enlaces.
public class LineaQuebrada: En esta clase se tiene toda la información gráfica
de las aristas del grafo ponderado, y de igual manera incluye los métodos para modificar
y/o asignar las aristas del grafo ponderado.
public class LineaQuebrada {
private Coordenadas coordenadas;
private Color color;
private float grosorLinea;
private String etiqueta;
private int longitud;
private boolean mostrarEtiqueta;
Constructor de la clase LineaQuebrada, en donde por defecto el constructor recibe
como atributo las coordenadas de la línea quebrada, representada a través de la un
objeto de la clase Coordenadas.
public LineaQuebrada(Coordenadas coordenadas){
this.coordenadas = coordenadas;
grosorLinea = 1f;
color = Color.black;
mostrarEtiqueta = true;
}
6. 6
Método para hacer uso de las funciones gráficas de Java para dibujar la
línea de acuerdo a los atributos (coordenadas, color) del objeto que se desee
dibujar.
public void dibujarLineaQuebrada(Graphics g, boolean dirigido){
((Graphics2D)g).setColor(getColor());
((Graphics2D)g).setRenderingHint(RenderingHints.KEY_ANTIALIASING,
RenderingHints.VALUE_ANTIALIAS_ON);
BasicStroke stroke = new BasicStroke(grosorLinea);
((Graphics2D)g).setStroke(stroke);
if(coordenadas != null){
int []aux = new int[0];
for(int i = 0; i < coordenadas.size(); i++){
aux = coordenadas.get(i);
if(i == 0){
((Graphics2D)g).drawLine(aux[0],aux[1],aux[0],aux[1]);
}
else{
if (dirigido){
drawArrow(g,coordenadas.get(i - 1)[0],coordenadas.get(i -
1)[1],aux[0],aux[1]);
}
else{
((Graphics2D)g).drawLine(coordenadas.get(i -
1)[0],coordenadas.get(i - 1)[1],aux[0],aux[1]);
}
}
}
if(mostrarEtiqueta){
((Graphics2D)g).setColor(Color.blue);
Font fuente=new Font("Monospaced",Font.BOLD, 12);
g.setFont(fuente);
if(coordenadas.size() == 2){
int xMenor =
menor(coordenadas.get(0)[0],coordenadas.get(1)[0]);
int yMenor =
menor(coordenadas.get(0)[1],coordenadas.get(1)[1]);
int xMayor =
mayor(coordenadas.get(0)[0],coordenadas.get(1)[0]);
int yMayor =
mayor(coordenadas.get(0)[1],coordenadas.get(1)[1]);
int distanciaVertical = yMayor - yMenor;
int distanciaHorizontal = xMayor - xMenor;
((Graphics2D)g).drawString(longitud+"",(distanciaHorizontal/2) +
xMenor,(distanciaVertical/2) + yMenor);
}
else{
int pos = coordenadas.size() / 2;
((Graphics2D)g).drawString(longitud+"",coordenadas.get(pos)[0]+3,coordenadas.get(pos)[1
]-8);
}
7. 7
}
}
stroke = new BasicStroke(1);
((Graphics2D)g).setStroke(stroke);
}
public class ListaNodo: Clase que hereda de la clase de Java ArrayList, usado
como parte de la implementación de los grafos ponderados.
public class ListaNodo extends ArrayList<Nodo>{
public ListaNodo(){
super();
}
public class Nodo: Representa cada vértice o nodo del grafo ponderado, en
donde se almacena el dato de cada uno, así como un ArrayList de Enlace con los nodos
adyacentes,
public class Nodo{
private Object dato;
private ArrayList<Enlace> listaNodoAdyacente;
private boolean visitado = false;
private Circulo circulo;
private int izquierda;
Constructores de la clase Nodo, con la información del nodo y las
coordenadas del mismo.
public Nodo(){
this.dato = new Object();
circulo = null;
izquierda = 0;
}
public Nodo(Object dato,Coordenadas coordenada){
this.dato = dato;
listaNodoAdyacente = new ArrayList<Enlace>();
circulo = new Circulo(coordenada);
circulo.setIzquierda(izquierda);
}
Package Operaciones
Package Ventana