GithubHelp home page GithubHelp logo

tda_2024_1c's Introduction

Teoría de Algoritmos

Integrantes:

  • Azul Fuentes
  • Tomás Ezequiel Galián
  • Valentín Santander

tda_2024_1c's People

Contributors

tomasgalian avatar v-sant avatar azulfuentes avatar azu26 avatar

Watchers

 avatar  avatar

tda_2024_1c's Issues

TP3 Aprobado: 9 (Nueve)

Demostración: Multiway Partition Problem es NP Completo usando
Subset Sum Problem

La demostración de que Multiway Partition Problem es NP Completo también es una muestra de que el 2-way Partition Problem es NP Completo, también conocido como Partition Problem.
Justamente porque la cantidad de subconjuntos que se le pidió a Multiway es 2, por ello es 2-way.

    if index == len(maestros):
        coeficiente_actual = calcular_coeficiente(sumas)
        if coeficiente_actual < mejor_solucion[0]:
            # Sobreescribo mi mejor solucion con todos los maestros asignados
            mejor_solucion[0] = coeficiente_actual
            # Pongo como quedaría mi mejor solución
            mejor_solucion[1] = [list(grupo) for grupo in grupos]
        # Siempre voy a querer retornear para que se sigan calculando las otras opciones
        return

El cálculo de coeficiente de sumas es un valor que puede mantenerse a través del algoritmo, sumando y restando en O(1) el valor que se altera, para evitar hacer cada vez la iteración que requiere la suma.
Es recomendable que la función devuelva el resultado, la modificación que se hace a "mejor_solucion" es una especie de hack que funciona pero no recomendamos

    for maestro in maestros_ordenados:
        grupo_minimo = grupos.pop(0)
        nuevo_valor = grupo_minimo[1] + maestro[1]
        maestros_grupo = grupo_minimo[0] + [maestro[0]]
        grupo_minimo = (maestros_grupo, nuevo_valor)

        grupos = insertar_ordenado(grupos, grupo_minimo)

La implementación de Greedy también se puede optimizar con el uso de Heap

La complejidad total de este algoritmo es la resultante
de, ordenar a los maestros por habilidades O(m.log(m)), luego, que por cada iteración de los maestros
O(m), se reubique al grupoM in modificado en la posición correspondiente a la habilidad acumulada
O(k), por lo que la complejidad de este algoritmo es O(m.k) + O(m.log(m)).

Si la complejidad está bien definida, entonces corresponde utilizar Heap.
Eso queda ya supeditado a la investagación del módulo bisect

A partir del valor de las relaciones, se puede inferir que tanto se aleja de la solución óptima. Se
realizaron mediciones para 50 instancias aleatorias con una cantidad menor o igual a 12 maestros con
un rango de habilidad de 1 a 1000 y con la cantidad de grupos constante. Para cada instancia, se corre
el algoritmo Greedy y el algoritmo de backtracking que obtiene la solución óptima. Luego se divide el
resultado aproximando entre el óptimo y se toma ese punto del gráfico.

Notar que también se pueden construir instancias cuya solución sea, por construcción, conocida, sin tener que recurrir al algoritmo de Backtracking.

Como se puede apreciar, el algoritmo tiene una cota de error cercana al 0.0025 lo que indica que el
algoritmo Greedy tiene un error aproximado al 0.3 %. Aunque no siempre obtiene el resultado correcto,
sigue siendo útil pues da un valor aproximado en un tiempo considerablemente menor

Podría hacerse un análisis para generar una instancia que sea particularmente complicada de resolver para el conocido algoritmo Greedy

Para completar el análisis, se analizará otra estrategia Greedy. El algoritmo es el siguiente: Calcular
la suma total de las habilidades de todos los maestros y dividirla por la cantidad de grupos, dando
una SumaHabilidadIdeal. Luego, Ordenar de mayor a menor los maestros en función de su habilidad
o fortaleza. Iterar los grupos de manera circular (si se llega al último grupo, se comienzan a iterar
nuevamente desde el principio) e ir colocando un maestro por cada iteración. Si la suma acumulada de
fuerza de un grupo supera la SumaHabilidadIdeal, se saltea.

La descripción omite qué ocurre cuando, con toda probabilidad, suceda la situación de que el maestro, sin importar dónde se ubique, excederá la SumaHabilidadIdeal

Tp1 Aprobado: 8 (Ocho)

Pueden leer en detalle los comentarios, y al final les dejo una guía para pensar en mejoras que puedan tener en cuenta para la realización de futuros trabajos. El trabajo aún con los comentarios a mejorar es muy bueno.

Para la implementación de la solución se propone utilizar un algorítmo Greedy

algoritmo, sin tilde

