Вы находитесь на странице: 1из 6

ADDA

Convocatoria

Septiembre

Curso 2012/13

Ejercicio 3: Algoritmo Voraz


Tokio acaba de ser elegida ciudad olmpica para el ao 2020, por lo que el Comit
Olmpico de Japn (JOC) necesita planificar la construccin de los diferentes edificios
donde se celebrarn las olimpiadas. Para el ao 2014, el JOC dispone ya de una cantidad
de dinero que quiere aprovechar para empezar a construir, y para demostrar que estn
muy comprometidos con la eleccin recibida, quieren empezar por los edificios de mejor
calidad e importancia posibles. Para ello, el JOC tiene un catlogo ordenado con varios
proyectos, cada proyecto tiene la siguiente informacin:
- Nombre: nombre del edificio.
- Funcionalidad: funcin que desempear en las olimpiadas (por ejemplo,
estadio, piscina, villa, etc).
- Importancia: relevancia que tendr el edificio dentro de las olimpiadas. Ser una
puntuacin entre 0 y 10 dada por el JOC, siendo 0 la mnima puntuacin y 10 la
mxima.
- Precio: presupuesto por construir el edificio (en yenes).
- Valor de Calidad: puntuacin entre 0 y 10 dada por un equipo de expertos en
edificacin, siendo 0 la mnima puntuacin y 10 la mxima.
El JOC ha decidido contratar sus servicios para la realizacin de un Algoritmo Voraz que
les permita decidir qu edificios construir para que la suma total del valor en relacin
a la calidad por importancia de los edificios sea mxima. Adems, hay que tener en
cuenta que slo se puede elegir un edificio que tenga la misma funcionalidad (por
ejemplo, no se pueden construir 2 piscinas olmpicas para la natacin) y que est dentro
del presupuesto disponible.
Por ejemplo, con un presupuesto de 20 millones de Yenes y la siguiente lista de
proyectos ordenados por la funcin objetivo: [(Importancia * Valor de Calidad)/Precio]
Nombre
Sakura
Natsuki
Akira
Hikari
Mizuki
Ryu
Sora
Ai

Funcionalidad
ESTADIO PPAL
ESTADIO PPAL
ESTADIO PPAL
PISCINA
VILLA
PISCINA
VILLA
VILLA

Importancia
10
10
10
7
8
7
8
8

Precio
(mil. de yenes)
7
8
9
6
8
7
10
9

Valor
Calidad
8
9
10
9
10
8
10
8

Valoracin
Final
11,42
11,25
11,11
10,5
10
8
8
7,11

La solucin obtenida sera la siguiente tabla, con un presupuesto restante de 6 millones de Yenes
y un Valor de Calidad-Importancia Total de 143.
Precio
Valor
Valoracin
Nombre
Funcionalidad Importancia
(mil. de yenes)
Calidad
Final
Sakura
PPAL
10
7
8
11,42
Hikari
NAT
7
6
9
10,5

ADDA

Convocatoria

Septiembre

Curso 2012/13

Se pide:
- Completar la ficha adjunta siguiendo la informacin del problema detallado
anteriormente
- Implemente los siguientes mtodos pertenecientes a la clase EstadoJOCAP:
o private EstadoJOCAP()
o public SolucionJOC getSolucion()
o public boolean condicionDeParada()
o Proyecto getAlternativa()
o void next(Proyecto p)

- Implemente el siguiente mtodo perteneciente a la clase ProblemaJOCAP:


o EstadoJOCAP getEstadoInicial()

NOTA: recuerde que si necesita una clase con funcionalidad adicional (por ejemplo, Predicate,
Comparator, Function, etc) debe implementarla.

Tiempo estimado: 45 min.

Puntuacin: 2,5 ptos

ADDA

Convocatoria

Septiembre

Curso 2012/13

Nombre: _____________________________________________________
Titulacin: ___________________________________________________
Ficha 1
Problema Comit Olmpico de Japn
Tcnica: Algoritmo Voraz
Propiedades Compartidas

Propiedades del Estado

Solucin:

Objetivo:

