• Nenhum resultado encontrado

PROCEDIMENTO 8 – REPARAÇÃO.DE CAMINHO

6.2 OPERADORES

6.2.1 Procedimento Reestruturação

O operador de reestruturação funciona trabalhando com uma solução. Gera uma nova solução a partir do intervalo de reestruturação definido por dois pontos extremos no caminho da solução inicial. Como exemplo de reestruturação é considerado, na Figura 22, uma solução construída a partir da posição inicial 0 (zero) do grafo grade 4x4.

Figura 22 – Grafo grade 4x4 e solução inicial (S*).

Primeiro, o tamanho do intervalor de restruturação e o vértice extremo inicial são definidos para selecionar o intervalo de reestruturação no caminho da solução inicial (S*). No exemplo, na Figura 22 (b), supondo o tamanho do intervalo de reestruturação com 60% dos vértices do caminho e o extremo inicial (vértice 0); logo, temos o seguinte intervalo de reestruturação (0-1-2-6-10-9-5-4-8).

Segundo, o grafo grade 4x4 é marcado com os vértices do caminho do intervalo de reestruturação (0-1-2-6-10-9-5-4-8). No exemplo, na Figura 23 (a), o caminho da solução inicial (S*) é marcada no grafo grade 4x4, e na Figura 23 (b), as relações de vizinhança entre os vértices do intervalo de reestruturação são realizadas no grafo grade 4x4.

Figura 23 – Relação de adjacência do intervalo de reestruturação no grafo grade 4x4.

Terceiro, uma Busca em Profundidade é realizada a partir do extremo inicial 0 (zero) do grafo grade 4x4, na Figura 23 (b), com finalidade de construir um novo intervalo que terá os mesmos vértices extremos (inicial e final) e o mesmo tamanho do intervalo de reestruturação. No exemplo, o intervalo de reestruturação (0-1-2-6- 10-9-5-4-8) pode ser modificado para o novo intervalo (0-4-5-1-2-6-10-9-8).

Por último, o novo intervalo (0-4-5-1-2-6-10-9-8) substitui o intervalo de reestruturação (0-1-2-6-10-9-5-4-8) no caminho da solução inicial (S*); desta forma, a solução, Figura 24, é construída.

Figura 24 – Solução reestruturada.

O Procedimento 1 (reestruturacao ()) tem como entrada uma solução inicial (S*), um grafo grade G (matriz de adjacência), uma variável numérica (T) que define um valor porcentual para o tamanho do intervalo de reestruturação (assume valor máximo de 0,5); como saída, uma nova solução (Sr).

Na linha 1, a variável numérica (tamanho_intervalo) guarda um valor para o tamanho do intervalo de reestruturação. Na linha 2, a variável numérica

(indice_inicial_maximo) guarda um valor correspondente ao índice máximo para o extremo inicial no caminho da solução (S*).

Na linha 3, a variável numérica (in_extremo_inicial) armazena o índice com o extremo inicial para o intervalo de reestruturação. Na linha 4, a variável numérica (in_extremo_final) armazena o índice com o extremo final para o intervalo de reestruturação.

Na linha 6, o procedimento (modificar_intervalo()) faz a reestruturação de um novo intervalo. A linha 8 verifica o novo intervalo (novo_intervalo) diferente de vazio; caso verdadeiro, o novo intervalo (novo_intervalo) é substituído pelo intervalo de reestruturação no caminho da solução (S*).

Na linha 9, o procedimento (novo_caminho()) substitui no caminho da solução (S*) o novo intervalo (novo_intervalo). A linha 10 executa o procedimento (rolamento_dado(), disponível na seção 4.6) para fazer o rolamento do dado sobre o caminho (n_caminho). E, na linha 13, a nova solução (Sr) é retornada.

Procedimento 1 - Reestruturação

reestruturacao ()

Entrada: S* (Solução inicial), T (define o tamanho do intervalo de reestruturação), G (grafo grade)

Saída: Sr (Solução reestruturada) // Inicio

1 tamanho_intervalo ← S*.caminho_tamanho * T

2 indice_inicial_maximo ← S*.caminho_tamanho – tamanho_intervalo 3 in_extremo_inicial ← [0, indice_inicial_maximo]

4 in_extremo_final ← in_extremo_inicial + tamanho_intervalo 5

6 novo_intervalo ← modificar_intervalo (in_extremo_inicial, in_extremo_final, S*, G) 7

8 Se(novo_intervalo ≠ ∅)faça

9 n_caminho ← novo_caminho(novo_intervalo, S*.caminho, in_extremo_inicial, in_extremo_final)

10 rolamento_dado(n_caminho, Sr) 11 Fim_se

12

O Procedimento 2 (modificar_intervalo ()) tem como entrada as variáveis numéricas (in_inicial e in_final) para definir o intervalo de reestruturação no caminho da solução inicial (S*), um grafo grade G (matriz de adjacência) e como saída, um vetor de inteiros (intervalo_r) com o novo intervalo reestruturado.

