Programación Dinámica: Subset Sums, Knapsacks, Camino Mínimo Flashcards

1
Q

Explique el problema de Subset Sums

A

Sea un conjunto de n elementos E = {e1, ..., en}, donde cada elemento ei cuenta con un peso asociado wi.

Queremos seleccionar un subset de elementos de E con el mayor peso posible que no supere un valor W de peso máximo.

Es el problema de la mochila, básicamente. Una versión sencilla del mismo, sin ganancias, sólo peso.

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
2
Q

Subset Sums: Explique la solución por fuerza bruta y su complejidad temporal.

A

La solución por fuerza bruta consiste en combinar todos los elementos entre sí. Esto es 2^n.

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
3
Q

Subset Sums: Explique la solución dinámica.

A

Si ei pertenece a la solución, se consume wi del peso disponible.

Entonces:

  • Si ei está en la solución, maxPeso(ei, W) = wi + maxPeso(e(i-1), W-wi)
  • Si ei no está en la solución, maxPeso(ei, W) = maxPeso(e(i-1), W)

Por lo que la solución óptima en ei es el máximo entre el peso que incluye a ei y el peso que no incluye a ei.

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
4
Q

Subset Sums: Explique los subproblemas y la recurrencia

A

Vamos a llamar maxPeso(i,p) al problema de determinar el peso máximo que no supere a p, utilizando como posibles elementos del óptimo a los primeros i del conjunto.

La recurrencia se da de la forma:

maxPeso(i,p) = 0, si (i=0) o (p=0)

