Está en la página 1de 4

ADDA 2 Parcal Curso 2014/2015

Ejercicio 4: Backtracking

La empresa MercadoAcme trata de mejorar su eficiencia a la hora de atender a sus


clientes en las lneas de caja. Se necesita atender N clientes que van cargados con un
nmero de productos (NPC en la ficha) y que deben pasar por una de las M cajas
disponibles. Las cajas trabajan en paralelo (supngase N > M).
El problema consiste en determinar en qu caja hay que atender a cada uno de los
clientes, de forma que el tiempo final de atencin al conjunto de todos los clientes
(tiempo necesario para la atencin en la caja ms cargada) sea mnimo. Supngase que
el tiempo para atender a un cliente es proporcional al nmero de productos que lleva.
Como solucin, se requiere una lista de enteros en la que, para cada cliente (ndices de
la lista), se indique qu caja se le ha asociado (valores de la lista). Supngase que no
hay restricciones acerca de cundo se puede comenzar a atender a un cliente.
Ejemplo 1:

N M NPC
4 3 [5,1,3,3]

Solucin Valor Objetivo


[0,1,1,2] 5 productos

Ejemplo 2:

N M NPC Solucin Valor Objetivo

4 2 [5,1,3,3] [0,0,1,1] 6 productos

Se pide:
1) Completar la ficha adjunta del problema (//TODO)
2) Implementar los siguientes mtodos de EstadoLineaCaja (que implementa
EstadoBT<List<Integer>, Integer>) teniendo en cuenta la ficha adjunta:
a) public void avanza(Integer a)
b) public void retrocede(Integer a)
c) public Double getObjetivo()
d) public boolean isFinal()
e) public List<Integer> getAlternativas()
Puntuacin: 30%
ADDA 2 Parcal Curso 2014/2015

BT
Problema Lnea de Caja
Tcnica: Backtracking
Propiedades Compartidas N: int //nmero de clientes
NPC: List<Integer> //nmero de productos por cliente
M: int//nmero de cajas disponibles
Propiedades Bsicas del Estado j: int // [0,..,N]
cajaAsignada: List<Integer>// caja asignada a cada cliente

Prop. Derivadas del Estado //TODO

Solucin: List<Integer> caja asignada a cada cliente


Inicial: //TODO
Final: //TODO
Alternativas: //TODO

Avanza(a): //TODO

Retrocede(a): //TODO
ADDA 2 Parcal Curso 2014/2015

BT
Problema Lnea de Caja
Tcnica: Backtracking
Propiedades Compartidas N: int //nmero de clientes
PPC: List<Integer> //productos por cliente
M: int //nmero de cajas disponibles
Propiedades Bsicas del Estado j: int // [0,..,N]
cajaAsignada: List<Integer>// caja asignada a cada cliente

Prop. Derivadas del Estado


pAcum: List<Integer> //productos acumulados por caja

Solucin: List<Integer> caja asignada a cada cliente


Inicial: j = 0, cajaAsignada = {}
Final: j >= N
Alternativas: aj,c={0 .. M-1}

Avanza(a):
cajaAsignada.add(a);
j++;

[cajaAsignada + a, j+1]
Retrocede(a):
j--;
cajaAsignada.remove(cajaAsignada.size()-1);

[cajaAsignada - a, j-1]
ADDA 2 Parcal Curso 2014/2015

@Override
public void avanza(Integer a) {
this.cajaAsignada.add(a);
this.pAcum.set(a,
this.pAcum.get(a) +
ProblemaLineaCajaBT.PPC.get(j));
this.j++;
}

@Override
public void retrocede(Integer a) {
this.j--;
this.pAcum.set(a,
this.pAcum.get(a) -
ProblemaLineaCajaBT.PPC.get(j));
this.cajaAsignada.remove((int) this.cajaAsignada.size()-1);
}

@Override
public boolean isFinal() {
return j >= ProblemaLineaCajaBT.N;
}

@Override
public Double getObjetivo() {
return 0.0 +
this.pAcum.stream().max(Comparator.naturalOrder()).orElse(0);
}

@Override
public Iterable<Integer> getAlternativas() {
List<Integer> ls = IntStream.range(0,
ProblemaLineaCajaBT.M)
.boxed()
.collect(Collectors.toList());
return ls;
}

También podría gustarte