Na linha 1, o procedimento (marca_caminho_no_grafo ()) marca o caminho da solução (S*) no grafo grade G, as arestas entre os vértices do caminho da solução inicial (S*) terão marcação igual a -1 (menos um) e as demais arestas terão marcação igual a 0 (zero).

Na linha 3, o vetor de inteiros (intervalo_r) é declarado para definir o intervalo a ser reestruturado. Nas linhas de números 4 a 6, o vetor (intervalo_r) armazena os vértices entre os índices (in_inicial e in_final) no caminho da solução inicial (S*).

Na linha 8, o procedimento (marca_intervalo_no_grafo ()) marca o vetor de inteiros (intervalo_r) no grafo grade G; nessa marcação, as arestas entre os vértices do intervalo (intervalo_r) terão marcação igual a (1).

A linha 10 define a estrutura (Pilha) definida na seção 6. Na linha 11, a variável numérica (v) armazena o primeiro vértice do vetor de inteiros (intervalo_r). Na linha 12, a lista (lista_v) é declarada para armazenar os vértices adjacentes do vértice (v), com procedimento disponível na seção 4.3. Na linha 13, o primeiro elemento da pilha é adicionada com o vértice (v) e seus vértices adjacentes (lista_v). Na linha 15, a variável numérica (K) é declarada para guardar um valor igual à quantidade de vértices do grafo grade G, esse valor controla o limite máximo de execução do laço na linha 17.

Nas linhas de números 18 a 26, o empilhamento é executado até a lista do topo da pilha ficar vazia. Na linha 19, a variável numérica (v) guarda o vértice da lista do topo da pilha que apresenta o maior grau no grafo grade G. Na linha 20, o vértice de maior grau selecionado será removido da lista do topo da pilha para evitar ser selecionado em iterações futuras.

Na linha 21, o procedimento (ponto_isolamento(), disponível na seção 4.2) é executado para verificar o vértice (v) como viável. Caso verdadeiro, na linha 22, a lista (lista_v) armazena os vértices adjacentes do vértice (v); na linha 23, a pilha adiciona o vértice (v) e a lista (lista_v) com vizinhos, como próximo elemento da pilha

e; na linha 24, o procedimento (marca_grafo1(), disponível na seção 4.4.1) marca o vértice (v) no grafo grade G.

Procedimento 2 – Modificar Intervalo modificar_intervalo ()

Entrada: in_inicial (índice do extremo inicial), in_final (índice do extremo final), S* (solução inicial), G (Grafo)

Saída: novo_intervalo (vetor de inteiros) // Inicio

1 marca_caminho_no_grafo(S*.caminho, G) 2

3 intervalo_r

4 Para (i ← in_inicial; i <= in_final; i++) faça 5 intervalo_r.add(S*.caminho[i]) 6 Fim_para 8 marca_intervalo_no_grafo(intervalo_r, G) 9 10 Pilha pilha 11 v ← intervalo_r.primeiro 12 lista_v ← pega_vizinhos(v, G) 13 pilha.add(v, lista_v) 15 K ← |G(V)| 16

17 Para (j ← 0 até K ) faça

18 Enquanto( pilha.topo.lista ≠ Ø ) faça 19 v ← vertice_maior_grau(pilha.topo.lista) 20 pilha.topo.lista.remove(v)

21 Se (ponto_isolamento(v, retorna_caminho(pilha)) == T) faça 22 lista_v ← pega_vizinhos(v, G) 23 pilha.add(v, lista_v) 24 marca_grafo1(G, retorna_caminho(pilha)) 25 Fim_se 26 Fim_enquanto 27

28 Se(pilha.tamanho == intervalo_r.tamanho) faça 29 Se(teste_intervalo(pilha) == verdadeiro) faça 30 novo_intervalo ← retorna_caminho(pilha)

31 j ← K

32 Fim_se

33 Contrario Se (pilha == Ø) faça 34 j ← K

35 Fim_se 36

38 marca_grafo2(G, retorna_caminho(pilha)) 39 pilha.desempilha

40 Fim_enquanto 41 Fim_para

42 Retornar novo_intervalo

As linhas de números 28 a 35 verificam as condições de saída do laço mais externo. A linha 28 verifica o tamanho da pilha igual à quantidade de vértices do vetor (intervalo_r); caso verdadeiro, o procedimento (teste_intervalo()) verifica o caminho definido pela pilha diferente do caminho (intervalo_r) e, os vértices extremos do caminho na pilha iguais aos vértices extremos do caminho no vetor (intervalo_r); se verdadeiro, o vetor (novo_intervalo) armazenar o intervalo reestruturado definido pela pilha, e na linha 31, a variável numérica (j) é atualizada com valor máximo para sair do laço.

A linha 33 verifica a pilha vazia; se verdadeiro, a variável (j) armazena um valor máximo para sair do laço.

O desempilhamento ocorre entre as linhas 37 a 40. Enquanto verdadeiro, a linha 38 marca o grafo grade G, com o procedimento (marca_grafo2(), descrito na seção 4.4.2). E, na linha 39, o desempilhamento é realizado.

Documentos relacionados