maxPeso(i,p) = max { (wi+maxPeso(i-1,p-wi)) o (maxPeso(i-1,p) }, si (i>0) y (p>0).
How well did you know this?
1
Not at all
2
3
4
5
Perfectly
5
Q

Subset Sums: Explique el pseudocódigo de la solución iterativa, junto con su complejidad temporal y espacial

A
Con i desde 0 a n:
        OPT[i][0] = 0

Con p desde 0 a W:
        OPT[0][p] = 0

Con i desde 1 a n:
        Con p desde 1 a w:

                opt_usando_elem = w[i] + OPT[ i-1, p - w[i]]
                opt_sin_elem = OPT[i-1,p]

                Si opt_usando_elem > opt_sin_elem:
                        OPT[i][p] = opt_usando_elem
                De lo contrario:
                        OPT[i][p] = opt_sin_elem

Retornar OPT[n][W]
  1. Para todos los elementos, si el peso W es 0, el óptimo es 0.
  2. Para todos los pesos, si el elemento es el 0, el óptimo también es 0.
  3. Recorro todos los elementos, y todos los pesos para cada elemento.

a. Me fijo si el óptimo de usar el elemento (peso_elem + (OPT del anterior sin el peso del elemento) ) es mayor al óptimo sin el elemento (OPT acumulado del anterior).
b. Me quedo con el que sea mayor, y lo guardo para el elemento i y el peso p actual.

  1. Al final, devuelvo el OPT en el elemento n y peso W.

Complejidad
La complejidad temporal es O(n * W)
La complejidad espacial es O(n * W)

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
6
Q

Resolver Subset Sum:

i, w
1, 1
2, 2
3, 4

W = 5

A

OPT = 6

elecciones: 3, 2

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
7
Q

Knapsacks: Explique el problema

A

Sea un conjunto de n elementos E = {e1, ..., en} donde cada elemento ei cuenta con un peso asociado y una ganancia vi, queremos seleccionar un subset de elementos de E con la mayor ganancia posible que no supere un valor W de peso máximo.

Llamaremos maxGanancia(i,p) al problema de determinar la ganancia máxima que no supere p, utilizando los primeros i elementos del conjunto.

Es básicamente el problema de la mochila con ganancias.

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
8
Q

Knapsacks: Explique la solución por recurrencia

A

Podemos plantear que:

  • Si ei pertenece a la solución, entonces maxGanancia(ei, w) = vi + maxGanancia(e(i-1),W - wi).
  • Si ei no pertenece a la solución, entonces maxGanancia(ei, w) = maxGanancia(e(i-1),W).

Es decir, si el elemento no pertenece a la solución, la ganancia máxima es la ganancia máxima del anterior.
Si el elemento pertenece a la solución la ganancia máxima es la ganancia del actual + la ganancia del anterior sin incluir el peso del elemento.

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
9
Q

Knapsacks: Explique el pseudocódigo de la solución Iterativa, junto con su complejidad temporal y espacial.

A
Con i desde 0 a n:
       OPT[i][0] = 0

Con p desde 0 a W:
       OPT[0][p] = 0

Con i desde 1 a n:
       Con p desde 1 a W:
              
              opt_con_elem = v[i] + OPT[ i-1, p - w[i]]
              opt_sin_elem = OPT[i-1, p]

              Si opt_con_elem > opt_sin_elem:
                            OPT[i][p] = opt_con_elem
              De lo contrario:
                            OPT[i][p] = opt_sin_elem

Retornar OPT[n][W]

Es el mismo pseudocódigo de Subset Sum, pero en vez de buscar el peso máximo, buscamos la ganancia máxima sin pasarnos del peso.

La complejidad temporal es de O(n * W)
La complejidad espacial es de O(n * W)

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
10
Q

Resolver:
Knapsack

i, w, v
1, 1, 3
2, 2, 4
3, 4, 2

W = 5

A

Ganancia total
7

Elementos usados de la lista:
(1,1,0)

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
11
Q

Ejercicio de Final

Resolver: Para un nuevo satélite a poner en órbita una empresa privada puede optar por incluir diversos sensores a bordo (por ejemplo: variación de temperatura, humedad en tierra, caudal de ríos, etc).
Cada uno de ellos tiene un peso “pi” y una ganancia “gi” calculado por su uso durante la vida útil del satélite. Si bien les gustaría incluir todos, el satélite tiene una carga máxima P que puede llevar.

Nos piden que generemos un algoritmo (utilizando programación dinámica) para resolver el problema.

Incluya definición del problema, relación de recurrencia y pseudocódigo. Indique si su
solución es polinomial.

A

Knapsack.

Sea un conjunto de n elementos E = {e1, ..., en} donde cada elemento ei cuenta con un peso asociado y una ganancia vi, queremos seleccionar un subset de elementos de E con la mayor ganancia posible que no supere un valor W de peso máximo.

Llamaremos maxGanancia(i,p) al problema de determinar la ganancia máxima que no supere p, utilizando los primeros i elementos del conjunto.

Es básicamente el problema de la mochila con ganancias.

Para la relación de recurrencia, podemos plantear que:

  • Si ei no pertenece a la solución, entonces maxGanancia(ei, w) = maxGanancia(e(i-1),W).
  • Si ei pertenece a la solución, entonces maxGanancia(ei, w) = vi + maxGanancia(e(i-1),W - wi).

Es decir, si el elemento no pertenece a la solución, la ganancia máxima es la ganancia máxima del anterior.
Si el elemento pertenece a la solución la ganancia máxima es la ganancia del actual + la ganancia del anterior sin incluir el peso del elemento.

Con i desde 0 a n:
       OPT[i][0] = 0

Con p desde 0 a W:
       OPT[0][p] = 0

Con i desde 1 a n:
       Con p desde 1 a W:
              
              opt_con_elem = v[i] + OPT[ i-1, p - w[i]]
              opt_sin_elem = OPT[i-1, p]

              Si opt_con_elem > opt_sin_elem:
                            OPT[i][p] = opt_con_elem
              De lo contrario:
                            OPT[i][p] = opt_sin_elem

Retornar OPT[n][W]

Es el mismo pseudocódigo de Subset Sum, pero en vez de buscar el peso máximo, buscamos la ganancia máxima sin pasarnos del peso.

La complejidad temporal es de O(n * W)
La complejidad espacial es de O(n * W)

La complejidad es pseudopolinomial.

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
12
Q

Camino Mínimo: Explique qué son los ciclos negativos

A

Si existe un costo negativo, utilizar una arista puede disminuir el costo del camino total.

Sean los nodos A = a1, ..., an tal que existen las aristas ai -> a(i+1), conformando un ciclo c donde la suma de todas las aristas es menor a cero.

A este ciclo lo llamaremos ciclo negativo C.

La existencia de un ciclo negativo dentro de un camino s-t genera un camino mínimo de -infinito.

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
13
Q

Camino Mínimo: Explique la solución por fuerza bruta

A

Si queremos solucionar por fuerza bruta, podemos calcular todos los costos de los caminos posibles de s a t con longitud 1.
Luego con longitud 2, 3 y así hasta llegar a n-1.

El camino mínimo tendrá una longitud de n-1 como máximo.

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
14
Q

Camino Mínimo: Explique el algoritmo de Bellman Ford

A

Es un algoritmo para camino mínimo para casos de grafos ponderados sin ciclos negativos, utilizando programación dinámica.

Para llegar desde s a un nodo ni, puede haber utilizado diferentes caminos, dependiendo de sus predecesores. Y a los predecesores les pasa lo mismo, se puede llegar desde predecesores diferentes.

Para llegar de s a ni en j pasos, tengo que haber pasado por sus predecesores en j-1 pasos.

Al camino mínimo hasta el nodo ni con longitud máxima j lo vamos a llamar minPath(ni,j).
Es el camino mínimo hasta el nodo ni con una longitud que puede ir desde 0 a j.

Este camino es el mínimo entre todos los caminos mínimos que llegan a sus predecesores en un máximo de j-1.

Definimos entonces:

minPath(ni,j) = min {
                                       minPath(ni, j-1),
                                       min {
                                                minPath(nx, j-1) + w(nx,j-1)
                                                }
                                       }

siendo nx predecesores de ni.

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
15
Q

Camino Mínimo: Explique los subproblemas de la recurrencia

A

Llegar a s tiene costo 0
minPath(s,j) = 0

Llegar a ni con 0 pasos tiene costo +inf:
minPath(ni,0) = +inf ; si ni != s

Llegar a ni con j pasos es el mínimo entre: el costo mínimo de llegar a ni con j-1 pasos, y el mínimo de todos los costos de llegar a los predecesores con j-1 pasos + el costo de pasar del predecesor a ni (el eje):

minPath(ni,j) = min {
                                       minPath(ni, j-1),
                                       min {
                                                minPath(nx, j-1) + w(nx,j-1)
                                                }
                                       }

siendo nx predecesores de ni.

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
16
Q

Camino Mínimo: explique el pseudocódigo de la solución iterativa. ¿Qué complejidad tiene?

A

Siendo:
- L la longitud máxima posible
- v el número de vértice

Con L desde 0 a n-1:
       OPT[L][0] = 0

Con v desde 0 a n-1:
       OPT[0][v] = +inf

Con L desde 1 a n-1:
       Con v desde 1 a n-1:

              OPT[L][v] = OPT[L-1][v]
              
              Por cada p predecesor de v:
                     Si OPT[L][v] > OPT[L-1][p] + w(p, v):
                            OPT[L][v] = OPT[L-1][p] + w(p, v)

Retornar OPT[n-1][n]
  1. Para todas las longitudes, llegar al vértice 0 tiene costo 0.
  2. Para llegar a todos los vectores con longitud 0, el costo es infinito.
  3. Recorro todas las longitudes, y todos lo vectores.

a. Digo que el costo óptimo de llegar al actual, es el costo óptimo de llegar al mismo con la longitud anterior.
b. Para cada uno de los predecesores, comparo el óptimo actual, con el costo óptimo de llegar al predecesor con la longitud anterior + el peso de la arista que los conecta.
c. Si en algún caso, el óptimo actual es mayor al obtenido por el camino de un predecesor, se actualiza el valor del óptimo.

  1. Retornamos el valor del óptimo para el largo n-1 y el nodo n.

=> Este algoritmo funciona muy bien cuando tenemos costos negativos en las aristas.

=> Complejidad Temporal: O( E * n ), E aristas y n nodos.
Complejidad Espacial: O(E * n), por el tamaño de la matriz.

17
Q

Camino Mínimo: ¿Cómo se pueden reconstruir las elecciones?

A

Basta con agregar un vector “pred” de longitud n, que almacene en la posición i desde qué predecesor se llega actualmente a ni, con el menor costo desde s.

Al finalizar la ejecución, se itera desde pred[n] con n=t.

18
Q

Camino Mínimo: ¿Cómo podemos detectar si tenemos un ciclo negativo usando Bellman Ford?

A

Si ejecutamos una iteración adicional buscando un camino de longitud n y cambia al menos el mínimo de un nodo, significa que el grafo tiene un ciclo negativo.

19
Q

Resolver camino mínimo con Bellman Ford para el grafo de las siguientes aristas:

nodo_i nodo_f costo
S A 4
S B 1
S C 2
A D 3
B E 5
C B -3
D B -2
D T 4
E C -3
E T 3

A

Camino mínimo en la 6ta iteración: 7

Existe ciclo negativo.