Professional Documents
Culture Documents
Introduo
Este trabalho aborda o problema do Banco Central que consiste em encontrar o menor nmero de guardas necessrios para vigiar um banco. Esse um problema de visibilidade da geometria computacional, mais conhecido como Art Gallery Problem. O layout do banco representado por um polgono simples de arestas no colineares, isto , as arestas no adjacentes do polgono no se interceptam e nenhuma aresta est alinhada a outra. Nesse layout (polgono), um possvel guarda do banco representado por um vrtice. Dessa forma, um conjunto S de guardas (vrtices) vigia um banco (polgono) se, e somente se, para cada vrtice v do polgono, existe algum vrtice u S em que uma linha entre v e u no saia do polgono nem intercepte nenhuma aresta. Por ser um problema NP-Difcil, deve-se usar heursticas para resolv-lo.
Implementao
Para resolver esse problema foram usadas vrias estruturas de dados, algumas funes auxiliares e duas heursticas. As mais importantes sero descritas abaixo:
= 1 id = 2 de id = 3 id = 4
Os vrtices devem obrigatoriamente ser passados no sentido anti-horrio em relao ao polgono e cada coordenada no formato de uma diviso de inteiros.
Funes geomtricas
Todas estas funes foram descritas no arquivo geometria, e lidam com todas as situaes relacionadas geometria computacional. A base dessas funes a estrutura ponto
struct point{ int x,y,cor; Lista* vigia; }ponto;
Essa estrutura contm as coordenadas (x , y) do vrtice(ponto), sua cor, e uma lista encadeada contendo todos os vrtices vigiados por esse ponto. O cabealho geometria.h ser mostrado abaixo para breve entendimento das funes. As duas primeiras funes so descritas no livro do Sedgewick e no sero descritas, as duas ultimas tero seu pseudocdigo apresentado.
//Verifica se um segmento pertence ao polgono int ccw (ponto p0, ponto p1, ponto p2); //Verifica se o ponto p22 est contido no triangulo p11,p12,p21 //ou se as retas p11 p12 e p21 p22 NO se interceptam int estaContido (ponto p11,ponto p12,ponto p21,ponto p22); //Subdivide o polgono em tringulos int triangular(apontador ini,int size) Enquanto houver pelo menos 3 pontos Seleciona 3 pontos p0,p1,p2; Se ccw (p0,p1,p2) == 1 Para cada ponto do polgono Se estaContido Seleciona outros 3 pontos Seno p1.cor = 1;p2.cor=-1;p0.cor=-1; Fim se Fim para Fim se Fim enquanto Fim //Define a visibilidade de cada ponto void visibilidade (ponto* poligono,int* posicao) Para cada guarda p <- i-simo guarda q <- primeiro vrtice a ser verificado Para cada vrtice fora p-1,p,p+1
Testa se a linha entre p e q est contida no polgono Se ccw(p,q.prev,q) Iter <- q.prox Para cada aresta aux <- estaContido(p,q,iter,iter.prox) fim para fim se Se aux == 1 insere (p,q) fim se q<-q.prox fim
ListaV
O TAD listaV uma lista encadeada com cabea e contm as seguintes funes, todas em O(1) Criar lista vazia Inserir elementos no fim da lista Remover elementos do incio da lista
Contm tambm a funo para imprimir a lista na tela ou em arquivo, nesse caso em O(n), em que n o numero de elementos na lista. Essa lista usada para guardar os pontos vigiados por cada guarda.
Lista
O TAD lista uma lista duplamente encadeada sem cabea e contm as seguintes funes Criar_lista (poligono) Excluir (p)
Essa lista usada para percorrer os pontos de forma intuitiva, pois se assemelha ao prprio polgono. usada principalmente para triangular e criar a lista de vrtices.
Quick Sort
uma implementao simples do mtodo de ordenao quick sort recursivo para vetores, usada para ordenar as sadas.
Heurstica 1
Essa heurstica foi implementada baseando-se no mtodo de triangulao, isso , subdivide-se o polgono em tringulos, como cada vrtice de um tringulo enxerga os outros dois, colocando um guarda por tringulo, garantidamente o polgono estar completamente vigiado. Na figura 1 abaixo foi plotada uma sada da funo triangular (). Os vrtices circulados so os com cor 1, ou seja, a posio dos guardas.
Essa heurstica basicamente chama as seguintes funes nessa ordem: ini -> criar_lista(poligono); triangular(ini); visibilidade (poligono,posicao); imprimeOrdenado(poligono,posicao,output); Complexidade Criar_lista feita em O(n) Para triangular, para cada um dos n pontos testamos se nenhum dos outros n-3 est contido no triangulo formado por esse ponto com seus vizinhos, ou seja, A visibilidade de cada guarda requer avaliar para todos os n-1 pontos se a reta que une esses dois pontos est dentro do polgono e se nenhuma das outras n-2 arestas interceptam essa reta, ou seja, em que g o numero de guardas criados na triangulao. Em testes empricos verifica-se que . Para imprimir a lista de forma ordenada, para cada um dos g guardas e cada um dos vrtices vigiados por ele que no pior caso so n, chamamos o mtodo Quick Sort . Logo a complexidade dessa funo . .
Sobre a complexidade de espao alocamos para o polgono, mais auxiliar na triangulao, mais ) para a visibilidade e auxiliar para a ordenao. O total
Heurstica 2
Essa heurstica nada mais que uma otimizao da heurstica 1. Aps receber o polgono j com os guardas marcados e com as listas preenchidas, deleta-se os guardas um a um testando se a resposta continua vlida, se no for vlida reinsere o guarda e assim sucessivamente.
Para verificar a validade da resposta, usa-se a funo testarResposta()implementada no arquivo heuristica2. Essa funo aloca um vetor de n posies inicialmente com valor 0 para cada posio. Nesse momento percorre-se todas as listas de pontos vigiados dos g guardas e marca 1 na posio encontrada na lista. Se o vetor final contiver apenas 1s, a resposta vlida. Complexidade Como essa heurstica depende da heurstica 1 e acrescenta os testes temos: Deletar g elementos Verificar cada resposta no pior caso (quando cada guarda vigia os n pontos),
10
Heurstica 1 Heurstica 2
0 1 2 3 4 5
Compilao
Para compilar o programa deve-se simplesmente executar o comando make em um terminal Unix. Esse comando executa o arquivo makefile que j contem todas as informaes de compilao. Um executvel tp2 ser gerado.
Entradas
As entradas do programa devem ser em um arquivo input.txt . O arquivo input.txt pode ser passado como parmetro na execuo do tp2 na forma .\tp2 input.txt Se o input.txt estiver na mesma pasta que os arquivos .h .c e makefile, ao executar o comando make run o programa ser automaticamente compilado e executado. A sada um arquivo output.txt conforme o exemplo (exceto os comentrios):
#Heuristica1: 1 // um guarda vigia a instncia 2 : 1 2 3 4 // guarda de id = 2 vigia os vrtices de id = {1,2,3,4} #Heuristica2: 2 // dois guardas vigiam a instncia 1 : 1 2 3 4 // guarda de id = 1 vigia os vrtices de id = {1,2,3,4} 2 : 1 2 3 4 // guarda de id = 2 vigia os vrtices de id = {1,2,3,4}
Referncias
Projeto de Algoritmos com implementao em Pascal e C. Nvio Ziviani Triangulao-http://www.loco.ic.unicamp.br/~kunigami/projetos/geometria/triangulation.php Algorithms in C - captulo 24. Robert Sedgewick. Addison Wesley Professional, 1st edition, 2001.