Para facilitar la selección de la mejor decisión local, optamos por ordenar las batallas disponibles, buscando así ir ejecutando aquellas que más nos convenga.

Debe quedar en claro que el ordenamiento no es más que una optimización, siempre y cuando el orden se pueda definir de antemano y para los casos donde la regla requiere en cada paso tomar el máximo / mínimo elemento aún no analizado

Buscamos ordenar las
batallas de mayor peso a menor peso priorizando de esta forma las que son mas importantes
primero. Este ordenamiento es crucial, ya que evita que las batallas con mayor peso se retrasen en
su ejecución.

Se puede desplegar la sumatoria desde el punto de vista matemático para mostrar que mientras más tarde se coloca una batalla, mayor cantidad de términos ti se le suman a ser multiplicados, de esta manera mostrando por qué las de mayor peso se consideran primero

Este ordenamiento es crucial para minimizar la suma ponderada, ya que
evita que las batallas con menor tiempo se ejecuten a lo último con mucho tiempo acumulado.

No es correcto este razonamiento. Lo que se puede hacer es desplegar la sumatoria para hacer ver que un ti se multiplica con mayor cantidad de valores de b mientras antes se encuentre en el orden, por lo tanto solamente para los valores de t, es preferible que los más bajos estén antes dado que se multiplican en más oportunidades

Este ratio ayuda a tener en cuenta ambos criterios hablados anteriormente, donde a mayor
peso y menor tiempo el ratio aumenta y donde a menor peso y mayor tiempo el ratio disminuye.

En este punto creo que sería relevante repasar por qué esto tiene el efecto deseado

y luego recorre
linealmente este arreglo para encontrar la suma ponderada de los tiempos de las batallas.

Aclarar que en cada paso de ese recorrido se aplican operaciones constantes, y por lo tanto tienen un total de complejidad O(n), despreciable frente a la complejidad del ordenamiento

Se considera que si existen eventos i, j tal que ri = rj entonces el orden en el que se encuentren,
siempre y cuando sea de manera consecutiva, no afectará a la solución final.

Esto no puede quedar en el dicho o la consideración, se debe demostrar

Ahora lo que resta probar es que la suma
ponderada de los tiempos de finalización con una inversión menos, es menor que γ.

Lo primero que se necesita para complementar este análisis es mostrar por qué el resto de los términos de la sumatoria no se ven afectados por la inversión. Si bien se muestra cómo se afectan los dos intercambiados, no se está hablando de todo el resto de los términos. Si el resto de los términos fueran modificados también, no podríamos hacer este análisis.

Entre las cosas a mencionar, cabe destacar que el tiempo total de finalización de las batallas es siempre el mismo, sin importar el orden. Quitando las dos batallas invertidas, a todas las demás no se les afecta su tiempo de finalización.
Lo que faltaría es contextualizar esos dos elementos entre una multiplicidad de muchos otros, dado que invertir esos dos solamente puede afectarlos a ellos, el resto de los términos se mantienen sin modificaciones. Eso significa que los únicos elementos que cambios son los que se invierten, y nunca con un peor resultado. Por lo tanto, más allá de la cantidad de inversiones requeridas, se compatibiliza la solución con el hipotético óptimo.

Suponiendo esa como la única inversión posible

No es necesario suponer que es la única inversión. Lo que se demuestra es que mediante sucesivas inversiones se puede llegar a nuestra solución sin empeorar el resultado, y por tanto, es óptima. Se complementa con el hecho de que en caso de empate en el ratio, la inversión no cambia el resultado.

Por lo tanto, la solución sin inversiónes es la óptima.

Lo que se debe mencionar es que se parte desde una hipótetica solución óptima, y solamente aplicando inversiones que nunca pueden empeorar se llega a nuestra solución sin inversiones, por tanto óptima.

Se puede notar que los
criterios por peso y por tiempo tienen resultados similares pero ninguno es mejor que el otro. Sin
embargo el criterio por ratio siempre es menor que los otros dos.

La demostración teórica es suficiente a nivel teórico para entender que no puede existir mejor asignación. Si se quiere ver desde el lado empírico, está bueno ver que los otros criterios barajados no pueden ser nunca mejores al óptimo.
Lo que no quita que, a nivel empírico, existen muchas más posibles permutaciones del orden de la solución, y que alguna podría ser mejor que la encontrada, si ignoraramos nuestra demostración teórica.
Eso en rigor quiere decir que una prueba empírica debería plantear escenarios y comparar con todas las posibles permutaciones de orden, para ver que ninguna es mejor que la que se entiende como óptima.

Medición con conjuntos de datos aleatorios

No estaría de más superponer los dos gráficos para poder ver qué tanto coinciden

Por otro lado, están teniendo bastante ruido las mediciones. En la metodología hacen un promedio de 5 corridas para cada punto a tomar, recomendaría sacar el promedio para una mayor cantidad de corridas para disminuir el ruido

