Cubierta de vertices, busqueda ávida y exhaustiva

16
PROBLEMA NP- COMPLETO Búsqueda ávida y exhaustiva para encontrar el conjunto independiente máximo y la cubierta mínima de vértices. BENEMÉRITA UNIVERSIDAD AUTÓNOMA DE PUEBLA MCC 2015 Luis Alfredo Moctezuma Pascual

Transcript of Cubierta de vertices, busqueda ávida y exhaustiva

Page 1: Cubierta de vertices, busqueda ávida y exhaustiva

PROBLEMA NP- COMPLETO Búsqueda ávida y exhaustiva para encontrar el

conjunto independiente máximo y la cubierta mínima

de vértices.

BENEMÉRITA UNIVERSIDAD AUTÓNOMA DE PUEBLA

MCC 2015

Luis Alfredo Moctezuma Pascual

Page 2: Cubierta de vertices, busqueda ávida y exhaustiva

Usar técnicas para minimizar el tiempo de respuesta pero no es

optimo ya que no muestra el mejor resultado.

a) Encontrar el conjunto independiente 𝑆 ⫃ 𝑉 de longitud máxima

, esto es

S = max 𝑆 ⫃ 𝑉 𝑆 𝑒𝑠 𝑢𝑛 𝑐𝑜𝑛𝑗𝑢𝑛𝑡𝑜 𝑖𝑛𝑑𝑒𝑝𝑒𝑛𝑑𝑖𝑒𝑛𝑡𝑒 𝑒𝑛 𝐺}

b) Encontrar la cubierta de vertices 𝑉′ ⫃ 𝑉 de longitud mínima

V′ = min 𝑌 ⫃ 𝑉 𝑦 𝑒𝑠 𝑢𝑛𝑎 𝑐𝑢𝑏𝑖𝑒𝑟𝑡𝑎 𝑑𝑒 𝑣𝑒𝑟𝑡𝑖𝑐𝑒𝑠 𝑒𝑛 𝐺}

c) Encontrar el cliqué de longitud máxima en G

C = max 𝐶′ ⫃ 𝑉 𝐶′𝑒𝑠 𝑢𝑛 𝑐𝑙𝑖𝑞𝑢é 𝑒𝑛 𝐺}

Page 3: Cubierta de vertices, busqueda ávida y exhaustiva

Estos 3 problemas están relacionados, bajo una reducción de

orden polinomial.

La unión del conjunto independiente máximo y la cubierta

mínima de vértices cubre todo V(G).

S + 𝑉′ = V G = n

Resolver uno de los dos problemas, permite resolver el otro, ya

que 𝑆 = 𝑉 − 𝑉′ 𝑉′ = 𝑉 − 𝑆 Nota: Construir 𝐺𝑐(𝑔𝑟𝑎𝑓𝑜 𝑐𝑜𝑚𝑝𝑙𝑒𝑚𝑒𝑛𝑡𝑜) a partir de G, se realiza en tiempo polinomial.

Page 4: Cubierta de vertices, busqueda ávida y exhaustiva

BUSQUEDA ÁVIDA

Una estrategia ávida para saber de manera directa el conjunto independiente máximo es: seleccionar los nodos de menor grado y eliminar a los nodos con los que está conectado: Encontrar el conjunto independiente máximo: Paso 1: Buscar y seleccionar el nodo de menor grado,{1,8}, en este ejemplo seleccionaremos el nodo 1. Paso 2: Agregarlo a la lista y eliminar a sus vecinos Lista=[1] Paso 3: Repetir paso 1 y 2,mientras exista un nodo.

sq

ue

da

ávid

a 2

3

4

5

6

7

8 1

4

5

6

7

8

Page 5: Cubierta de vertices, busqueda ávida y exhaustiva

Pasos recursivos 1, 2 y 3 Paso 1: Paso 2: Lista=[1,8,] Paso 3: como aun existen nodos, repetimos los pasos 1,2 y 3 Paso 1: Paso 2: Lista=[1,8,4] Paso 3: Ya no hay nodos, regresar lista[]

sq

ue

da

ávid

a

4

5

4

5

6

7

8

4

5

Page 6: Cubierta de vertices, busqueda ávida y exhaustiva

Algoritmo: CIMax(grafo)

Mientras grafo[nodo]!= null para nodo en grafo aux=min(count(vertices[nodo])) fin lista.add(nodo.equal(aux)) grafo.delete(vecinos[nodo.equal(aux)])// Eliminar vecinos fin

Regresar lista

sq

ue

da

ávid

a

Page 7: Cubierta de vertices, busqueda ávida y exhaustiva

Cubierta mínima de vertices

𝑆 = 𝑉 − 𝑉′ 𝑉′ = 𝑉 − 𝑆 S=[1,8,4] V=[1,2,3,4,5,6,7,8] 𝑉′ = [1,2,3,4,5,6,7,8] − [1,8,4] = [2,3,5,6,7] Donde v’ es la cubierta mínima de vértices.

2

3

4

5

6

7

8 1

sq

ue

da

ávid

a

