You are on page 1of 29

Tecnica de diseo de Algoritmos:

Ramificacin y
poda
Esta tcnica de diseo se aplica normalmente para
resolver problemas de Optimizacin. Realiza una
enumeracin parcial del espacio de soluciones
basndose en la generacin de un rbol de expansin.
El diseo de dicha tcnica en su versin ms sencilla
puede seguir un recorrido en anchura, en profundidad, o
utilizando el clculo de funciones de coste para
seleccionar el nodo que en principio parece ms
prometedor. Adems utiliza cotas para podar aquellas
ramas del rbol que no conducen a la solucin ptima.
Para ello calcula en cada nodo una cota del posible valor
de aquellas soluciones alcanzables desde se.
Definimos nodo vivo del rbol a un nodo con posibilidades de ser
ramificado.

Bsicamente, en un algoritmo de Ramificacin y Poda se realizan tres


etapas:

La primera de ellas, denominada de Seleccin, se encarga de


extraer un nodo de entre el conjunto de los nodos vivos.

En la segunda etapa, la Ramificacin, se construyen los posibles


nodos hijos del nodo seleccionado en el paso anterior.

Por ltimo, la Poda, en la que se eliminan algunos de los nodos creados


en la etapa anterior.

Esto contribuye a disminuir en lo posible el espacio de bsqueda y as


atenuar la complejidad de estos algoritmos basados en la exploracin
de un rbol de posibilidades. Aquellos nodos no podados pasan a
formar parte del conjunto de nodos vivos, y se comienza de nuevo por
el proceso de seleccin. El algoritmo finaliza cuando encuentra la
solucin, o bien cuando se agota el conjunto de nodos vivos.
Ejemplo de aplicacin:

El viajante de comercio
Se conoce la distancia entre un cierto numero de
ciudades. Un viajante debe, a partir de una de ellas, visitar
cada ciudad exactamente una vez y regresar al punto de
partida habiendo recorrido en total la menor distancia
posible.
Es decir, dado un grafo dirigido con arcos de longitud no
negativa, se trata de encontrar un circuito de longitud
mnima que comience y termine en el mismo vrtice y
pase exactamente una vez por cada uno de los vrtices
restantes (circuito Hamiltoniano).
Sean G=(V,A) un grafo orientado:
V={1,2,,n}
Lij la longitud de (i,j)A
Lij=si no existe el arco (i,j).

- El circuito buscado empieza en el vrtice 1.

Espacio de soluciones:
E = { 1,p,1 | p es una permutacin de (2,3,,n) }

Reduccin del espacio de soluciones:

E = { 1,p,1 | p = i1,i2,,in-1, es una permutacin de


(2,3,,n) tal que (ij,ij+1)A, 0jn-1,i0=in=1 }
Representacin del espacio de estados:

Caso de un grafo completo con |V| = 5. Cada


hoja del rbol de expansin es una solucin y
representa el viaje definido por el camino desde
la raz hasta la hoja.
Debemos llevar informacin para realizar la poda. En este sentido vamos a incluir una matriz de
costes reducida . Diremos que una fila (columna) de una matriz est reducida si contiene al
menos un elemento cero, y el resto de los elementos son no negativos. Una matriz se dice
reducida si y slo si todas sus filas y columnas estn reducidas. Por ejemplo, dada la matriz de
adyacencia:
15 7 4 20
1 16 6 5
8 20 4 10
4 7 14 3
10 35 15 4

Podemos calcular su matriz reducida restando respectivamente 4, 1, 4, 3 y 4 a cada fila, y luego 4 y 3


a las columnas 2 y 3, obteniendo la matriz:

7 0 0 16
0 12 5 4
4 12 0 6
1 0 8 0
6 27 8 0

En total hemos restado un valor de 23 (4 + 1 + 4 + 3 + 4 + 4 + 3), que es lo que denominaremos el


