From 891855d18f8e5ecc7be0d814b60eba9098a93481 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Mart=C3=ADn=20Buchwald?= Date: Sun, 12 Jan 2025 11:53:00 -0300 Subject: [PATCH 1/9] Propuesta tp3 --- tps/2025_1/tp3.md | 133 ++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 133 insertions(+) create mode 100644 tps/2025_1/tp3.md diff --git a/tps/2025_1/tp3.md b/tps/2025_1/tp3.md new file mode 100644 index 0000000..62e7ee6 --- /dev/null +++ b/tps/2025_1/tp3.md @@ -0,0 +1,133 @@ +--- +math: true +--- + +{% assign tp = site.data.trabajos.TP3 %} +{% capture fecha %}{{tp.entrega | date: "%e/%m"}}{% endcapture %} + +# Trabajo Práctico 3: Comunidades NP-Completas + +El presente trabajo busca evaluar el desarrollo y análisis de un algoritmo +de Backtracking para resolver un Problema NP-Completo, así como el análisis +de posibles aproximaciones. +La fecha de entrega del mismo es el {{fecha}}. + +## Introducción + +Luego de los grandes resultados obtenidos en los trabajos anteriores, fuimos nuevamente ascendidos. +Ahora somos la mano derecha del Gringo (que dejó de decirnos cada 3 palabras cosas de desayunar con peces). + +En función de poder evitar que situaciones así vuelvan a suceder, obtuvo la información de qué +integrante de la organización es cercano a otro. Con esta información construyó un grafo no dirigido y no +pesado (vértices: personas, aristas: si las personas son cercanas). Nos pidió que separemos el grafo +en comunidades. Es decir, separar los vértices en $K$ clusters (grupos). + +Todo venía bien, nuestra primera idea era la de maximizar la distancia mínima entre comunidades, lo cual +puede resolverse con un algoritmo de árboles de tendido mínimo (y siendo este grafo no pesado, aún más fácil), +pero Amarilla Pérez nos indicó que esa métrica da muy malos resultados. Que en vez de esto, mejor minimizar +la distancia máxima entre dos vértices dentro de la misma comunidad. + +Pasamos de un un problema que hasta se podía resolver de forma lineal, a un problema que, creemos, es NP-Completo. +Debemos convencer a Amarilla Pérez de que esta no es una buena idea, que demorará mucho. Para esto, igualmente, vamos +a tener que venir con demostraciones, mediciones, y al menos una alternativa... + + +## Consigna + +Para los primeros dos puntos considerar la versión de decisión del problema de _Clustering por bajo diámetro_: +Dado un grafo no dirigido y no pesado, un vértice $k$ y un valor $C$, ¿es posible separar los vértices +en a lo sumo $k$ grupos/clusters disjuntos, de tal forma que todo vértice pertenezca a un cluster, y que la distancia +máxima dentro de cada cluster sea a lo sumo $B$? (Si un cluster queda vacío o con un único elemento, considerar la +distancia máxima como 0). + +Al calcular las distancias se tienen en cuenta tanto las aristas entre vértices dentro del cluster, como cualquier otra +arista dentro del grafo. + + +1. Demostrar que el Problema de Clustering por bajo diámetro se encuentra en NP. + +2. Demostrar que el Problema de Clustering por bajo diámetro es, en efecto, un problema NP-Completo. + Si se hace una reducción involucrando un problema no visto en clase, agregar una + (al menos resumida) demostración que dicho problema es NP-Completo. + +3. Escribir un algoritmo que, por backtracking, obtenga la solución óptima al problema (valga la + redundancia) en la versión de optimización: Dado un grafo no dirigido y no pesado, y un valor $k$, + determinar los $k$ clusters para que la distancia máxima de cada cluster sea mínima. Para esto, considerar + minimizar la sumatoria de todas las distancias máximas. + + Generar sets de datos para corroborar su correctitud, así como tomar mediciones de tiempos. + +4. Escribir un modelo de programación lineal que resuelva el problema de forma óptima. + Recordar que el cálculo de las distancias mínimas se puede hacer previamente, y no ser + parte del modelo de programación lineal (problema muy sencillo de resolver con un algoritmo BFS, pero + no así con programación lineal). + + Implementar dicho modelo, y ejecutarlo el modelo para los mismos sets de datos para corroborar su correctitud. + Tomar mediciones de tiempos y compararlas con las del algoritmo que implementa Backtracking. + +5. Ya pudiendo mostrar que no es una buena idea trabajar con estas métricas para obtener las comunidades + de una organización tan grande, la agente T nos recomendó analizar la posibilidad de no clusterizar + por bajo diámetro, sino minimizando la Modularidad. + + > ¿La qué? + + La modularización es una métrica para definir la densidad de aristas dentro de una comunidad. En una comunidad + real, hay un alto coeficiente de clustering. Básicamente, hay muchos triángulos; es decir, amigos en común. + Esto se manifiesta en tener que una comunidad tiene necesariamente muchas aristas dentro de la misma, y al mismo + tiempo pocas _hacia afuera_. + Podemos definir la modularidad como: + + $$ Q = \frac{1}{2m} \sum_i \sum_j \left(peso(v_i, v_j) - \frac{k_ik_j}{2m}\right) \delta(c_i, c_j) $$ + + Donde: + + * $peso(v_i, v_j)$: el peso de la arista entre $i$ y $j$ (0 si no están unidos, y en nuestro caso 1 sí si lo están). + * $k_i$: es la suma de las aristas del vértice $i$ (en nuestro caso, su grado). + * $2m$: es la suma de todos los pesos de las aristas. + * $c_i$: es la comunidad del vértice $i$. + * $\delta$: función delta de Kronecker, que es básicamente 1 si ambas comunidades son iguales, 0 si son diferentes. + + ¿El problema? Maximizar la modularización es también un problema NP-Completo. ¿Lo bueno? Es conocido un algoritmo + greedy que funciona muy bien para esto: [El Algoritmo de Louvain](https://en.wikipedia.org/wiki/Louvain_method). + Obviamos transcribir la descripción del algoritmo, que pueden leer allí, pero la agente T logró obtener + [una grabación de una clase de la facultad de ingeniería donde explicaban este algoritmo](https://www.youtube.com/watch?v=EbIC_wTP44Q&t=540s). Por supuesto, si les interesa el tema pueden revisar el video entero. + + + Implementar el algoritmo de Louvain para obtener una separación en $K$ clusters. Realizar mediciones para + determinar una cota empírica de aproximación al utilizar dicho algoritmo para aproximar al problema de + Clustering por bajo diámetro. Realizar esto con datos generados por ustedes, incluyendo potencialmente set + de datos de volúmenes inmanejable para los algoritmos antes implementados. + + +7. **Opcional**: Implementar alguna otra aproximación (o algoritmo greedy) que + les parezca de interés. Comparar sus resultados con los dados por la aproximación + del punto anterior. Indicar y justificar su complejidad. No es obligatorio + hacer este punto para aprobar el trabajo práctico (pero si resta un punto no hacerlo). + +8. Agregar cualquier conclusión que parezca relevante. + +## Entrega + +Debe enviarse al corrector asignado, por mail o slack, el link +al repositorio donde se encuentre el código fuente, y donde debe encontrarse +el informe en formato PDF, que debe seguir los lineamientos establecidos en el TP1 y TP2. +En este caso, la forma de ejecutar el programa debe ser: + +``` +./tp3 ruta/a/grafo.csv +``` +O bien: +``` +python3 tp3.py ruta/a/grafo.txt +``` + +Por ejemplo: +``` +python3 tp3.py 15-3.csv 3 +``` + +La nota del trabajo práctico tendrá en cuenta tanto la presentación y calidad de lo presentado, +como también el desarrollo del trabajo. No será lo mismo un trabajo realizado con lo mínimo +indispensable, que uno bien presentado, analizado, y probado con diferentes volúmenes, set de +datos, o estrategias de generación de sets, en el caso que corresponda. + From 5b79a5e81ced513e626387a197806cf3eb1988dd Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Mart=C3=ADn=20Buchwald?= Date: Sun, 12 Jan 2025 11:54:52 -0300 Subject: [PATCH 2/9] =?UTF-8?q?correccion=20r=C3=A1pida?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- tps/2025_1/tp3.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tps/2025_1/tp3.md b/tps/2025_1/tp3.md index 62e7ee6..1c06b8d 100644 --- a/tps/2025_1/tp3.md +++ b/tps/2025_1/tp3.md @@ -67,7 +67,7 @@ arista dentro del grafo. 5. Ya pudiendo mostrar que no es una buena idea trabajar con estas métricas para obtener las comunidades de una organización tan grande, la agente T nos recomendó analizar la posibilidad de no clusterizar - por bajo diámetro, sino minimizando la Modularidad. + por bajo diámetro, sino maximizando la Modularidad. > ¿La qué? From 7f2f07a8841949112a00488226738508b5976552 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Mart=C3=ADn=20Buchwald?= Date: Sun, 12 Jan 2025 11:55:43 -0300 Subject: [PATCH 3/9] prueba 1 --- tps/2025_1/tp3.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tps/2025_1/tp3.md b/tps/2025_1/tp3.md index 1c06b8d..0163901 100644 --- a/tps/2025_1/tp3.md +++ b/tps/2025_1/tp3.md @@ -77,7 +77,7 @@ arista dentro del grafo. tiempo pocas _hacia afuera_. Podemos definir la modularidad como: - $$ Q = \frac{1}{2m} \sum_i \sum_j \left(peso(v_i, v_j) - \frac{k_ik_j}{2m}\right) \delta(c_i, c_j) $$ + $$Q = \frac{1}{2m} \sum_i \sum_j \left(peso(v_i, v_j) - \frac{k_ik_j}{2m}\right) \delta(c_i, c_j)$$ Donde: From d6951968aa8a299809844ff858236bd93a2ed813 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Mart=C3=ADn=20Buchwald?= Date: Sun, 12 Jan 2025 12:01:39 -0300 Subject: [PATCH 4/9] complejidad --- tps/2025_1/tp3.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/tps/2025_1/tp3.md b/tps/2025_1/tp3.md index 0163901..67ab475 100644 --- a/tps/2025_1/tp3.md +++ b/tps/2025_1/tp3.md @@ -97,6 +97,8 @@ arista dentro del grafo. determinar una cota empírica de aproximación al utilizar dicho algoritmo para aproximar al problema de Clustering por bajo diámetro. Realizar esto con datos generados por ustedes, incluyendo potencialmente set de datos de volúmenes inmanejable para los algoritmos antes implementados. + Recomendamos leer la explicación de la complejidad del algoritmo, la cual no es sencilla (y por lo tanto, + no la pedimos aquí tampoco). 7. **Opcional**: Implementar alguna otra aproximación (o algoritmo greedy) que From c2a0c55c02e8e957b8662d0c9de3527c937a975b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Mart=C3=ADn=20Buchwald?= Date: Sun, 12 Jan 2025 12:01:57 -0300 Subject: [PATCH 5/9] mas complejidad --- tps/2025_1/tp3.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tps/2025_1/tp3.md b/tps/2025_1/tp3.md index 67ab475..56feaab 100644 --- a/tps/2025_1/tp3.md +++ b/tps/2025_1/tp3.md @@ -103,7 +103,7 @@ arista dentro del grafo. 7. **Opcional**: Implementar alguna otra aproximación (o algoritmo greedy) que les parezca de interés. Comparar sus resultados con los dados por la aproximación - del punto anterior. Indicar y justificar su complejidad. No es obligatorio + del punto anterior. Indicar y justificar su complejidad, en lo posible. No es obligatorio hacer este punto para aprobar el trabajo práctico (pero si resta un punto no hacerlo). 8. Agregar cualquier conclusión que parezca relevante. From b2d45a1d9bf1c595f2f14e81557a62c98ce1f2d9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Mart=C3=ADn=20Buchwald?= Date: Sun, 12 Jan 2025 12:09:26 -0300 Subject: [PATCH 6/9] mas diapos --- tps/2025_1/tp3.md | 1 + 1 file changed, 1 insertion(+) diff --git a/tps/2025_1/tp3.md b/tps/2025_1/tp3.md index 56feaab..fa98da0 100644 --- a/tps/2025_1/tp3.md +++ b/tps/2025_1/tp3.md @@ -91,6 +91,7 @@ arista dentro del grafo. greedy que funciona muy bien para esto: [El Algoritmo de Louvain](https://en.wikipedia.org/wiki/Louvain_method). Obviamos transcribir la descripción del algoritmo, que pueden leer allí, pero la agente T logró obtener [una grabación de una clase de la facultad de ingeniería donde explicaban este algoritmo](https://www.youtube.com/watch?v=EbIC_wTP44Q&t=540s). Por supuesto, si les interesa el tema pueden revisar el video entero. + Dejamos también un link [a las diapositivas de dicha clase](https://docs.google.com/presentation/d/1FLXTYtSDeMLxNOa9xW_zjEb2FhJIgZzXWuxvGHUxP5I/edit#slide=id.gae5b01dea1_1_36). Implementar el algoritmo de Louvain para obtener una separación en $K$ clusters. Realizar mediciones para From 12c67479b9c151e326a78131bbbf1c5ababbe84b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Mart=C3=ADn=20Buchwald?= Date: Sun, 12 Jan 2025 12:12:30 -0300 Subject: [PATCH 7/9] link paper --- tps/2025_1/tp3.md | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/tps/2025_1/tp3.md b/tps/2025_1/tp3.md index fa98da0..941afe0 100644 --- a/tps/2025_1/tp3.md +++ b/tps/2025_1/tp3.md @@ -87,10 +87,12 @@ arista dentro del grafo. * $c_i$: es la comunidad del vértice $i$. * $\delta$: función delta de Kronecker, que es básicamente 1 si ambas comunidades son iguales, 0 si son diferentes. - ¿El problema? Maximizar la modularización es también un problema NP-Completo. ¿Lo bueno? Es conocido un algoritmo - greedy que funciona muy bien para esto: [El Algoritmo de Louvain](https://en.wikipedia.org/wiki/Louvain_method). + ¿El problema? [Maximizar la modularización es también un problema NP-Completo](https://arxiv.org/pdf/physics/0608255). + ¿Lo bueno? Es conocido un algoritmo greedy que funciona muy bien para esto: + [El Algoritmo de Louvain](https://en.wikipedia.org/wiki/Louvain_method). Obviamos transcribir la descripción del algoritmo, que pueden leer allí, pero la agente T logró obtener - [una grabación de una clase de la facultad de ingeniería donde explicaban este algoritmo](https://www.youtube.com/watch?v=EbIC_wTP44Q&t=540s). Por supuesto, si les interesa el tema pueden revisar el video entero. + [una grabación de una clase de la facultad de ingeniería donde explicaban este algoritmo](https://www.youtube.com/watch?v=EbIC_wTP44Q&t=540s). + Por supuesto, si les interesa el tema pueden revisar el video entero. Dejamos también un link [a las diapositivas de dicha clase](https://docs.google.com/presentation/d/1FLXTYtSDeMLxNOa9xW_zjEb2FhJIgZzXWuxvGHUxP5I/edit#slide=id.gae5b01dea1_1_36). From 11395253d7ae4e7ae737fcc77fc0ca18654c8b74 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Mart=C3=ADn=20Buchwald?= Date: Fri, 17 Jan 2025 17:40:17 -0300 Subject: [PATCH 8/9] Update tp3.md --- tps/2025_1/tp3.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/tps/2025_1/tp3.md b/tps/2025_1/tp3.md index 941afe0..244a9a4 100644 --- a/tps/2025_1/tp3.md +++ b/tps/2025_1/tp3.md @@ -53,7 +53,8 @@ arista dentro del grafo. 3. Escribir un algoritmo que, por backtracking, obtenga la solución óptima al problema (valga la redundancia) en la versión de optimización: Dado un grafo no dirigido y no pesado, y un valor $k$, determinar los $k$ clusters para que la distancia máxima de cada cluster sea mínima. Para esto, considerar - minimizar la sumatoria de todas las distancias máximas. + minimizar el máximo de las distancias máximas (es decir, de las distancias máximas de cada cluster, nos quedamos + con la mayor, y ese valor es el que queremos minimizar). Generar sets de datos para corroborar su correctitud, así como tomar mediciones de tiempos. @@ -135,4 +136,3 @@ La nota del trabajo práctico tendrá en cuenta tanto la presentación y calidad como también el desarrollo del trabajo. No será lo mismo un trabajo realizado con lo mínimo indispensable, que uno bien presentado, analizado, y probado con diferentes volúmenes, set de datos, o estrategias de generación de sets, en el caso que corresponda. - From e4a48be3b3f0d02e56db2ce586e81520c70c35e6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Mart=C3=ADn=20Buchwald?= Date: Wed, 14 May 2025 17:44:43 +0200 Subject: [PATCH 9/9] Update tp3.md --- tps/2025_1/tp3.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tps/2025_1/tp3.md b/tps/2025_1/tp3.md index 244a9a4..9dbb7db 100644 --- a/tps/2025_1/tp3.md +++ b/tps/2025_1/tp3.md @@ -101,7 +101,7 @@ arista dentro del grafo. determinar una cota empírica de aproximación al utilizar dicho algoritmo para aproximar al problema de Clustering por bajo diámetro. Realizar esto con datos generados por ustedes, incluyendo potencialmente set de datos de volúmenes inmanejable para los algoritmos antes implementados. - Recomendamos leer la explicación de la complejidad del algoritmo, la cual no es sencilla (y por lo tanto, + Recomendamos leer la explicación de la complejidad del algoritmo, la cual no es sencilla (y, por lo tanto, no la pedimos aquí tampoco).