TP2: Enunciado

Anuncio
Algoritmos y Estructuras de Datos II - DC - UBA
1er cuatrimestre de 2013
Trabajo práctico 2:
"Quiero aumento YA"
Normativa
Fecha de entrega: Viernes 7 de Junio de 2013
Normas de entrega: Las contenidas en la página web de la materia.
Enunciado
El objetivo de este trabajo práctico consiste en realizar el diseño del módulo que modela el TAD Temporada y las operaciones abrirP aritaria, cerrarAcuerdo, reabrir, gremios, enP aritarias, gremiosN egociando,
empresasN egociando, trabajadoresN egociando, gremioConf lictivo. Así como todos aquellos módulos necesarios para la tarea, guiandose (sugerimos) con el resto de los TADs, utilizando Rep y Abs para relacionarlos.
Complejidades Requeridas
Todas las operaciones deben ser especicadas formalmente con las herramientas vistas en clase. Agreguen
comentarios necesarios para entender la forma en la cual deben ser utilizadas para su correcto funcionamiento.
Además, todos los algoritmos deben tener su desarrollo justicando los ordenes de complejidad, si algún paso
es no trivial pueden hacer notas a continuación del mismo.
Se requieren las siguientes complejidades 1
abrirP aritaria: Abrir una paritaria cuando no haya acuerdo previo debe ser O(1)
enP aritarias: Saber si un gremio está negociando sus paritarias debe tener un costo
O(#paritarias_abiertas), donde #paritarias_abiertas representa la cantidad de paritarias abier-
tas del sistema.
cerrarAcuerdo: Llegar a un acuerdo a debe costar, en caso promedio, el costo de encontrar y sacar la Paritaria2 cuyo acuerdo se está logrando mas O(log(#acuerdos) + #acuerdos_menores ∗
log(#acuerdos_aliados)+log(#acuerdos_mayores)), donde #acuerdos representa la cantidad de acuerdos del sistema, y #acuerdos_menores representa la cantidad de acuerdos peores hechos por los
superaliados del gremio asociado a a. Por último, #acuerdos_mayores representa la cantidad de acuerdos
mejores al acuerdo en cuestión. (Hint: para lograr esto el costo de saber si dos gremios son superaliados
debe ser O(1) ).
Para la función cerrarAcuerdo demostrar la correctitud del orden y que su programa lo cumple. Deberá
hacerse para todas las funciones que ésta utilice. Cuando se formalicen los Rep y Abs, identiquen cada parte
de la fórmula y coméntenlas para facilitar su seguimiento y corrección.
Cuentan con lo siguiente:
Char
que representa los posibles caracteres. Siendo un tipo enumerado de 256 valores. con funciones ord
y ord−1 para la correspondencia de cada Char a N at.
string como sinónimo de V ector < Char >.
los TADs denidos en el apunte de TADs básicos.
los módulos en el apunte de módulos básicos.
la funcion getId() que entrega un Nat aleatorio bien distribuido sin repetirse.
Especicación
TAD empresa es string
TAD empresas es conj( Empresa )
TAD #personas es nat
TAD piso es nat
TAD techo es nat
TAD porc es nat
1
2
e • set ≡ Ag(e, set)
set − e ≡ set \ {e}
∅ = set ≡ ∅?set
∅=
6 set ≡ ¬∅?set
No considerar el costo de las validaciones de las restriciones
el costo dependerá de la estrucutra que ustedes elijan
1/6
Algoritmos y Estructuras de Datos II - DC - UBA
1er cuatrimestre de 2013
TAD Gremio
géneros
Gremio
generadores
nuevo : Empresas es × #Personas n −→ Gremio
observadores básicos
empresas : Gremio g −→ Empresas
aliados : Gremio g −→ #Personas
otras operaciones
empresas : conj(Gremio) gs −→ Empresas
aliados : conj(Gremio) gs −→ #Personas
axiomas
∀ gs: conj(Gremio),∀ es: Empresas,∀ n: #Personas
empresas( nuevo( es, n ) ) ≡ es
aliados( nuevo( es, n ) ) ≡ n
empresas( gs ) ≡ if ∅ = gs then ∅ else empresas(dameU no(gs)) ∪ empresas(sinU no(gs)) aliados( gs ) ≡ if ∅ = gs then ∅ else af iliados(dameU no(gs)) + af iliados(sinU no(gs)) Fin TAD
TAD Sistema Laboral
géneros
SL
generadores
nuevo : conj(Gremio) gs −→ SL
{ (∀g1 , g2 ∈ gs) g1 6= g2 ⇒ empresas(g1 ) 6 ∩ empresas(g2 )}
aliar : SL sl × Gremio g1 × Gremio g2 −→ SL
{g1 ∈ gremios(sl) ∧ g2 ∈ gremios(sl) ∧ g1 6= g2 }
observadores básicos
gremios : SL sl −→ conj(gremio)
aliados : SL sl × Gremio g −→ conj( Gremio )
{g ∈ gremios(sl)}
otras operaciones
aliado? : SL sl × Gremio g × Gremio amigo −→ bool
superaliados : SL sl × Gremio g −→ conj( Gremio )
clausura : SL sl × conj(Gremio) cs × conj(Gremio) gs −→ conj( Gremio )
{g ∈ gremios(sl)}
{g ∈ gremios(sl)}
{cs ⊆ gremios(sl) ∧ gs ⊆ gremios(sl)}
axiomas
∀ g, amigo, g1 , g2 : Gremio,∀ gs, cs: conj(Gremio),∀ sl: SL,∀ n: #Personas
gremios( nuevo( gs ) ) ≡ gs
gremios( aliar( sl, g1 , g2 )) ≡ gremios(sl)
aliados( nuevo( gs ), g ) ≡ ∅
aliados( aliar( sl, g1 , g2 ), g ) ≡ if g ∈ {g1 , g2 } then {g1 , g2 } − g else ∅ ∪ aliados(sl, g)
aliado?( sl, g, amigo ) ≡ amigo ∈ superaliados(sl, g)
superaliados( sl, g ) ≡ clausura(sl, ∅, aliados(sl, g)) − g
clausura( sl, cs, gs ) ≡ if ∅ = gs then
cs
else
Fin TAD
clausura( sl,
dameU no(gs) • cs,
sinU no(gs) ∪ aliados(dameU no(gs)) \ cs )
2/6
Algoritmos y Estructuras de Datos II - DC - UBA
1er cuatrimestre de 2013
TAD Paritaria
generadores
nuevaParitaria : Gremio g × Piso p × Tope t −→ Paritaria
{p ≤ t}
observadores básicos
gremio : Paritaria p −→ Gremio
piso : Paritaria p −→ Piso
tope : Paritaria p −→ Tope
otras operaciones
acepta? : Paritaria p × Porc p −→ bool
gremiosNegociando : conj(Paritaria) ps −→ conj( Gremio )
buscar : conj(Paritaria) ps × Gremio g −→ Paritaria
{g ∈ gremiosN egociando(ps)}
axiomas
∀ g : Gremio,∀ ps: conj(Paritaria),∀ p: Paritaria,∀ t: Tope
gremio( nuevaParitaria( g, p, t ) ) ≡ g
piso( nuevaParitaria( g, p, t ) ) ≡ p
tope( nuevaParitaria( g, p, t ) ) ≡ t
acepta?( p, t ) ≡ piso(p) ≤ t ≤ tope(p)
gremiosNegociando( ps ) ≡ if ∅ = ps then
∅
else
gremio(dameU no(ps)) • gremiosN egociando(sinU no(ps))
buscar( ps, g ) ≡ if gremio(dameU no(ps)) = g then dameU no(ps) else buscar(sinU no(ps), g) Fin TAD
3/6
Algoritmos y Estructuras de Datos II - DC - UBA
1er cuatrimestre de 2013
TAD Acuerdo
generadores
nuevoAcuerdo : Paritaria p × Porc n × Nat d −→ Acuerdo
observadores básicos
id : Acuerdo a −→ Nat
paritaria : Acuerdo a −→ Paritaria
valor : Acuerdo a −→ Porc
acuerdosPrevios : Acuerdo a −→ Nat
otras operaciones
gremio : Acuerdo a −→ Gremio
mejor : Acuerdo a × Acuerdo b −→ bool
masDiscutido : conj(Acuerdo) as −→ Acuerdo
juntar : conj(Acuerdo) ps × Gremio g −→ conj( Acuerdo )
{∅ =
6 as}
axiomas
∀ a, b: Acuerdo,∀ as: conj(Acuerdo),∀ p: Paritaria,∀ n: Porc,∀ d: Nat
paritaria( nuevoAcuerdo( p, n, d ) ) ≡ p
valor( nuevoAcuerdo( p, n, d ) ) ≡ n
acuerdosPrevios( nuevoAcuerdo( p, n, d ) ) ≡ d
gremio( a ) ≡ gremio( paritaria( a ) )
mejor( a, b ) ≡ valor(a) < valor(b)
masDiscutido( as ) ≡ if ∅ = sinU no(as) ∨
acuerdosP revios(dameU no(as)) >
acuerdosP revios(masDiscutido(sinU no(as)))
dameuno(as)
then
else
masDiscutido(sinU no(as))
juntar( as, g ) ≡ if ∅ = as then
∅
else
if
Fin TAD
gremio(dameU no(as)) = g
∪ juntar(sinU no(as), g)
4/6
then
{dameU no(as)}
else
∅
Algoritmos y Estructuras de Datos II - DC - UBA
1er cuatrimestre de 2013
TAD Temporada
generadores
iniciar : SL sl −→ Temporada
abrir : Temporada t × Paritaria p −→ Temporada
{¬enP aritarias?(t, gremio(p)) ∧ gremio(p) ∈ gremios(t)}
acordar : Temporada t × Acuerdo a −→ Temporada
{enP aritarias?(t, gremio(a)) ∧ acepta?(paritaria(t, gremio(a)), valor(a))}
observadores básicos
sistema : Temporada t −→ SL
paritarias : Temporada t −→ conj( Paritaria)
acuerdos : Temporada t −→ conj( Acuerdo )
otras operaciones
abrirParitaria : Temporada t × Gremio g × Piso p × Techo te × Empresas es −→ Temporada
{|es|∗2 > |empresas(g)|∧es ⊆ empresas(g)∧g ∈ gremios(t)∧¬enP aritarias?(t, g)∧p ≤ te}
cerrarAcuerdo : Temporada t × Gremio g × Porc c −→ Temporada
{enParitarias?( t, g ) ∧ acepta?( paritaria( t, g ), c )}
reabrir : Temporada t × Gremio g −→ Temporada
{¬enP aritarias?(t, g) ∧ ∅ =
6 juntar(acuerdos(t), g)}
gremios : Temporada t −→ conj( Gremio )
enParitarias? : Temporada t × Gremio g −→ bool
paritaria : Temporada t × Gremio g −→ Paritaria
{enP aritarias?(t, g)}
acuerdo : Temporada t × Gremio g −→ Acuerdo
{∅ =
6 juntar(acuerdos(t), g)}
discusiones : Temporada t × Gremio g −→ Nat
aReabrir : SL sl × Acuerdo a × conj(Acuerdo) as × conj(Gremio) gs −→ conj(Paritaria)
{gremio(a) ∈ gremios(sl)}
gremiosNegociando : Temporada t −→ conj( Gremio )
empresasNegociando : Temporada t −→ Empresas )
trabajadoresNegociando : Temporada t −→ #Persona
gremioConictivo : Temporada t −→ Gremio
5/6
{∅ =
6 acuerdos(t)}
Algoritmos y Estructuras de Datos II - DC - UBA
axiomas
1er cuatrimestre de 2013
∀ sl: SL,∀ t: Temporada,∀ a, na: Acuerdo,∀ sa: conj(Acuerdo),∀ p: Paritaria,∀ es: Empresas,
∀ n: Porc,∀ te: Techo,∀ g : Gremio
sistema( iniciar( sl ) ) ≡ sl
sistema( abrir( t, p ) ) ≡ sistema( t )
sistema( acordar( t, a ) ) ≡ sistema( t )
paritarias( iniciar( sl ) ) ≡ ∅
paritarias( abrir( t, p ) ) ≡ p • paritarias(t)
paritarias( acordar( t, a ) ) ≡ (paritarias(t) − paritaria(a)) ∪
aReabrir(sistema(t), a, acuerdos(t), gremiosN egociando(paritarias(t)))
acuerdos( iniciar( sl ) ) ≡ ∅
acuerdos( abrir( t, p ) ) ≡ acuerdos( t )
acuerdos( acordar( t, a ) ) ≡ a • acuerdos(t) \ juntar(acuerdos(t), gremio(a))
abrirParitaria( t, g, p, to, es ) ≡ abrir( t, nuevaParitaria( g, p, to ) )
cerrarAcuerdo( t, g, n ) ≡ acordar( t, nuevoAcuerdo( paritaria( t, g ), n, discusiones( t, g ) + 1 ) )
reabrir( t, g ) ≡ abrir( t, paritaria( acuerdo( t, g ) ) )
gremios( t ) ≡ gremios( sistema( t ) )
discusiones( t, g ) ≡ if ∅ =
6 juntar(acuerdos(t), g) then
acuerdosPrevios( acuerdo( t, g ) )
else
0
paritaria( t, g ) ≡ buscar(paritarias(t), g)
acuerdo( t, g ) ≡ dameU no(juntar(acuerdos(t), g))
enParitarias?( t, g ) ≡ g ∈ gremiosN egociando(paritarias(t))
aReabrir( sl, a, as, gs ) ≡ if ∅ = as then
∅
else
if
aliado?(sl, gremio(a), gremio(dameU no(as))) ∧
gremio(dameU no(as)) ∈
/ gs ∧
mejor(dameU no(as), a) then
{paritaria(dameU no(as))}
else
∅
∪ aReabrir(sl, a, sinU no(as), gs)
gremiosNegociando( t ) ≡ gremiosNegociando( paritarias( t )
empresasNegociando( t ) ≡ empresas( gremiosNegociando( paritarias( t ) )
trabajadoresNegociando( t ) ≡ aliados( gremiosNegociando( paritarias( t ) )
gremioConictivo( t ) ≡ gremio( masDiscutido( acuerdos( t ) ) )
Fin TAD
6/6
Descargar