Cubierta de vertices, busqueda ávida y exhaustiva

Post on 14-Feb-2017

250 views 2 download

Transcript of 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

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 𝐶′ ⫃ 𝑉 𝐶′𝑒𝑠 𝑢𝑛 𝑐𝑙𝑖𝑞𝑢é 𝑒𝑛 𝐺}

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.

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

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

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

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

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

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

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

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

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

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

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

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

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