Inicial:

Alternativas

next

ADDA

Convocatoria

Septiembre

Curso 2012/13

SOLUCION (4puntos repartidos)


Ficha 1
Problema Comit Olmpico de Japn
Tcnica: Algoritmo Voraz
Propiedades Compartidas

proyectosDisponibles: List<Proyecto>
presupuestoTotal: Integer

0,5

Propiedades del Estado

Solucin: SolucionJOC

proyectosElegidos: List<Proyecto>
proyectosPorElegir: List<Proyecto>
presupuestoDisponible: Integer
valorCalidadImportanciaTotal: Double

0,25

Objetivo: 0,25
Maximizar valor valorCalidadImportanciaTotal

Inicial:
0,6
proyectosElegidos: {}
proyectosPorElegir: proyectosDisponibles
presupuestoDisponible: presupuestoTotal
valorCalidadImportanciaTotal: 0.0

Alternativas 0,4
A = {p en proyectosPorElegir} tal que p es el primer valor de proyectosPorElegir

Next 1

proyectosElegidos -> proyectosElegidos + p


proyectosPorElegir -> proyectosPorElegir p (filtrar por funcionalidad y
presupuesto)
presupuestoDisponible = presupuestoDisponible p.getPrecio()
valorCalidadImportanciaTotal = valorCalidadImportanciaTotal + (p.getValorCalidad()
* p.getImportancia())

ADDA

Convocatoria

Septiembre

Curso 2012/13

- Implemente los siguientes mtodos pertenecientes a la clase EstadoJOCAP:


(6 puntos repartidos)

o private EstadoJOCAP()

1 punto

private EstadoJOCAP() {
super();
this.proyectosElegidos = Lists.newLinkedList();
this.presupuestoDisponible = ProblemaJOC.getPresupuestoTotal();
this.proyectosPorElegir =
Lists.newLinkedList(ProblemaJOC.getProyectosDisponibles());
this.valorCalidadImportanciaTotal = 0.0;
}

o public SolucionJOC getSolucion() 0.5 punto


@Override
public SolucionJOC getSolucion() {
return SolucionJOC.create(proyectosElegidos);
}

o public boolean condicionDeParada() 1 punto


@Override
public boolean condicionDeParada() {
return (proyectosPorElegir.isEmpty() || presupuestoDisponible <=0);
}

o Proyecto getAlternativa()

1 punto

@Override
public Proyecto getAlternativa() {
Proyecto proyecto = null;
if(!proyectosPorElegir.isEmpty()){
proyecto = proyectosPorElegir.get(0);
}
return proyecto;
}

o void next(Proyecto p)

1 punto

@Override
public void next(Proyecto p) {
this.proyectosPorElegir.remove(p);
this.proyectosElegidos.add(p);
this.presupuestoDisponible = this.presupuestoDisponible-p.getPrecio();
this.valorCalidadImportanciaTotal = this.valorCalidadImportanciaTotal
+ (p.getValorCalidad()*p.getImportancia());
// Actualizar y filtrar la lsita de proyectosPorElegir
this.proyectosPorElegir =
Lists.newLinkedList(Iterables.filter(proyectosPorElegir, new
DistintaFuncionalidadYDentroPresupuesto(p)));
}

ADDA

Convocatoria

Septiembre

Curso 2012/13

1 punto
private class DistintaFuncionalidadYDentroPresupuesto implements
Predicate<Proyecto> {
private Proyecto proyecto;
public DistintaFuncionalidadYDentroPresupuesto(Proyecto p){
this.proyecto = p;
}
@Override
public boolean apply(Proyecto arg0) {
return
(!(arg0.getFuncionalidad().equalsIgnoreCase(proyecto.getFuncionalidad())) &&
arg0.getPrecio() <= presupuestoDisponible);
}
}

- Implemente el siguiente mtodo perteneciente a la clase ProblemaJOCAP:


o EstadoJOCAP getEstadoInicial()
@Override
public EstadoJOCAP getEstadoInicial() {
return EstadoJOCAP.create();
}

0.5 punto

Вам также может понравиться