Page 8: Cubierta de vertices, busqueda ávida y exhaustiva

sq

ue

da

ex

ha

us

tiva

BUSQUEDA EXHAUSTIVA

La búsqueda exhaustiva o por fuerza bruta consiste en enumerar (crear un árbol) todos los posibles candidatos para la solución de un problema y comprobar si el resultado esta entre todos los candidatos encontrados. Encontrar el conjunto independiente máximo: Validación: Si numVertices<=1, agregar nodos a la lista.

Sino hacer pasos 1 y 2. Paso 1: Seleccionar el nodo de mayor grado, bifurcar el arbol a partir de ese nodo. Paso 2 - Caso 1: si el nodo pertenece, agregar el nodo a la lista y eliminar a sus vecinos. Lista=[4] Paso 2 - Caso 2: si el nodo no pertenece, eliminar el nodo y repetir el paso 1. Regresar la lista

2

3

4

5

6

7

8

8 1

2

3 5

6

7

8

Page 9: Cubierta de vertices, busqueda ávida y exhaustiva

sq

ue

da

ex

ha

us

tiva

Repetir el proceso para cada subgrafo

Subgrafo 1

Validación: Si numVertices<=1, agregar nodos a la lista.

Sino hacer pasos 1 y 2. Lista=[4,8] Regresar la lista

8

Page 10: Cubierta de vertices, busqueda ávida y exhaustiva

sq

ue

da

ex

ha

us

tiva

Repetir el proceso para cada subgrafo

Subgrafo 2

Validación: Si numVertices<=1, agregar nodos a la lista. Sino hacer pasos 1 y 2. Paso 1: Seleccionar el nodo de mayor grado, bifurcar el arbol a partir de ese nodo. Paso 2 - Caso 1: si el nodo pertenece, agregar el nodo a la lista y eliminar a sus vecinos. Lista=[5] Paso 2 - Caso 2: si el nodo no pertenece, eliminar el nodo y repetir el paso 1.

2

3 5

6

7

8

2

3 5

6

7

8

8

2

3

6

7

8

Page 11: Cubierta de vertices, busqueda ávida y exhaustiva

sq

ue

da

ex

ha

us

tiva

Repetir el proceso para cada subgrafo

Subgrafo 2.1

Validación: Si numVertices<=1, agregar nodos a la lista.

De lo contrario hacer pasos 1 y 2. Lista=[5,8]

Regresar lista

8

Page 12: Cubierta de vertices, busqueda ávida y exhaustiva

sq

ue

da

ex

ha

us

tiva

Repetir el proceso para cada subgrafo

Subgrafo 2.2

Validación: Si numVertices<=1, agregar nodos a la lista. Sino hacer pasos 1 y 2. Paso 1: Seleccionar el nodo de mayor grado, bifurcar el arbol a partir de ese nodo. Paso 2 - Caso 1: si el nodo pertenece, agregar el nodo a la lista y eliminar a sus vecinos. Lista=[8] Paso 2 - Caso 2: si el nodo no pertenece, eliminar el nodo y repetir el paso 1.

2

3

6

7

8

2

3

6

7

8

2

3

2

3

6

7

Page 13: Cubierta de vertices, busqueda ávida y exhaustiva

sq

ue

da

ex

ha

us

tiva

Repetir el proceso para cada subgrafo

Subgrafo 2.2.1

Validación: Si numVertices<=1, agregar nodos a la lista. Sino hacer pasos 1 y 2. Lista=[8,2,3] Regresar lista

2

3

Page 14: Cubierta de vertices, busqueda ávida y exhaustiva

sq

ue

da

ex

ha

us

tiva

Repetir el proceso para cada subgrafo

Subgrafo 2.2.2

Validación: Si numVertices<=1, agregar nodos a la lista. Sino hacer pasos 1 y 2. Lista=[2,3,6,7] Regresar lista

2

3

6

7

Page 15: Cubierta de vertices, busqueda ávida y exhaustiva

sq

ue

da

ex

ha

us

tiva

Algoritmo CIMax(grafo) Si numVertices<=1

lista.add(nodos)

si grafo== null

resultado=max(coleccionLista[lista.lenght])

fin

Sino hacer caso 1 y 2 para nodo en grafo

aux=max(count(vertices[nodo])) fin

caso 1: lista.add(nodo.equal(aux)) grafo.delete(vecinos[nodo.equal(aux)])// Eliminar vecinos CIMax(grafo) fin caso 2: grafo.delete(nodo.equal(aux))// Eliminar nodo CIMax(grafo) fin fin si Regresar lista

Page 16: Cubierta de vertices, busqueda ávida y exhaustiva

Cubierta mínima de vertices

𝑆 = 𝑉 − 𝑉′ 𝑉′ = 𝑉 − 𝑆 S=[2,3,6,7] V=[1,2,3,4,5,6,7,8] 𝑉′ = [1,2,3,4,5,6,7,8] − [2,3,6,7] = [4,5,8] Donde v’ es la cubierta mínima de vertices.

2

3

4

5

6

7

8

sq

ue

da

ex

ha

us

tiva