4.2 Arquitetura da solu¸c˜ao de planeamento
4.2.1 Algoritmos
O algoritmo de Heap (1963) gera todas as permuta¸c˜oes de n objetos, escolhendo de forma sistem´atica, em cada itera¸c˜ao, um par de elementos que troca para produzir, exatamente uma vez, todas as permuta¸c˜oes poss´ıveis dos elementos. Gera cada permuta¸c˜ao da permuta¸c˜ao anterior, n˜ao redistribuindo os restantes N −2 elementos. Foi escolhido inicialmente para gerar as permuta¸c˜oes de um conjunto de patamares selecionados para cobertura, determinando as sequˆencias poss´ıveis de rotas para a navega¸c˜ao. Contudo, uma vez que os patamares podem ser percorridos nos dois sen- tidos procedeu-se `a sua duplica¸c˜ao. Garantida aos referidos patamares uma diferente designa¸c˜ao, a eles foi aplicado o algoritmo Heap.
Analisada a solu¸c˜ao encontrada, verificou-se em algumas sequˆencias a existˆencia de elementos que correspondiam a movimentos em sentidos distintos num mesmo pata- mar. Assim, foi necess´ario depurar a solu¸c˜ao encontrada, eliminando da sequˆencia as repeti¸c˜oes de movimentos em cada patamar. S´o ent˜ao foi considerada a nova solu¸c˜ao para fazer parte da ´arvore de decis˜ao.
Uma vez que navega¸c˜ao para cobertura da uma zona da vinha pode iniciar-se e terminar num ponto exterior a essa zona, na ´arvore de decis˜ao s˜ao inclu´ıdos como v´ertices o ponto de partida e o ponto de chegada.
No topo da ´arvore (no v´ertice raiz) ´e colocado o ponto de partida. Cada permuta¸c˜ao ´e inserida como ramo e ligada ao v´ertice de partida. No final de cada ramo ´e
4.2. ARQUITETURA DA SOLUC¸ ˜AO DE PLANEAMENTO 125
ligado o v´ertice terminal correspondendo este ao ponto de chegada. Deste modo a ´arvore completa ter´a de conter tantos pontos de chegada quantas as permuta¸c˜oes depuradas.
Apresenta-se de seguida o algoritmo 1 adotado. Algoritmo 1: GeradorHeap
Entrada: n: inteiro, lElem: lista, LP ermut: lista de listas Sa´ıda: LP ermut: lista de listas
in´ıcio se n=1 ent˜ao novaLista←− CriaNovaLista() novaLista= lElem AdicionaListaElem(novaLista, LP ermut) sen˜ao para i = 0; i < n − 1; i + + fa¸ca
GeradorHeap(n − 1,lElem,LP ermut) se n ´e impar ent˜ao
Troca(lElem[i],lElem[i − 1]) sen˜ao Troca(lElem[0],lElem[n − 1]) fim fim fim fim
A procura do caminho ´otimo na ´arvore de decis˜ao faz-se atrav´es do algoritmo Dijks- tra, recorrendo `a fun¸c˜ao de custo adotada, garantindo uma solu¸c˜ao ´otima sem nece- ssidade de varrer todos os ramos da ´arvore, a n˜ao ser que a solu¸c˜ao s´o seja encontrada no final da procura.
A determina¸c˜ao do caminho ´otimo entre o ponto de partida e o extremo do primeiro elemento de cada sequˆencia de permuta¸c˜oes, ´e efetuada por recurso ao algoritmo A∗ aplicado ao grafo do mapa da vinha. O mesmo procedimento ´e adotado para a
126 CAP´ITULO 4. PLANEAMENTO DE TRAJET ´ORIAS EM VINHA DE MONTANHA
e o ponto de chegada; como, ali´as, foi referido atr´as, na subsec¸c˜ao4.1.2. A travessia de uma transi¸c˜ao entre patamares vizinhos na permuta¸c˜ao envolve, do mesmo modo, a procura no grafo do mapa da vinha.
Admitindo que o grafo do mapa da vinha, constitu´ıdo por v´ertices e arestas de estrutura adiante definida (na subsec¸c˜ao 4.2.2), foi preenchido automaticamente, encontrando-se o grafo pesado, para a implementa¸c˜ao do algoritmo A∗ foram utili-
zadas as seguinte estruturas de dados adicionais: uma lista aberta O, para conter o conjunto de v´ertices do grafo a explorar. ´E uma lista ordenada priorit´aria, onde os v´ertices s˜ao colocados de forma a que o primeiro a ser analisado seja o priorit´ario, i.e., o de menor custo acumulado; e uma lista fechada C, para conter os v´ertices do grafo previamente explorados, que j´a estiveram em O.
O algoritmo faz referˆencia a outras vari´aveis cujo significado se resume na Tabela4.1;
Tabela 4.1– Algumas vari´aveis utilizadas pelo algoritmo A∗.
Designa¸c˜ao Implementa¸c˜ao Significado
adj(v) Adjacente(G,v) Conjunto de v´ertices adjacentes ao v´ertice v ci,j CustoGrafV(i,i) Custo da aresta que une os v´ertices vie vj
g(v) Newcost Custo total associado ao percurso de retorno do v´ertice atual, vact, ao v´ertice inicial, vini, soma dos custos acumulados pelas arestas percorridas h(v) Heuristica Fun¸c˜ao heur´ıstica que determina os custos estimados do percurso ´otimo,
do v´ertice atual, vact, ao v´ertice final, vf im
f(v) Priority Custo estimado para o percurso ´otimo entre os v´ertices inicial, vini, e o v´ertice final, vf im, que passa por vact; f (v) = g(v) + h(v),
O algoritmo Dijkstra tem uma estrutura semelhante ao A∗, apenas variando a fun¸c˜ao
de procura que n˜ao contempla h(v) no c´alculo de f (v) em cada itera¸c˜ao, motivo pelo qual n˜ao ser´a apresentado neste documento de tese. Uma vez que o algoritmo Dijks- tra funciona sobre uma ´arvore de v´ertices com tipos distintos (pontos e tro¸cos dos esqueletos) ´e necess´ario, antes de proceder `a recolha do valor dos seus parˆametros,
4.2. ARQUITETURA DA SOLUC¸ ˜AO DE PLANEAMENTO 127
identificar o seu tipo. Este aspeto n˜ao ´e tido em conta na implementa¸c˜ao do algo- ritmo 2.
Algoritmo 2: A∗
Entrada: ini: inteiro, f im: inteiro, G: GraphV Sa´ıda: S: ListaVertices in´ıcio vini←− VerticeGrafo(ini) vf im←− VerticeGrafo(f im) O ←− CriaPriorityQueue() C ←− {(vini, vini)} costSoF ar ←− {(vini, 0)}
O.PUSH(vini, GetNodeCost())
enquantoContaElem(O) > 0 fa¸ca vact ←− O.POP()
seIdent(vact)=vf iment˜ao
BREAK fim
para cadaprox ∈ Adjacente(G, vact) fa¸ca
a ←− Custo(costSoF ar [vact])
b ←− CustoGrafV(vact,prox)
N ewcost ←− a + b
se((prox /∈ Vertice(costSoF ar)) ∨ (N ewcost < Custo(costSoF ar[prox]))) ent˜ao
costSoF ar = costSoF ar ∪ {(prox, N ewcost)} P riority ←− N ewcost+ Heuristic(vact, vf im) O.PUSH(prox, P riority) C ←− C ∪ {(prox, vact)} fim fim fim vC ←− vf im S ←− {vC} termina ←− false
enquanto!termina fa¸ca vC ←− C[vC]
S.PUSH-FRONT(vC) termina ←− (vC==vini)
fim fim
128 CAP´ITULO 4. PLANEAMENTO DE TRAJET ´ORIAS EM VINHA DE MONTANHA