coste de la matriz.
De esta forma, dada una matriz de adyacencia de un grafo ponderado podemos obtener su matriz
reducida calculando los mnimos de cada una de las filas y restndoselos a los elementos de esas
filas, haciendo despus lo mismo con las columnas.
Funcin Reducir
public int CosteFil(int i)
{
public int reducir() int c = matriz[i, 0];
{ for (int j = 1; j < n; j++)
int costo = 0, min; {
if (matriz[i, j] < c)
for (int i = 0; i < n; i++) {
{ c = matriz[i, j];
min = CosteFil(i); }
if ((min > 0) && (min < Int16.MaxValue)) }
{ return c;
QuitarFil(i, min); }
costo += min;
}
} public int CosteCol(int j)
for (int j = 0; j < n; j++) {
{ int c = matriz[0, j];
min = CosteCol(j); for (int i = 0; i < n; i++)
if ((min > 0) && (min < Int16.MaxValue)) {
{ if (matriz[i, j] < c)
QuitarCol(j, min); {
costo += min; c = matriz[i, j];
} }
} }
return costo; return c;
} }
Funcion Expandir

La estrategia de ramificacin est a cargo de la funcin Expandir.


Cada nodo puede generar, como hemos dicho antes, a lo sumo Nk
hijos, que son los correspondientes a los vrtices an no incluidos en
el recorrido
public int Expandir(ref nodo[] hijos, nodo nod) public bool NoEsta(int[] solucion, int k, int j)
{ {
int nk, i, nhijos = 0;
nodo p = new nodo(n);
for (int i = 0; i < k; i++)
nk = nod.K; {
i = nod.Solucion[nk - 1] - 1; if (solucion[i] == j + 1)
if (nk >= n) return false;
return nhijos; }
for (int j = 0; j < n; j++) return true;
{
if (NoEsta(nod.Solucion, nk, j))
}
{
nhijos++;
p = Copiar(nod);
p.Solucion[nk] = j + 1;
if (nk == n - 1)
{
p.Costo += (nod.Matriz[i, j] + nod.Matriz[j,
0]);
}
else
{
for (int l = 0; l < n; l++)
{
p.Matriz[i, l] = Int16.MaxValue;
p.Matriz[l, j] = Int16.MaxValue;
}
p.Matriz[j, 0] = Int16.MaxValue;
p.Costo += (p.reducir() + nod.Matriz[i, j]);
}
p.K++;
hijos[nhijos - 1] = p;
}
}
return nhijos;
Funcion EsAceptable y Funcion Es Solucion
Es necesario implementar la funcin que public bool EsAceptable()
realiza la poda. En este caso, vamos a {
return (costo < cota);
podar los nodos cuya penalizacin hasta }
el momento supere la alcanzada por una
solucin ya encontrada

La funcin EsSolucion determina cundo public bool EsSolucion()


un nodo es solucin. En nuestro caso {
return (k == n);
consiste en decidir cundo hemos sido }
capaces de acomodar hasta el N-simo
vrtice:
Programa Principal

repetir
expandir el nodo vivo ms prometedor;
generar todos sus hijos;
una vez generados, el padre se elimina;
para cada hijo hacer
si tiene un coste esperado peor que el de la mejor solucin en curso
entonces se elimina
sino
si tiene un coste esperado mejor que el de la mejor solucin en curso
y no es solucin
entonces se pasa a la lista de nodos vivos
sino {tiene un coste esperado mejor que el de la mejor solucin en
curso y es solucin (el coste no es estimado sino real)}
pasa a ser la mejor solucin en curso y se revisa toda la lista de
nodos vivos, eliminando los que prometen algo peor
de lo conseguido
finsi
finsi
finpara
hasta que la lista est vaca
while (!E.Vacia())
{
nod = E.Elimina_Min();
analizados++;
numhijos = nod.Expandir(ref hijos, nod);
generados += numhijos;
for (int i = 0; i < numhijos; i++)
{
if (hijos[i].EsAceptable())
{
if (hijos[i].EsSolucion())
{
hijos[i].Poner_Cota(hijos[i].Costo);
for (int j = 0; j < numhijos; j++)
{ //una nueva solucion
if (i != j)
hijos[j] = null;
}
solucion = hijos[i].Solucion;
}
else E.Insertar(hijos[i]);
}
else
{
hijos[i] = null;
podados++;
}
}
}
Ejemplo utilizado.

V1 V2 V3 V4 V5
5 V1 15 7 4 20
V2 1 16 6 5
3
V3 8 20 4 10
V4 4 7 14 3
V5 10 35 15 4

Siendo el carcter utilizado


4
para representar las aristas
inexistentes.
1

Podados
Analizados
U=
1
C=43 C=23 C=47
C=35
2 3 4 5

Podados
Analizados
U=
1

2 3 4 5

C=40 C=29 C=29

2 4 5

Podados
Analizados
U=
1

2 3 4 5

2 4 5

C=33 C=50

2 5

Podados
Analizados
U=
1

2 3 4 5

2 4 5

C=33 C=50 C=29


C=62
2 5 2 4

Podados
Analizados
U=
1

2 3 4 5

2 4 5

2 5 2 4

C=29

Podados
Analizados
U= U=29
1

2 3 4 5

3 5 1
4

C=43 C=43 C=47


2 4 5

2 5 2 4

Podados
U=29
Analizados
1

2 3 4 5

3 5 1
4

2 4 5

2 5 2 4

C=33
5 2

Podados
U=29
Analizados
1

2 3 4 5

3 5 1
4 2 3 4

C=79 C=47 C=51


2 4 5

2 5 2 4

5 2

Podados
U=29
Analizados
1

2 3 4 5

3 5 1
4 2 3 4

2 4 5

4 5 2 5 2 4
C=46 C=40

5 2

Podados
U=29
Analizados
1

2 3 4 5

3 5 1
4 2 3 5 2 3 4
C=39 C=49 C=43
2 4 5

4 5 2 5 2 4

5 2

Podados
U=29
Analizados
1

2 3 4 5

3 5 1
4 2 3 5 2 3 4

2 4 5

4 5 2 5 2 4

C=50

5 2 2

Podados
U=29
Analizados
1

2 3 4 5

3 5 1
4 2 3 5 2 3 4

2 4 5

4 5 2 5 2 4

5 2 4 2
C=62
Podados
U=29
Analizados
1

2 3 4 5

3 5 1
4 2 3 5 2 3 4

2 4 5

Generados = 26
Analizados = 12
4 5 2 5 2 4
Podados = 14

5 2 4 2
C=62
Podados
U=29
Analizados
Branching Strategies in a Branch-and-Price Approach
for a Multiple Objective Nurse Scheduling Problem

Reclutar y mantener el personal requerido son desafos clave para


la industria de la salud.
La programacin del personal es un componente central, y es
esencial para el cuidado de los pacientes.
La administracin eficiente del personal de enfermera es vital para
el xito global de cualquier organizacin, porque tpicamente, la
mano de obra de enfermera representa el 40% del presupuesto
total de un hospital.
Los intereses se centran en minimizar las horas extra, manteniendo
la continuidad de la prestacin de servicios, maximizando la moral y
minimizando el absentismo y el abandono.
La administracin de la fuerza de trabajo es vista usualmente como
un proceso secuencial de tres fases, consistentes en las fases de
dotacin de personal, programacin y asignacin.
En el paper Trabajado, se presenta un proceso exacto
para la resolucin del problema de asignacin de
horarios del personal, que consiste en generar una
configuracin de horarios individuales.
En este articulo, se discuten los detalles algortmicos de
la aproximacin por ramificacin y poda para resolver el
problema de la programacin de horarios para el
personal de enfermera.
Se propone un procedimiento para la solucin a corto
plazo del problema de programacin de turnos de
enfermera, apuntando a maximizar la calidad del horario
construido, satisfaciendo los objetivos del hospital e
incorporando los requerimientos legales, gremiales y
personales impuestos sobre los horarios individuales de
los\as enfermeros \ as.