You are on page 1of 6

TRABALHO PRTICO 2: Problema do Banco Central

Alessandro Melgao Barbosa Filho


alembfilho@gmail.com

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:

Estruturao das entradas


O primeiro passo para a resoluo do problema uma estruturao das entradas, para isso foi criada a funo ponto* estruturar (FILE* input) no arquivo leituraEscrita - que dado um arquivo de entrada, cria um vetor de pontos (polgono) e retorna um ponteiro para o primeiro elemento. As entradas do programa devem estar estruturadas da seguinte maneira: 1 // nmero de instncias 4 // nmero v de vrtices do polgono 1/1 1/1 // coordenada (1,1) do vrtice de id 100/2 1/1 // coordenada (50,1) do vrtice de 500/10 50/1 // coordenada (50,50) do vrtice 1/1 100/2 // coordenada (1,50) do vrtice de

= 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 . .

A complexidade de tempo total dessa heurstica ento

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),

Logo a complexidade de tempo continua Como a verificao gasta apenas mais

. , a complexidade de espao continua

Comparao entre as Heursticas


Como a heurstica 2 uma otimizao da 1, esperado que o resultado seja melhor. O grfico abaixo mostra os resultados para algumas entradas de teste.
12

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.