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