A considerar para futuros tps

La primera consideración sería que cada punto del trabajo se plantea un desafío que debe ser considerado, percibo que si bien se buscó responder a todos los interrogantes, los puntos de demostración, análisis de variabilidad y mediciones tuvieron los comentarios que ya les dejé. Naturalmente la nota se ve afectada por la calidad de lo presentado

En análisis de variabilidad respecto a los tiempos debe pensarse en función de las distintas variables del problema. Suma hacer el análisis en este caso dejando fijo ti y variando bi; luego dejando fijo bi y variando ti; dejando fijo el cociente.
Todos estos aspectos ayudan a detectar qué elemento podría tener más preponderancia en la complejidad, atención a ello.

Por eso es importante en este punto analizar qué aspectos del problema y la solución pueden ser relevantes.
Por ejemplo, el sort de python está muy optimizado, y puede darse cuenta en O(n) que el arreglo ya está ordenado. Por lo tanto, dentro de esta variabilidad, si los elementos ya llegaban ordenados se podía llegar a percibir un comportamiento O(n). Faltó considerar este aspecto dentro de la posible variabilidad.

En cuanto a las mediciones temporales, recomendaría que muestren un poco más su metodología.
Dejo algunas recomendaciones generales:

  • por cada tamaño de problema probar la ejecución de varias más corridas que las seleccionadas, y luego tomar un promedio del tiempo transcurrido
  • si la solución tiene varias partes, como en este caso 1ro ordenamiento y 2do cálculo de la sumatoria, tomar medidas temporales de cada paso, para verificar la complejidad de cada uno por separado, y conectado a lo mencionado arriba, para los diferentes caso de variabilidad
  • definitivamente se debe comparar con una curva teórica. Dados los resultados, se afirmó que con el O(n log n) teórico. Pero se debe trazar la curva teórica con mayor superposición para poder afirmarlo.
  • Para cada caso que identifiquen de variabilidad hacer el propio gráfico de mediciones. Distinguir entre casos que ya llegan ordenados y casos que no; caso de bi fijo con ti variable; de ti fijo con bi variable; etc.

Saludos!

TP2 Aprobado: 8 (Ocho)

La calidad del trabajo es muy buena y el nivel de detalle de las descripciones en casi todas las secciones hizo muy placentero de leer el trabajo.

La reducción de nota en este caso para un trabajo que de otra manera sería excelente, se debe a los 2 puntos del enunciado que solicitan el análisis de Variabilidad de los Valores, que entiendo que no se le prestó la atención debido al desafío que los puntos plantean.

Aquí les dejo todos los comentarios:

E - Lista de Carga de Energía de los Dai Li

La condición de monótona creciente también se puede expresar matemáticamente

Debido a la naturaleza combinatoria del problema, una manera de encararlo es utilizar el
enfoque de programación dinámica.

Suma aclarar de dónde proviene esa naturaleza combinatoria, y es que en cada minuto se puede tomar la decisión de cargar o atacar, lo cual resulta en un espacio exponencial de posibles soluciones.

Con esta idea, se puede inferir que en un ataque de cualquier tamaño, los Dai Li atacarán al
menos una vez pues ese valor será mayor a cero.

Aquí mismo se podría desprender que atacar en el último minuto siempre es conveniente, ya que no tiene sentido cargar para un ataque que no existirá.
Esta observación sí esta presente después

Tanto para construir la estrategia
óptima como para calcular la cantidad total de enemigos eliminados, se debe iterar cada minuto
una sola vez. Para la primera, se itera de forma descentente y para la segunda de forma ascendente.
Ambas secciones tienen entonces una complejidad de O(n).

Se puede aclarar que en cada paso de la iteración se hacen operaciones de orden constante

Variabilidad de Valores

Esto es algo a analizar tanto desde el punto de optimalidad como de complejidad algorítmica.

Para la optimalidad, si se quiere demostrar se requeriría un análisis del tipo inductivo.

Para la complejidad, es necesario pensar si los valores afectan a la complejidad. Se interpreta a nivel teórico que al depender únicamente de n, que no debería afectar. Pero luego corresponde hacer el análisis empírico variando los valores para verificarlo.
Por otro lado, dependiendo de cómo se haga la reconstrucción, la cantidad de ataques o cargas puede afectar la complejidad y eso sería un caso de variabilidad. En su solución esto no afecta, pero sí debería incluirse el por qué en el análisis.

Mediciones Temporales

Como les comenté en el tp1, en este caso hay dos secciones de algoritmo bien marcadas, la búsqueda de los valores óptimos y la reconstrucción. Siendo que la solución tiene varias partes, habría que hacer un análisis empírico de una y otra por separado.

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.