You are on page 1of 39

Analisis y automatizacion del algoritmo de Edmonds

para el problema de asignacion


Defez,J.L.
(a)
; Jordan,C.
(b)
(a)
Ingeniero en Informatica por la U.P.V,
Dimension Informatica, S.L.,
Valencia
jorge defez@hotmail.com
(b)
Departamento de Matematica Aplicada,
Universidad Politecnica de Valencia,
Valencia
cjordan@mat.upv.es
Resumen. En este trabajo presentamos una implementacion en Java del algo-
ritmo de Edmonds para la obtencion del acoplamiento maximo de maximo peso,
deniendo un interfaz amigable que nos permitira resolver facilmente problemas
de asignacion. Como aplicacion, implementamos tambien el algoritmo del cartero
chino.
Palabras clave. Grafos, acoplamiento, problema de asignacion, problema del
cartero, Edmonds.
1. Introduccion
El eje principal de este trabajo lo constituye la implementacion del al-
goritmo de Edmonds para resolver problemas de asignacion. El estudio de
problemas de asignacion cuando el grafo que modeliza el problema no es
necesariamente bipartido es de utilidad en dos vertientes, una practica y
otra teorica. En la vertiente practica encontramos los propios problemas
de asignacion, as como ser basico para la resolucion de otros importantes
problemas de la teora de grafos: el problema del cartero chino, determi-
nacion de la cadena mas corta en un grafo no dirigido, etc. Su interes teorico
proviene de la conexion con una clase de programas en programacion lineal
con variables enteras que pueden ser resueltos con un algoritmo polinomial.
Dado lo costoso de resolver manualmente tanto los problemas de asignacion
como los de cartero chino, siendo muy complicada la implementacion del
1
algoritmo de Edmonds, y puesto que en general solo se encuentran desar-
rollos literariosdel algoritmo, nos ha parecido necesario analizar y llevar
a cabo dicha implementacion, siendo nuestro objetivo principal crear una
aplicacion que nos lleve de forma sencilla y rapida a la solucion. Destacamos
que para llevar a buen termino la implementacion mencionada, dada la
complejidad del algoritmo, es imprescindible no solo un buen conocimiento
del algoritmo en s, sino un profundo analisis que nos permita elegir las
estructuras de datos mas adecuadas.
A n de centrar el problema para su estudio recordamos que el problema
de la asignacion consiste basicamente en, dado un grafo no dirigido, G =
(V, E), encontrar un acoplamiento M maximo (ver [1],[6]). Si ademas cada
uno de los pares (x, y) de E tiene asociado un peso, p
xy
, se pretende que
el peso total sea el maximo de los posibles. En el analisis del problema se
distingue entre conjuntos V en los que existe una biparticion (X, Y ), tal
que si (x, y) E entonces x X y y Y , y aquellos en los que no es
posible establecer dicha biparticion. As, por ejemplo, un primer problema
de asignacion consistira en, dado un conjunto de trabajos y un conjunto
de trabajadores y sabiendo que trabajador sabe realizar y en que medida
cada uno de los trabajos, determinar una asignacion trabajador-trabajo de
manera que la satisfaccion global sea maxima. Un ejemplo del caso mas
general podra ser establecer parejas para llevar a cabo un trabajo en un
cierto colectivo a partir de datos que reejen las compatibilidades de los
miembros del grupo. El algoritmo que ocupa nuestra atencion proporciona
el acoplamiento optimo si este existe. Destacamos que, dado que en muchas
ocasiones es mejor una solucion aproximada que no disponer de solucion
alguna, al implementarlo hemos modicado el nal, para que en caso de no
existir acoplamiento optimo, nos proporcione un acoplamiento maximo de
maximo peso.
Otro problema en el que el algoritmo de Edmonds juega un papel im-
portante es el conocido como problema del cartero chino. Su formulacion
general consiste en dise nar un ruta lo mas corta posible para un cartero
que, saliendo de la central de correos, debe repartir la correspondencia por
una serie de calles y volver a la central, habiendo calculado previamente el
tiempo necesario para cada calle.
En la segunda seccion de este trabajo introducimos los conceptos basicos
que nos conduciran a nuestro objetivo. En la tercera y cuarta comentamos
el dise no llevado a cabo, la codicacion e implementacion. En la ultima sec-
cion presentamos otras posibilidades de la aplicacion, tanto actuales como
futuras.
2
2. Grafos
Se llama grafo no dirigido a todo par de conjuntos G = (V, E), tal que
V = y E es un subconjunto de pares no ordenados de elementos de V . Los
elementos de V reciben el nombre de vertices, mientras que los elementos de
E se denominan aristas. Si (x, y) E es tal que x = y se denomina bucle.
Dos aristas se dicen adyacentes si tienen un extremo com un. Decimos que
un subconjunto M de E es un acoplamiento de G si no contiene bucles
y dos aristas cualesquiera de M no son adyacentes. Un vertice x V es
saturado si es extremo de alguna de las aristas de M. Un acoplamiento
M se dice maximo si no existe ning un otro acoplamiento en G con mayor
cardinalidad que M; se dice que es perfecto si todos los vertices del grafo
son M-saturados. En el caso de que G sea ponderado se llama acoplamiento
optimo a todo acoplamiento perfecto de maximo peso.
Una estructura basica en la b usqueda de acoplamientos maximos es
la llamada camino M-incrementable, es decir, camino de extremos M-
insaturados en el que las aristas pertenecen alternativamente a M y a
EM. Es conocido que en un grafo no dirigido, un acoplamiento es maximo
si y solo si no existen caminos M-incrementables, (ver [1],[6]). La b usqueda
de posibles caminos M-incrementables se estructura a partir del concep-
to de arbol M-alternado. Se dice que un arbol T en el que se ha denido
un acoplamiento M, es un arbol M-alternado si verica que existe en T
un vertice no M-insaturado al que llamamos raz, todos los caminos con
extremos en la raz son M-alternados y todos los caminos maximales con
extremo inicial la raz tienen cardinalidad par. Se llama vertices interiores
del arbol M-alternado T a aquellos vertices que ocupen una posicion par
en el camino desde la raz, siendo vertices exteriores los que ocupan una
posicion impar. Los vertices interiores los etiquetamos I y los exteriores
los etiquetamos E. El algoritmo de Edmonds va reduciendo el problema a
grafos mas sencillos hasta encontrar una solucion en uno de estos grafos. A
partir de esta retrocede, haciendo uso de datos anteriormente guardados,
hasta proporcionar una solucion del problema original. En el proceso de
reduccion es basico el concepto de oracion y contraccion de una oracion,
que nos permitira trabajar con un grafo con un n umero menor de vertices.
Se llama oracion respecto a un acoplamiento M de un grafo G a todo
ciclo impar en el que todos los vertices menos uno son M-saturados por
aristas del propio ciclo. Enlazando con los arboles M-alternados, dado un
grafo G con un acoplamiento M, se dice que un arbol M-alternado T ha o-
recido si existe una arista de G que une dos vertices exteriores de T. En ese
momento se realizara el proceso de contraccion de la oracion, entendiendo
3
por contraer una oracion sustituirla por un pseudonodo o nodo cticio, de
manera que las aristas antes incidentes en sus nodos seran incidentes en el
pseudonodo del nuevo grafo.
Una simplicacion de otro tipo es la relativa a buscar un acoplamiento
maximo en lugar de un acoplamiento maximo de maximo peso, es decir,
trabajar sin tener en cuenta los pesos. Se hace uso aqu de conceptos provi-
nentes de la programacion lineal. As, por ejemplo, si G es un grafo ponder-
ado con pesos p(x, y) para cada arista (x, y), llamamos etiquetado admisible
a toda aplicacion l de V en , tal que a cada vertice le asocia un valor que
verica que si (x, y) E entonces l(x) +l(y) p(x, y). Dado un etiquetado
admisible l en G llamamos grafo igualdad de G asociado a l, G
l
, al subgrafo
de G cuyo conjunto de vertices es V y el conjunto de aristas esta consti-
tuido por aquellas aristas (x, y) tal que l(x) + l(y) = p(x, y). Como todo
acoplamiento perfecto en un grafo igualdad G
l
es optimo en G, (ver [1],[6]),
el problema se reduce a la b usqueda de un acoplamiento perfecto en G
l
, sin
tener ya en cuenta los pesos. Una buena eleccion del etiquetado admisible
simplica la b usqueda del acoplamiento. Con este n hemos implementado
proceso de cambio de etiquetado, que denido a partir del habitualmente
utilizado, proporciona un mejor grafo igualdad y por tanto una mas rapida
solucion. El proceso comienza seleccionando un acoplamiento M en el grafo
igualdad. Se hace crecer un arbol M-alternado a partir de los vertices que,
no estando en el arbol, sean adyacentes a vertices etiquetados E del arbol.
Cuando este tipo de vertices no existe tenemos lo que se conoce como arbol
h ungaro, T, y es necesario cambiar el etiquetado y generar un nuevo grafo
igualdad.
Sea G
1
= (V
1
, E
1
) el grafo igualdad asociado al etiquetado admis-
ible . El cambio de etiquetado necesita en primer lugar la denicion
de tres conjuntos de aristas: C = {(v
i
, v
j
) E (v
i
, v
j
) E
1
}, C
1
=
{(v
i
, v
j
) C tal que v
i
T (etiquetado E) v
j
E
1
} y C
2
= {(v
i
, v
j
)
C tal que v
i
, v
j
T (etiquetado E}.
El proceso de calculo de los valores de los parametros que controlaran
el cambio de etiquetado se especica a continuacion:

1
= min
(v,v

)C
1
[(v) +(v

) p(v v

)]

2
= 1/2(min
(v,v

)C
2
[(v) +(v

) p(v v

)])

3
= 1/2(min{
r
tal que S
r
esta etiquetada I en el arbol})
= min{
1
,
2
,
3
}
4
El valor de determina los pasos a seguir. As si = nf algunas
versiones del algoritmo pasaran a ejecutar el proceso de nalizacion, ter-
minando sin mas. En la implementacion que presentamos se desea hallar un
acoplamiento optimo o, en su defecto, un acoplamiento maximo de maximo
peso para lo que se completara el grafo G

con aristas cticias de peso muy


negativo, lo que tiene como consecuencia que el algoritmo algoritmo las
deseche si existe un acoplamiento que no las utilice.
En el caso de que =
3
se expande la oracion que genero el
3
.
En cualquier otro caso se cambia el etiquetado del grafo en la forma que se
detalla a continuacion.
Vertice v etiquetado E: (v) := (v)
Vertice v etiquetado I: (v) := (v) +
Floracion etiquetada E:
r
:=
r
+ 2
Floracion etiquetada I:
r
:=
r
2
Todos los nodos y pseudonodos que no estaban contenidos en T conser-
van su etiqueta anterior. Ademas, se verica siempre que el nuevo etique-
tado es admisible. La gura 1 recoge el diagrama, utilizado en el dise no de
esta implementacion, del algoritmo que estamos analizando.
Como aplicacion directa de este algoritmo tenemos la resolucion del
problema conocido como del cartero chino, consistente en localizar una
cadena cerrada de peso mnimo que atraviese todas las aristas al menos
una vez. Los conocidos algoritmos de Fleury, para la localizacion de un
ciclo euleriano en un grafo no dirigido, y el de Dijkstra, para la obtencion
del camino de mnimo peso de un vertice u a un vertice v en un grafo
ponderado positivo, son necesarios tambien para encontrar una solucion
en el problema del cartero. Podemos analizar este algoritmo siguiendo el
diagrama utilizado, representado en la gura 2.
3. Dise no de la aplicacion
El dise no va a ser dirigido hacia conseguir una aplicacion que, ademas
de resolver problemas de asignacion y el problema de cartero chino permita
en un futuro incluir nuevos algoritmos sobre la plataforma. A la luz de estos
objetivos, resulta de tanta importancia el dise no de las estructuras de la
teora de grafos como el de elementos algortmicos o de interfaz.
5
Figura 1: Diagrama del algoritmo de Edmonds
6
Figura 2: Diagrama del algoritmo del problema del cartero chino
7
En el diagrama del dise no se va a emplear el diagrama de clases de la
metodologa UML, en la que se muestra una version estatica de la apli-
cacion, detallando las clases a implementar, los atributos y metodos de
cada una de ellas, as como las relaciones de inclusion y herencia. De esta
forma el diagrama de clases es un proceso idoneo para pasar del analisis del
algoritmo al dise no de la aplicacion.
Para su representacion consideraremos el diagrama de clases dividido
en tres bloques. El primero de ellos representa las distintas estructuras
de grafos y las relaciones existentes entre ellas, el segundo se centra en
la parte algortmica del problema mientras que el tercero trata las clases
correspondientes al dise no de la interfaz.
Antes de comenzar conviene dar alg un detalle del paradigma de pro-
gramacion orientado a objetos. A diferencia del modo de programacion
imperativo, donde el programa se construa empleando algoritmos y las es-
tructuras de datos necesarias, en la programacion orientada a objetos los
programas se crean empleando clases, las clases son patrones de objetos a
los que se denen unos atributos y unos metodos. As pues, para una clase
coche se podra denir atributos color y marca, y los metodos arrancar,
acelerar, adelantar. Un objeto en este ejemplo podra ser un coche Opel
azul, el cual podra arrancar, acelerar y adelantar.
3.1. Clases estructurales
En esta seccion se presenta el diagrama de clases, ver gura 3, que
representa la parte estatica de la aplicacion relacionada con la teora de
grafos y se detalla para estas clases el uso de sus atributos y metodos.
Clase Nodo Un nodo tiene un nombre que lo identica y, dado el caracter
visual de la aplicacion, debe tener un atributo posicion. La clase Nodo
no tiene metodos ya que un nodo por separado, es decir fuera del contexto
del grafo, no tiene propiedades.
Clase NodoEdmonds Es una especializacion de la clase Nodo, los nodos
de tipo Edmonds a naden a las propiedades de un nodo todas aquellas car-
actersticas necesarias para que el algoritmo de Edmonds pueda ejecutarse
sobre un grafo. De un NodoEdmonds podemos saber si esta contenido en
una oracion y, en caso armativo, en que oracion concreta se encuentra
contrado. Tambien podemos etiquetar al nodo dentro de una estructura de
tipo arbol alternado.
8
Figura 3: Diagrama de clases estructurales
9
Clase Floracion Una oracion es un tipo particular de NodoEdmonds,
con las particularidades de que un objeto oracion es un pseudonodo (no es
un nodo real) y que contiene un listado de nodos. El campo cicloContraido
almacena estos nodos, siendo importante, no solo el contenido del campo,
sino tambien el orden en el que se hace referencia a los nodos en el vector.
Este orden debe corresponderse con el de los nodos en el ciclo, siendo in-
diferente del primer nodo y la direccion de giro escogida para completar el
ciclo. Al expandir la oracion se perfeccionara el acoplamiento teniendo en
cuenta este orden. Para ilustrar mejor esta idea se muestra un ejemplo.
Figura 4: Ciclo que da lugar a oracion
cicloContrado correcto
v
1
v
4
v
6
v
5
v
3
v
5
v
6
v
4
v
1
v
3
v
6
v
5
v
3
v
1
v
4
cicloContrado incorrecto
v
4
v
5
v
6
v
1
v
3
v
6
v
1
v
3
v
4
v
5
Clase Arista Incluye informacion sobre los nodos en que incide, pero por
si sola carece de metodos. Las aristas ademas tienen atributos para registar
su peso y su multiplicidad (cantidad de aristas que hay entre el nodoCabeza
y el nodoCola).
Clase Grafo Esta formado por dos listados, uno de nodos y otro de
aristas. Dentro de un Grafo teniendo una Arista con nodoCabeza = x y
10
nodoCola = y, dicha arista une los nodos que estan en la posicion x e y de
la lista Nodos.
Figura 5: Ejemplo de objeto de la clase Grafo y su representacion graca
En cuanto a los metodos que debe implementar el grafo podemos di-
vidirlos en tres grupos: los metodos destinados a mantener el conjunto de
nodos y de aristas, los metodos que ofrecen informacion sobre el grafo en
conjunto (es conexo?, cuantas componentes conexas tiene?, cual es el
grado de un determinado nodo?, etc.) y por ultimo, unos procedimientos
que denominaremos de Entrada/Salida, como son devolver el codigo del
grafo en los lenguajes XML y Mathematica.
Clase GrafoEdmonds Los grafos de tipo Edmonds son grafos especial-
mente dise nados para ser utilizados por el algoritmo de Edmonds. Con-
servan los atributos de los grafos con la variacion de que el vector nodos
contiene nodos de los tipos nodoEdmonds y Floracion. Ademas se a nade un
vector para las aristas del acoplamiento y unndice para se nalar a partir de
que posicion del vector de nodos se encuentran situadas las oraciones. Este
ndice permite por ejemplo gestionar la expansion de otras oraciones. Co-
mo en los grafos Edmonds los nodos y aristas pueden ser reales o cticios, se
han incluido dos atributos que controlaran estas situaciones, indicando las
posiciones a partir de las cuales los nodos y aristas son de tipo cticio. Se
incorporan a esta clase los metodos que act uan sobre los nuevos atributos.
Denimos ndice real de un nodo como la posicion en el vector de nodos de
la oracion mas externa que lo contiene. Este concepto se ha a nadido a n
11
de controlar la actividad de los nodos que estan contenidos en oraciones
m ultiples. Sin salir del contexto de la clase GrafoEdmonds resulta unndice
de utilidad a la hora de tratar el dibujado de aristas, ya que una arista que
incide en dos nodos con el mismo ndice real es una arista contenida dentro
de la oracion y por tanto no se dibuja.
El lector podra en este punto verse inclinado a pensar que no se re-
quieren metodos para estos trabajos sobre oraciones, puesto que una o-
racion conserva los nodos que estan contrados en su interior y ademas los
nodos conservan informacion sobre la oracion en la cual se encuentran
contenidos. De hecho un lector crtico llegara a pensar que se trata de in-
formacion duplicada (el nodo sabe en que oracion esta y la oracion sabe
que nodos contiene). Es de gran importancia en este punto del dise no de la
aplicacion recordar que las oraciones tambien pueden ser contradas dentro
de una oracion mayor. Veamos un ejemplo para una mayor claridad.
Supongamos que F
1
contrae los nodos v
0
, v
1
y v
2
, mientras que la o-
racion F
2
contrae v
3
, v
4
y F
1
. Si en este punto el campo cicloContraido de
F2 almacena la totalidad de nodos contenidos (es decir v
0
, v
1
, v
2
, v
3
y v
4
),
sera obligatorio recordar en el campo oracion de los nodos v
0
, v
1
y v
2
que su oracion real es F
1
. Pero con este dise no se obliga a diferenciar, en
las operaciones de expansion de oraciones, cuales son los nodos que real-
mente estan contrados en la oracion que se expande y cuales pertenecen
a oraciones mas internas (F
1
), resultando un codigo mas oscuro. Por ello
el dise no opta por dada esta situacion que los nodos ya contrados en F
1
mantengan la referencia a F
1
siendo (v
3
, v
4
, F
1
) el ciclo contrado en F
2
.
Evidentemente el resto del dise no es consecuente con esta decision.
Un GrafoEdmonds tiene como metodo propio la generacion de etique-
tados admisibles. Se escribe a continuacion el pseudocodigo del algoritmo
propuesto para etiquetar y un ejemplo de uso del mismo.
etiquetarAdmisible (G)
Todos los nodos parten con etiqueta = 0;
Desde i=0 hasta tama no G.Nodos - 1
v = G.Nodos[i]
v.etiqueta= - innito
Para todas las aristas incidentes en v
//a= (v,vi) OR a=(vi,v)
nuevaEtiqueta=a.peso-vi.etiqueta
12
v.etiqueta=Maximo(v.etiqueta, nuevaEtiqueta)
FinPara
FinDesde
Veamos a continuacion un ejemplo de calculo de un etiquetado admisible
en un grafo G.
_

_
4 3
4 6
8 6 1
4 8 5 1
6 5 8
6 9 4
4 1 8 9
3 1 4
_

_
Figura 6: Grafo G y su matriz de pesos
Comenzamos a etiquetar por v
0
y se le asocia el peso maximo de las
aristas incidentes, es decir, v
0
.etiqueta = 4. Los adyacentes a v
1
no han
sido etiquetados todava por lo que la etiqueta de v
1
sera el maximo de los
pesos de las aristas incidentes con v
1
, es decir, v
1
.etiqueta = 6. El vertice
v
2
se encuentra en la misma situacion por lo que v
2
.etiqueta = 8. El caso
de v
3
es diferente, ya que en su lista de adyacentes aparecen nodos que ya
han sido etiquetados. Calculamos a continuacion la v
3
.etiqueta:
v
3
.etiqueta=maximo
_

_
peso(v
3
, v
1
) v
1
.etiqueta = 2
peso(v
3
, v
2
) v
2
.etiqueta = 0
peso(v
3
, v
4
) = 5
peso(v
3
, v
7
) = 1
_

_
= 5
Repetimos el proceso para anterior para conseguir los valores que se
13
adjudican a las etiquetas de los vertices v
4
, v
5
,v
6
y v
7
:
v
4
.etiqueta=maximo
_
_
_
peso(v
4
, v
2
) v
2
.etiqueta = 2
peso(v
4
, v
3
) v
3
.etiqueta = 0
peso(v
4
, v
6
) = 8
_
_
_
= 8
v
5
.etiqueta=maximo
_
_
_
peso(v
5
, v
1
) v
1
.etiqueta = 0
peso(v
5
, v
6
) = 9
peso(v
5
, v
7
) = 4
_
_
_
= 9
v
6
.etiqueta=maximo
_

_
peso(v
6
, v
0
) v
0
.etiqueta = 0
peso(v
6
, v
2
) v
2
.etiqueta = 7
peso(v
6
, v
4
) v
4
.etiqueta = 0
peso(v
6
, v
5
) v
5
.etiqueta = 0
_

_
= 0
v
7
.etiqueta=maximo
_
_
_
peso(v
7
, v
0
) v
1
.etiqueta = 1
peso(v
7
, v
3
) = 4
peso(v
7
, v
5
) = 5
_
_
_
= 1
Figura 7: Subgrafo igualdad asociado al etiquetado calculado
El metodo pondera por exceso los primeros nodos y luego ajusta las eti-
quetas de los ultimos nodos, produciendo subgrafos igualdad en los que las
primeras posiciones del vector de nodos estan desconectados o tienen grado
reducido. Esta observacion hara que al generar arboles alternados tomemos
como raz el ultimo nodo no saturado, pues aumentan las posibilidades de
encontrar adyacentes.
Realizando una nueva pasada del algoritmo de etiquetado nuevamente
al grafo se obtienen unos resultados que ajustan mas las etiquetas y generan
un subgrafo igualdad con mayor n umero de aristas.
v
1
.etiqueta=maximo
_
peso(v
1
, v
3
) v
3
.etiqueta = 1
peso(v
1
, v
5
) = 3
_
= 1
14
Los resultados de repetir el proceso de etiquetado sobre los nodos en el
grafo de ejemplo son: (v
0
.etiqueta, . . . , v
7
.etiqueta) =(4, 1, 3, 5, 8, 9, 0, 1),
etiquetado que origina el siguiente grafo igualdad,
Figura 8: Subgrafo igualdad asociado al nuevo etiquetado
Clase SubgrafoIgualdad Es una subclase del GrafoEdmonds. Conserva
el vector de Nodos, pero reparte las aristas del grafo en dos conjuntos, por
un lado el conjunto C y por otro el vector Aristas. Pertenecen a este vector
aquellas aristas a = (v
i
, v
j
) en las que se cumple que su peso es igual a la
suma de las etiquetas de los vertices en los que incide, excepto si la arista
esta contenida en una oracion, en cuyo caso el peso debe ser igual a las
sumas de las etiquetas de los vertices mas la etiqueta de la oracion mas
interna que la contiene.
Clase ArbolAlternado Es una especializacion de los grafos Edmonds,
ya que aparecen aristas del acoplamiento y oraciones; objetos que no se
encuentran en los grafos comunes. Los arboles alternados a naden dos con-
juntos, el E y el I. Estos conjuntos son listas de ndices que apuntan,
respectivamente, a los nodos exteriores e interiores del vector de nodos.
El arbol alternado contiene metodos que le permiten aumentar progresiva-
mente, buscando nodos adyacentes a los nodos etiquetados E. Para conocer
el nodo E que corresponde revisar se a nade unndice ultimoERevisado. Con
este ndice se controla ademas la situacion de arbol h ungaro. La inclusion
de un nuevo nodo E (I) supone en primer lugar su etiquetado arboreo in-
mediato como E (I) y su inclusion en el vector E (I) del arbol. Ademas,
si el nodo es una oracion, todos los nodos y oraciones contradas en el-
la se etiquetan como E (I) (pero no se a naden al vector E (I), ya que
15
solo pueden formar parte de este los nodos y oraciones que no estan den-
tro de oraciones). El etiquetado de los nodos contrados se realizara para
controlar los cambios de etiquetado. Tambien se han a nadido metodos de
retroceso desde un nodo a su nodo anterior en el arbol. De esta forma
podemos facilmente llegar de un nodo hasta la raz del arbol.
A n de entender la semantica de los metodos de retroceso consideramos
el arbol de la gura 9. Se inicia en el nodo v
11
.
Figura 9:

Arbol M-alternado
retrocesoDeEHastaI (v
11
) v
7
, retrocesoDeIHastaE (v
7
) v
4
, retroce-
soDeEHastaI (v
4
) v
2
, retrocesoDeIHastaE (v
2
) v
0
, retrocesoDeEHas-
taI (v
0
) No se encuentra ning un nodo.
De esta forma se ha conseguido generar un camino desde un nodo del
arbol a la raz del mismo. Estos metodos hallan caminos M-alternados y
en algunos casos M-incrementables.
En cuanto al proceso a seguir para asegurar la correccion del retroceso
se deduce practicamente del graco anterior. Debe cumplirse lo siguiente:
Retroceder desde un nodo E a un nodo I: Buscar una arista del acoplamien-
to que tenga un extremo en el nodo etiquetado E. El otro extremo
incide en el nodo I que buscamos. Si no se encuentra dicha arista el
nodo E es la raz del arbol.
Retroceder desde un nodo I a un nodo E: En este caso se busca una arista
que incida en el nodo I y que no pertenece al acoplamiento. El otro
nodo en que es incidente la arista es el nodo E buscado.
16
Figura 10: Diagrama de clases algortmicas
17
3.2. Clases algortmicas
Los algoritmos se dise nan como clases y no como metodos de la clase
Grafos. Esto nos permitira ejecutar los algoritmos por pasos o bien mostrar
solo el resultado. Ademas este dise no permite incluir mas algoritmos sin
necesidad de cambiar drasticamente el dise no de la parte estructural. En
base a lo expuesto anteriormente los algoritmos tienen el aspecto de un
hilo de ejecucion que realiza su tarea y termina devolviendo la informacion
que se considera necesaria a traves de la interfaz. En la gura 10 podemos
analizar la relacion entre las mencionadas clases.
Clase Algoritmo Es la clase de la que heredan todos los algoritmos. No
tiene ejecucion ya que es un algoritmo vaco, pero incorpora el compor-
tamiento de todos los algoritmos tanto en lo respectivo al estado del hilo,
como al siguiente paso que se debe realizar.
La mejor forma de observar este comportamiento es analizar los esta-
dos por los que pasa un algoritmo mediante un diagrama de transicion de
estados. Estos estados dependen del modo de ejecucion elegido, ya que un
algoritmo a ejecutar de forma continua debe avanzar sin suspenderse en
ning un momento. En la gura 11 se puede consultar el diagrama corres-
pondiente a la clase Algoritmo.
Figura 11: Diagrama de transicion de estados para la clase Algoritmo
El atributo estado se encarga de recordar cual es el siguiente paso que
debe darse en el algoritmo. Dividir el algoritmo en pasos de ejecucion per-
mite detenerlo en aquellos momentos en los que se considere que hay que
mostrar informacion relevante para el usuario.
18
El esqueleto de los metodos de ejecucion de los algoritmos tiene un
esquema del tipo que se muestra a continuacion.
Ejecutar()
Mientras (terminado() = falso & & suspendido() = falso)
Estado 0: iniciar();
codigo del estado;
estado = siguiente estado;
si (modo = POR PASOS) suspender();
Fin Estado 0;
Estado 1: codigo del estado;
estado = siguiente estado;
si (modo = POR PASOS) suspender();
Fin Estado 1;
. . .
Estado Final : escribir resultado();
terminar();
Fin Estado Final;
Fin Mientras;
Fin Ejecutar;
Edmonds El algoritmo de Edmonds requiere de un grafo de Edmonds
para trabajar, ademas durante sus pasos de ejecucion ira construyendo
arboles alternados y subgrafos igualdad. Para que sea posible este tipo de
ejecucion, el algoritmo se divide en bloques tomando como base el diagrama
1.
A continuacion, y debido a su complejidad, se detalla el dise no de alguno
de los pasos que han dado lugar a metodos de la clase Edmonds.
El metodo de perfeccionar un acoplamiento se lleva a cabo construyendo
el camino incrementable desde el nodo insaturado que se encontro hasta la
raz del arbol alternado. Para esto se usan los metodos de retroceso en el
arbol (descritos anteriormente). Una vez construido dicho camino el proceso
consiste en recorrerlo insertando en el acoplamiento las aristas que estan en
una posicion impar del camino y quitando del acoplamiento las que ocupan
una posicion par en el mismo.
La extension del arbol alternado se realiza conociendo el nodo E que
estamos revisando y su adyacente saturado no perteneciente al arbol. Esta
informacion se utiliza para derivar una correcta extension. En primer lugar
se debe a nadir al arbol el nodo saturado, que etiquetamos I, y junto a este
19
nodo se introduce tambien la arista que incide en el nodo E en revision
y en el nuevo nodo I. Para encontrar el nuevo nodo E se debe buscar la
arista del acoplamiento que satura el nodo I. Dicha arista tambien debe
ser a nadida al arbol; incide en dos nodos, uno de ellos es el ya conocido
nodo I, y el otro entra en el arbol como un nuevo nodo E, nalizando as la
operacion de extension.
La operacion de contraccion de una oracion tiene como principal factor
de complejidad el encontrar el ciclo que dio lugar a la oracion. Para ex-
poner el proceso que se lleva a cabo para encontrar dicho ciclo, conociendo
unicamente los dos nodos E que al unirse provocaron la contraccion, se va
a utilizar un ejemplo.
En la gura 9 se muestra un arbol alternado. En la fase de revision de
nodos exteriores se ha observado que el nodo v
10
tiene entre sus adyacentes
al nodo v
14
, que pertenece al arbol y esta etiquetado E. Esta situacion va
a provocar la contraccion de una oracion.
Figura 12:

Arbol M-alternado en el que se va a producir la contraccion de
una oracion
Se toma v
10
y se guarda en el ciclo contrado su retroceso hasta la raz:
(v
10
, v
6
, v
4
, v
2
, v
0
) Acto seguido vamos a hacer el retroceso desde el nodo
v
14
hasta encontrar un nodo que ya pertenezca al vector, en este caso v
4
.
Ademas en se colocan los nodos en el principio del vector conforme vayan
siendo a nadidos, desplazando hacia la derecha el resto de posiciones en cada
insercion: (v
8
, v
12
, v
3
, v
14
, v
10
, v
6
, v
4
, v
2
, v
0
) Para terminar debemos eliminar
los nodos que entraron por exceso en el primer retroceso. Esto se consigue
eliminando desde el nal del vector los nodos hasta llegar al nodo que
detuvo el retroceso anterior, v
4
: (v
8
, v
12
, v
13
, v
14
, v
10
, v
6
, v
4
)
Una vez conseguido el ciclo contrado se asigna el ndice de la nueva
20
oracion al campo oracion de todos los nodos pertenecientes al ciclo. A
continuacion se da nombre y posicion a la oracion, se etiqueta con E (lo
que a su vez etiqueta como E a todos los nodos que contiene) y se sit ua en
el arbol tan proximo a la raz como es posible, esto es en la posicion de v
4
.
Figura 13:

Arbol alternado de la gura 12 tras la contraccion de la oracion
La operacion contraria a la contraccion de oraciones es su expansion.

Esta puede tener lugar en dos momentos, bien al utilizar el valor de


3
para cambiar el etiquetado, o bien en la fase de terminacion del algoritmo.
En cualquiera de los dos casos estara saturada antes de expandirse.
Se expone ahora el proceso a seguir para expandir una oracion. Tomare-
mos para ello F
1
oracion contrada en el ejemplo anterior. Vamos a suponer
que se encuentra saturada por la arista (v, v
13
) del acoplamiento.
El primer paso consiste en encontrar dicha arista, que es la unica del
acoplamiento que cumple que uno de los nodos en los que incide esta dentro
de la oracion y el otro no. Una vez encontrado el nodo acoplado al exterior
reordenamos el ciclo contrado de forma que el nodo v
13
quede en primera
posicion: (v
13
, v
14
, v
10
, v
6
, v
4
, v
8
, v
12
). Una vez ordenado el vector se eligen
todos los nodos contenidos en el debiendo indicarse en sus campos oracion
que estos nodos ya no pertenecen a ninguna oracion.
Para terminar se construye el conjunto de aristas que constituye el
acoplamiento y el complementario. La arista entre el nodo inicial y nal
no pertenece al acoplamiento. La arista que incide en los nodos que ocupan
la posicion 0 y la posicion 1 del ciclo saldra del acoplamiento, entrando al
mismo la arista incidente en los vertices que ocupan las posiciones 1 y 2.
Se procede de esta forma alternando la exclusion e inclusion de aristas en
el acoplamiento hasta llegar al nal del mismo. En la gura 14 se muestra
el resultado nal de la expansion, incluyendo todos los nodos contenidos en
21
la oracion y tambien el nodo v, que estaba unido por una arista acoplada
a la oracion F
1
.
Figura 14: Expansion de la oracion contrada en la gura 13, aplicando
los supuestos detallados en el texto
Fleury El algoritmo de Fleury se aplica sobre grafos eulerianos. El algo-
ritmo construye otro grafo durante su proceso, el cual es una cadena que
contiene todas las aristas del grafo de entrada pasando una unica vez por
cada una de ellas.
Este algoritmo tiene una complejidad mucho mas baja que la de Ed-
monds , debido sobre todo a que, como se muestra a continuacion, el n umero
de estados es muy reducido y por lo tanto existen muchas menos fases de
decision sobre el ujo de estados del algoritmo.
ESTADO DESCRIPCI

ON
0 Se escoge un nodo inicial para el camino que vamos a
construir, dicho nodo se marca como seleccionado para
continuar el camino. Se pasa al estado 1.
1 Si el grafo no tiene aristas se pasa al estado 2. En caso
contrario se busca la siguiente arista que formara parte
del camino y se a nade al mismo. Se mantiene el estado.
2 Se recupera el grafo de trabajo inicial y se dibuja el ciclo
euleriano completo. Se termina el algoritmo.
Cuadro 1: Estados de ejecucion del algoritmo de Fleury
El unico proceso de cierta complejidad que se ha dise nado es el de
22
b usqueda de la arista que continua el ciclo euleriano. Consideramos, en el
estado actual del grafo, todas las aristas que inciden en el nodo selecciona-
do. Siempre debe existir al menos una ya que en caso contrario el grafo de
entrada no era euleriano. Cuando solo exista una arista esta sera selecciona-
da sin realizar ning un tipo de test. En caso de que mas de una arista incida
en el nodo, estas son sometidas a un examen que comprueba si alguna de
ellas es arista de corte. Para ello se hace una copia del grafo actual, se le
quita la arista que estamos considerando y en caso de que el nuevo grafo
tenga el mismo n umero de componentes conexas que el anterior la arista no
es de corte; en el supuesto de que la cardinalidad de componentes conexas
sea mayor en el nuevo grafo la arista es de corte. Los tests terminan tanto
cuando se encuentra una arista que no es de corte como cuando solo queda
una arista.
CarteroChino El algoritmo CarteroChino se ejecuta sobre una instancia
de Grafo, requiriendo la ejecucion de un algoritmo de Fleury y en algunos
casos de un algoritmo Edmonds y la utilizacion del metodo Dijkstra, im-
plementado en la clase Grafo. El dise no de la aplicacion permite que los
algoritmos anidados puedan ejecutarse por pasos cuando el algoritmo prin-
cipal se esta ejecutando por pasos. Los estados de ejecucion por los que
pasa un CarteroChino se muestran en la tabla 2.
Los metodos mas complejos de la clase CarteroChino se basan en la
utilizacion del metodo de Dijkstra (en la clase Grafo). El etiquetado de las
aristas mediante el algoritmo de Dijkstra consiste en aplicar sobre el grafo
original el algoritmo de Dijkstra a los nodos de grado impar hallados con
anterioridad. Por su parte la operacion de replica de un camino P se basa
tambien en el mencionado algoritmo; en este caso recibe la informacion de
los dos nodos que se encuentran en los extremos del camino P y se calcula
el resultado de Dijkstra entre ambos nodos. Para conocer el camino desde el
nodo nal al nodo inicio se emplea la informacion del campo predecesor, de
esta forma se conocen las aristas a replicar. Para esto solo hay que aumentar
en uno su multiplicidad.
La fase mas compleja de estos dos metodos es la conversion de ndices
entre el grafo de trabajo G y el grafo de Edmonds G

. Esta conversion
se realiza a traves de la informacion contenida en el vector de nodos de
grado impar. Para mostrar de forma clara esta conversion consideramos el
siguiente ejemplo.
23
ESTADO DESCRIPCI

ON
0 Se comprueba que el grafo es conexo, en caso armativo
se pasa al estado 1. En el caso contrario se informa de
que el grafo no es conexo y se termina el algoritmo.
1 Se genera el vector que contiene ndices a todos los nodos
de grado impar del grafo. Una vez construido el vector
se decide el siguiente estado en funcion del tama no del
mencionado vector. Si el tama no es mayor de dos se pasa
al estado 2, si son exactamente dos los nodos que forman
el vector, el estado siguiente es el 7. En caso de que el
vector se encuentre vaco se pasa al estado 8.
2 Se construye un grafo de Edmonds completo donde los
nodos son los que formaban el vector del estado anterior.
El siguiente estado es el 3.
3 Los pesos de las aristas del grafo de Edmonds se eval uan
utilizando el algoritmo de Dijkstra. Se pasa al estado 4.
4 Se ejecuta el algoritmo de Edmonds. El control de estados
pasa a este algoritmo. Una vez terminado el algoritmo de
Edmonds se crea un vector que contendra las aristas del
acoplamiento y se pasa al estado 5.
5 Si el vector de aristas esta vaco se pasa al estado 8. En
otro caso se toma una de las aristas del vector y se pasa
al estado 6.
6 Se busca mediante Dijkstra en G el camino de menor peso
entre los vertices en los que incide la arista seleccionada.
Dicha arista se elimina del vector. Se replica cada una de
las aristas que forman el camino encontrado. Se vuelve al
estado 5.
7 Repetimos las aristas que constituyen el camino de mni-
mo peso entre los dos unicos nodos de grado impar del
grafo. Se pasa al estado 8.
8 Se ejecuta el algoritmo de Fleury, en el mismo modo que
se esta ejecutando el algoritmo del Cartero Chino. Se pasa
al estado 9.
9 Para nalizar se escribe el resultado del algoritmo y se
indica que este ha terminado.
Cuadro 2: Estados de ejecucion del cartero chino
24
Figura 15: Grafo G
En G hay cuatro nodos de grado impar, de forma que el vector Nodos
y el vector Nodos de grado impar tienen los valores:
Nodos (v
0
, v
1
, v
2
, v
3
, v
4
, v
5
, v
6
, v
7
, v
8
, v
9
, v
10
, v
11
, v
12
)
Nodos de grado impar (v
3
, v
9
, v
11
, v
12
)
De este grafo G, tras pasar por los estados 2 y 3, se deriva el siguiente
grafo G

:
Figura 16: Grafo G

Cuando se calcula el acoplamiento perfecto de peso mnimo sobre el


grafo G

, el resultado es (v

3
, v

9
), (v

11
, v

12
). La conversion de los vertices de
la arista (v

3
, v

9
) en G

a vertices en G para la ejecucion del replicado de


caminos entre v
3
y v
9
resulta bastante intuitiva.
El nodo de Edmonds v

3
ocupa la posicion cero de su vector de nodos,
esto nos lleva a comprobar el valor del vector de nodos de grado impar
25
en identica posicion. El valor es 3. Esto nos lleva hasta la posicion tres
de G.nodos, donde efectivamente se encuentra v

3
. Haciendo esta sencilla
conversion en el caso de v

9
, v

11
y v

12
se alcanza tambien respectivamente
los nodos v
9
, v
11
, v
12
. As pues, para crear un grafo euleriano a partir de
G, se replican los caminos mas cortos entre v
3
yv
9
, y entre v
11
y v
12
. La
solucion se obtendra aplicando Fleury a este nuevo grafo.
3.3. Clases interfaz
El ultimo grupo de clases son las de interfaz.

Estas son las que relacionan
los grafos con los algoritmos que se van a aplicar y a su vez establecen la
comunicacion con el usuario. En la gura 17 podemos analizar el diagrama
correspondiente.
El lenguaje Java nos ofrece una gran gama de elementos visuales estandar
para dise nar la interfaz de la aplicacion, por ello en esta parte del dise no
nos acercamos un poco mas a la codicacion en un lenguaje concreto.
PanelGrafos El panel de grafos es el JPanel del que heredan todos aque-
llos paneles que contienen y representan de forma graca los grafos. Estos
paneles son comparables a pizarras en las que el usuario ve dibujado el
grafo correspondiente. Incluye algunos metodos destinados al calculo de
distancias que resultan utiles a la hora de mover nodos, colocar nuevas es-
tructuras o seleccionar algunas de las que ya existen. Todos estos metodos
no son utilizados directamente en esta clase, pero dado su caracter generi-
co se han colocado en la clase superior de la jerarqua a n de que en
futuras ampliaciones estos metodos se encuentren ya disponibles para otras
subclases.
En cuanto a la representacion de los grafos esta debe ser capaz de apor-
tar al usuario la informacion deseada. Tal y como se puede apreciar en el
diagrama de clases estructurales cada elemento tiene su propio metodo de
dibujo. Desde esta clase se hara la llamada al metodo pintarGrafo() que en
funcion del tipo de grafo contenido aplicara el metodo de representacion
graca oportuno.
PanelGrafosDibujo Estos paneles sirven a la aplicacion de introducir
nuevos grafos. El usuario dibuja sobre el panel el grafo del problema que
desea resolver. Para ello el usuario tiene dos controles, por un lado el control
de operacion, que le permite elegir entre nodos y aristas, y por otro el
puntero del raton. La forma de dibujar un grafo es intuitiva: se selecciona
26
Figura 17: Diagrama de clases de interfaz
27
en primer lugar que es lo que queremos dibujar (nodos o aristas). En el
caso de los nodos, bastara con un clic del raton por nodo. En cuanto a
la representacion de una arista existen dos formas de hacerlo, la primera
consiste en pinchar una vez en cada uno de los nodos que conformaran los
extremos de las aristas, la segunda se realiza colocando el puntero sobre
el nodo inicial y manteniendo el boton del raton presionado hasta soltarlo
sobre el nodo nal de la arista, para que as queden unidos. Se permite
tambien desde este panel el borrado de aristas y nodos dibujados, el cambio
de nombre de los nodos y el cambio de peso de las aristas. En este caso se
utilizara el boton derecho del raton.
Los diagramas 18 y 19 muestran las fases por las que se pasa en la cons-
truccion de un grafo. Presentamos en primer lugar el diagrama de transicion
de estados del campo operacion.
Figura 18: DTE de la clase PanelGrafosDibujo
En la gura 19 podemos ver la estructura de control de ujo que sigue
el panel de dibujo para conocer la accion que debe realizar en funcion de la
operacion actual y las decisiones del usuario. Este control de ujo, que en
parte se ha detallado con anterioridad, se basa totalmente en la experiencia
y en las reacciones comunes de los usuarios de herramientas de dibujo.
28
Figura 19: Diagrama de ujo para un clic de raton sobre el PanelGrafos-
Dibujo
DialogoDibujoGrafos Es aquel desde el que se da soporte a las tareas
de dibujo antes mencionadas, ya que dentro de este dialogo se encuentra un
panel de dibujo de grafos. El campo operaciones del panel sera controlado
a traves de una botonera. Desde este dialogo tambien es posible cargar
grafos completos directamente sobre el panel, ejecutando la accion Dibujar
K Grafo, eliminar todo el dibujo realizado con un solo clic de raton, o
ver impreso el codigo Mathematica correspondiente al grafo que en ese
momento esta representado gracamente en el panel. La accion de guardar
el grafo se realizara tal y como se ha expuesto en el analisis mediante la
creacion de un archivo XML. La sintaxis XML asociada a un grafo sera la
siguiente:
Objeto nodo:
<nodo>
<nombre> v</nombre>
29
<posicion> (1,1) </posicion>
<nodo>
Objeto arista:
<arista>
<nodo1> 2</nodo1>
<nodo2> 4</nodo2>
<arista>
Objeto grafo:
<grafo>
<nodos>
objetos Nodo del grafo en XML
</nodos>
<aristas>
objetos Arista del grafo en XML
</aristas>
</grafo>
Figura 20: Dialogo de dibujo
30
El usuario de la aplicacion puede ver muy facilitada su labor al abrir
el dialogo de matriz de adyacencia. Al igual que el resto de ventanas y
dialogos, el dibujo de grafos ofrece la posibilidad de consultar la ayuda
sobre su correcto modo de utilizacion.
DialogoMatrizAdyacencia Este dialogo es bastante austero, presenta
la matriz de adyacencia del grafo que se encontraba representado gra-
camente en el panel del DialogoDibujoGrafos en el momento de abrirlo.
Ademas a nade una consulta de ayuda que puede dar al usuario una gua
sobre como utilizar la matriz de pesos que se le presenta. Al cerrarse, todos
los cambios que se han realizado sobre la matriz deben trasladarse al grafo
que se esta construyendo.
Acercandonos a la fase de codicacion comentar que la matriz de adya-
cencia se presentara en un formato similar a las hojas de calculo de Excel.
Para ello se apoya en la clase JTable de JAVA, aunque realizando sobre esta
varias modicaciones de comportamiento y apariencia. Las modicaciones
de apariencia estan destinadas al uso de la matriz de forma comoda. La
principal modicacion es la indexacion por las y columnas (en JAVA solo
tienen cabecera las columnas).
Al ser un grafo simple la matriz debe tener su diagonal principal a cero,
garantizando que no se creen aristas que unan un nodo consigo mismo. Esto
se consigue deshabilitando dichas celdas.
Por otro lado el ser un grafo no dirigido implica que la matriz es simetri-
ca, y esta simetra debe ser garantizada automaticamente. De esta forma
el usuario que quiera introducir una arista (v
i
, v
j
) con peso 4 solamente
tendra que modicar la posicion (i, j) de la matriz, o bien la posicion (j, i).
Figura 21: Dialogo de la matriz de adyacencia
Las modicaciones sobre la matriz de pesos no siempre suponen la
creacion de nuevas aristas. Es posible, con la misma simplicidad, cambiar
el peso de una arista ya existente. Y lo mismo es aplicable a la eliminacion
31
de aristas, accion que se realiza asignando cero al peso de dicha arista.
Las modicaciones a nivel de la matriz de adyacencia se aplican al grafo al
cerrar el dialogo.
VentanaEdmonds2 Las ventanas de Edmonds son el escenario sobre el
cual se aplica el algoritmo Edmonds a un objeto de la clase GrafoEdmonds.
En ella el usuario dispone de controles a traves de los cuales puede manejar
el grafo de entrada y el algoritmo. Sobre el grafo de entrada se ofrece la
posibilidad de abrirlo desde un archivo en el que se haya guardado un grafo
en formato XML, o bien dibujarlo, permitiendo combinar ambas opciones.
En cuanto al control del algoritmo se deja a eleccion del usuario el
modo de ejecucion y el acoplamiento que espera conseguir (maximo o mni-
mo peso). Cuando un usuario ha iniciado la ejecucion por pasos puede en
cualquier momento pasar directamente al resultado del algoritmo.
Los resultados en modo texto se pueden seleccionar pero no son modi-
cables. Si desea conservar el resultado nal este texto puede copiarse en
cualquier procesador de textos.
Figura 22: Ventana del algoritmo de Edmonds
32
VentanaCarteroChino De comportamiento general muy parecido al de
la clase anterior, la ventana de cartero chino ejecuta el algoritmo cartero
chino sobre un grafo de entrada. Las operaciones ofrecidas por esta ventana
son semanticamente las mismas que las de la clase VentanaEdmonds.
Sintacticamente este tipo de ventana varia en base al algoritmo que se
ejecuta. El algoritmo de CarteroChino ejecuta anidados los algoritmos de
Fleury y Edmonds.
El algoritmo del cartero chino ofrece al nalizar varios tipos de infor-
macion. En primer lugar muestra un grafo euleriano obtenido, a partir del
grafo de trabajo que se encontraba en el panel, por la repeticion de los
caminos mnimos. Por otro lado, en otro panel, se muestra el ciclo eule-
riano de forma lineal, y por ultimo proporciona tambien la informacion
textual correspondiente.
Figura 23: Ventana del algoritmo del cartero chino
4. Codicacion
La codicacion en Java del presente algoritmo esta guiada por el dise no
realizado anteriormente. Hay varios aspectos a destacar de la implementacion.
33
El ciclo de vida elegido fue el llamado clasico con prototipazo. Los prototi-
pos desarrollados se corresponden con las siguientes fases, desarrolladas de
forma incremental.
- Prototipo de aplicacion que permite el dibujado de grafo
- Prototipo que ejecuta el algoritmo de Edmonds
- Prototipo que permite ejecucion por pasos
- Prototipo que maneja entrada salida a traves de XML
- Prototipo que resuelve problemas de cartero chino
- Producto nal
A raz de la necesidad de crear una aplicacion conjunta se ha creado un
unico proyecto Java, lo que representa un unico archivo .jar, con punto de
entrada en la clase Main. Esta clase Main recibe un atributo que indica la
parte del proyecto que el usuario esta interesado en aplicar. Ademas en la
clase Main se adapta el Look&feelde la aplicacion al aspecto del sistema
operativo de la maquina sobre la que se interpreta el proyecto.
public class Main {
public Main() {
super();
}
public static void main(String[] args) {
try {
UIManager.setLookAndFeel
(UIManager.getSystemLookAndFeelClassName());
} catch (Exception e) {
JFrame.setDefaultLookAndFeelDecorated(true);
}
if (args[0].equalsIgnoreCase(C arteroChino))
new VentanaCarteroChino();
if (args[0].equalsIgnoreCase(Dibujo))
newDialogDibujoGrafos();
if (args[0].equalsIgnoreCase(.
Ed
monds2))
new VentanaEdmonds2();
}}
34
Siguiendo el principio de obtener una codicacion respetuosa con el
dise no se ha realizado una rigurosa organizacion de las clases en paquetes.
Los cuatro paquetes denidos agrupan las clases de acuerdo a los diagramas
de clase dise nados. El paquete grafos contiene las clases de tipo estructural y
una clase utilizada para el mantenimiento de los resultados de la aplicacion
de Dijkstra. El paquete algoritmos engloba las clases Edmonds, Fleury y
CarteroChino. El cuarto es el interfaz.

Este abarca todas las clases rela-
cionadas con la interfaz graca de usuario. Dentro de el se han creado otros
dos que contienen por un lado las clases relacionadas con el dialogo de ma-
triz de adyacencia y por otro todas las imagenes usadas para los botones
de la aplicacion. La ultima agrupacion de clases es el paquete

Util. Aqu se
colocan las clases abstractas (clase Algoritmo), la clase Main, y una clase
denominada Util. En la clase Util se implementan los metodos que son
utilizados por mas de una clase. Es el caso de los metodos de lectura de
archivos con grafos y tambien la escritura del codigo XML del grafo en un
archivo.
5. Lneas de trabajo futuras
Una de los objetivos que se plantearon al desarrollar el presente dise no
fue crear un producto ampliable. La principal ventaja que plantea este en-
foque continuista es que a partir de la base dise nada en este proyecto se
puede aumentar la aplicacion tanto en cantidad como en calidad. En canti-
dad puesto que la interfaz dise nada es totalmente reutilizable para concep-
tos como grafo dirigido o multigrafo. El dise no de clases para los menciona-
dos tipos de grafo, junto con las clases ya dise nadas, permitira codicar
mas algoritmos ofreciendo nuevos productos. La calidad se puede aumen-
tar mejorando caractersticas como la integracion con otras herramientas,
la fragmentacion del producto en capas, etc.
En relacion a posibles aplicaciones distintas de las ya conocidas pre-
sentamos la posibilidad de aplicar el algoritmo de de Edmonds al estudio
de fenomenos de campos tan alejados de los problemas de asignacion co-
mo la meteorologa o las resonancias magneticas a partir del analisis de
gradientes.
Vemos en primer lugar un ejemplo relativo a la metereologa. En la
siguiente tabla se muestran los valores de presion atmosferica en milibares
35
en diferentes puntos de una zona geograca rectangular.
920 920 920 920 920 921 921 918 917 914
920 920 920 921 920 923 922 919 919 915
920 920 921 921 922 923 924 924 924 924
920 920 920 922 923 925 925 924 925 924
920 921 924 924 926 926 928 928 930 931
920 920 927 927 930 930 933 933 930 930
914 914 919 919 919 924 929 929 929 929
En este sencillo experimento de presentacion se representa cada punto
donde se han realizado medidas como un vertice de un grafo. Cada vertice
estara unido a los vertices que lo rodean (superior, inferior, laterales y di-
agonales). Generamos as un grafo rejilla.
Figura 24: Grafo de rejilla que se va a utilizar
Se pondera cada arista (u, v) con el valor absoluto de la diferencia de
presion entre u y v, el valor del gradiente de presion. Si es nulo no se
genera dicha arista. El algoritmo de Edmonds aplicado a este grafo genera
el acoplamiento representado en la gura 25.
El siguiente experimento consiste en completar el grafo con aristas c-
ticias de peso 0 y ejecutar Edmonds sobre este nuevo grafo. Se realiza
una nueva prueba poniendo ponderando las aristas cticias con uno. Se
sigue aumentando el valor de las aristas cticias hasta que no entre en el
acoplamiento ninguna arista real. En cada iteracion de este proceso mar-
camos los nodos que quedan saturados por aristas reales. Al nal del pro-
ceso se indica, como se puede ver en la gura 26, cual era el peso, para
cada nodo, de las aristas cticias en la primera iteracion en la que el nodo
quedo insaturado al eliminar dichas aristas cticias.
36
Figura 25: Acoplamiento obtenido en el grafo anterior
Figura 26: Resultados de la experimentacion propuesta junto con el
acoplamiento anterior
Dado que la magnitud estudiada es la presion atmosferica se interpretan
los resultados como la direccion del viento (indicado por el dibujo de las
aristas del acoplamiento) y la fuerza del mismo (indicada por el n umero
en el nodo). Se observa que la interpretacion ciertamente no esta mal en-
caminada. De hecho gran cantidad de aristas del acoplamiento coinciden
completamente con la direccion del viento (indicada mediante echas), en
especial las aristas de mayor peso.
Para introducir ejemplos reales de magnitud importante y someterlos
a estudio se requiere buscar formas de crear un grafo de gran tama no,
ya que es impensable dibujar a mano, o escribir la matriz de un grafo,
que represente 10000 puntos, algo que por ejemplo sucede al codicar una
peque na imagen de 100x100 pxeles.
37
Gracias a la entrada / salida XML de la aplicacion se facilita en gran
medida la comunicacion de grandes bloques de datos. Pongamos como ejem-
plo una imagen medica de resonancia magnetica. Al digitalizar la imagen
se obtiene una matriz de pxeles de un determinado brillo. Para convertir
un grafo se creara un nodo por cada pxel y un pxel tendra arista con los
vertices que lo rodean. La transformacion imagen (de NxN pixeles) XML
se lleva a cabo de la siguiente manera:
Pixel en posicion(x, y) Brillo(x,y)=z
Brillo(x,y+1)=zw
< Nodo >
< Nombre > x.y < /Nombre > < Arista >
< Posicion > (x 10, y 10) < /Posicion > < Nodo1 > x N +y < /Nodo1 >
< /Nodo > < Nodo2 > x N + (y + 1) < /Nodo2 >
< Peso > |z w| < /Peso >
< /Arista >
De esta forma una vez convertida la imagen en un grafo se podra aplicar
Edmonds para hallar los gradientes y as segmentar la imagen, permitiendo
diferenciar distintos tipos de tejidos. Este tipo de proceso de imagen medica
basada en gradientes tambien podra por tanto ser una futura aplicacion
de Edmonds.
Referencias
[1] CHRISTOFIDES, N. Graph theory. An algorithmic approach. Aca-
demic Press, Inc, London, 1975.
[2] DEFEZ TOR

AN, J.L. Desarrollo de los algoritmos Edmonds 2 y


cartero chino con nes academicos. Proyecto nal de carrera, Facultad
de Informatica, Universidad Politecnica de Valencia, 2005.
[3] . SUN MICROSYSTEMS. JavaTM 2 Platform Standard Edition 5.0.
API Specication [en lnea] [ref. septiembre 2004 a septiembre 2005]
Disponible en web: http://java.sun.com/j2se/1.5.0/docs/api/
[4] GARC

IA MONZ

ON, Jose Lus. Proyecto del algoritmo de Fleury.


Universidad Politecnica de Madrid. [en lnea] [ref. marzo de 2005]
Disponible en web: http://www.dma..upm.es/eury/home.html
[5] GIMBERT, Joan. Los grafos como modelos matematicos: ejem-
plos y aplicaciones. Universidad Autonoma de Guerrero. [en
38
lnea] Editado en 1999 [ref. marzo de 2005] Disponible en web:
http://web.udl.es/usuaris/p4088280/teaching/leccion mexico.pdf
[6] JORDAN LLUCH, Cristina, TORREGROSA SANCHEZ, Juan R.
I ntroduccion a la Teora de Grafos y sus algoritmos. Ed. Reverte-
SPUPV 1996. ISBN: 84-7721-438-7.
[7] MATHLAND. Konigsberg Bridges. [en lnea] [ref. marzo de 2005]
Disponible en web:http://math.youngzones.org/Konigsberg.html
[8] SUN MICROSYSTEMS. JavaTM 2 Platform Standard Edition 5.0.
API Specication [en lnea] [ref. septiembre 2004 a septiembre 2005]
Disponible en web: http://java.sun.com/j2se/1.5.0/docs/api/
[9] SUN MICROSYSTEMS. The Java Tutorial. [descargable:
http://java.sun.com/docs/index.html]
[10] THE GAP GROUP. Konigsberg. Univ. of St. Andrews. [en lnea]
[ref. marzo de 2005] Disponible en web: http://www-gap.dcs.st-
and.ac.uk/ history/ Miscellaneous/Konigsberg.html/
39

You might also like