Você está na página 1de 7

Soluo para o Problema: "As Minas Encantadas"

Jaguaraci Silva
Resumo:
1

Este artigo demonstra a anlise do algoritmo proposto para resoluo do problema "As Minas Encantadas". O estudo apresenta o mtodo utilizado para anlise do problema, trechos do cdigo-fonte desenvolvido e uma anlise da sua complexidade e resultados. Para demonstrao dos resultados foram feitas diversas anlises sobre o tempo de execuo do algoritmo, onde foi possvel demonstrar que o seu padro de crescimento em funo desses tempos pode ser diferente para o clculo de entradas pequenas e grandes. Este trabalho tambm demonstra que o tempo de execuo do algoritmo pode ser tolervel diante de entradas ainda maiores que as analisadas no estudo, o que indica ser uma possvel soluo para resolver o problema proposto.
Palavras-chave:

Complexidade, Anlise, Algoritmo. as concluses e referncias utilizadas neste estudo. A nossa soluo buscou realizar a leitura dos dados, que representam as reas contidas em um conjunto de testes [2], para projetar em uma grade a simulao do tamanho total de uma regio. As informaes de produtividade de todas as reas da regio podem ser vistas na simulao que apresentada na Figura 1.

I Introduo

Realizar exploraes no subsolo de uma determinada rea requer uma anlise profunda, principalmente da sua rentabilidade, pois s possvel comprar uma nica regio retangular de terras (lote) e explorar tudo que h dentro dela [1]. Por conta dessa restrio, foram feitos estudos para conhecer o potencial produtivo de todas as reas em uma determinada regio. No entanto, ainda necessrio realizar uma anlise para encontrar o lote mais produtivo [1]. A nossa soluo foi criar uma heurstica para entendimento do problema, projetar e desenvolver um algoritmo, capaz de realizar a busca automtica do lote mais produtivo de cada regio, e apresentar os resultados do estudo. Este trabalho est divido da seguinte forma: a heurstica criada para entendimento e solu- Figura 1 - Disposio dos Valores na Grade. o do problema ser apresentada nesta seo, o projeto e desenvolvimento do algoritmo na sePoder haver a existncia de reas cujo preo de soluo e a anlise do algoritmo na seo juzo pode ser alto, e para diminuir o risco de inde resultados. No nal, ser possvel conhecer vestimentos nessas reas, o algoritmo deve ter a capacidade de restringir a anlise s reas pro1 Universidade Federal de So Paulo - Instituto de dutivas. A Figura 2 exibe uma analogia essa Cincia e Tecnologia. Programa de Ps-graduao em situao, onde todas as reas produtivas esto Cincia da Computao. Entregue em 26 de Maro de 2012 para avaliao. identicadas na cor verde.

Figura 2 - reas Produtivas Simuladas na Grade. Aps encontrar as reas produtivas, o algoritmo deve realizar uma busca dos lotes mais produtivos. Para isso, uma rea retangular ir demarcar o lote, e assim ser possvel encontrar a sua localizao exata na regio atravs das suas coordenadas, conforme demonstra a Figura 3.

porque a produtividade total dos seus quadrantes a maior entre todos os lotes exibidos na simulao da Figura 3. Aps a denio da heurstica para melhorar o entendimento do problema[1], na prxima seo ser apresentado o algoritmo desenvolvido. O algoritmo foi divido em duas partes: (1) leitura das reas produtivas por cada regio a partir de um arquivo e (2) busca pelo lote mais produtivo.

II Soluo
A primeira parte do algoritmo apresentada na Lista 1. Cada N linhas do arquivo, representando os valores das reas, so lidas por caso de teste ou regio e existem duas vericaes iniciais:
(1) Se a linha atual contm a descrio do

caso de teste (e.g.#Teste 20/1), existe um controle para indicar que j houve a leitura dos dados de uma regio, portanto o clculo do maior lote j pode ser feito. A criao de um ndice (indexI) tambm evita a construo de uma nova estrutura de controle, assim o algoritmo no trecho 510 possui uma complexidade O(n) j que preciso ler N linhas do arquivo para conhecer a identicao de cada caso de teste ou regio. Por conta dessa congurao, foi necessrio adicionar uma identicao nal no arquivo (e.g.#Final). Isso se deve ao fato que sempre no nal da leitura dos valores de cada regio, o algoritmo realiza o clculo do lote mais produtivo. gurao da matriz que ir simular toda a regio e a criao de uma lista para armazenar as informaes das coordenadas de cada rea produtiva. Essa congurao ser feita cada vez que o algoritmo detectar que haver uma nova simulao de clculo em uma regio. As coordenadas do lote mais produtivo so armazenadas dentro de objetos que, por sua vez, so organizados em uma lista e acessados atravs de um vetor (e.g. V = {OBJ0, OBJ1, OBJ2,

Figura 3 - Lotes Produtivos Demarcados na Grade. De acordo com a Figura 3, os lotes representados atravs dos elementos do conjunto Grid = {A, B, C, D, E, F, G, H, I, J} contm as coordenadas para a sua localizao. Na parte inferior da Figura 3 esto destacados os valores de cada quadrante (rea) por lote ou elemento do conjunto. Neste exemplo, possvel perceber que o elemento F possui as reas mais produtivas,

(2) A prxima vericao refere-se con-

cdigo (linhas 23-29) exibe a forma de iterao a ser executada para o preenchimento da grade de simulao. Para cada valor lido, h um teste para assegurar que apenas as reas produtivas sero analisadas (if number > 0). Este trecho while ((line = do algoritmo possui uma complexidade O(N*N) bufferedReader.readLine())!= null) { j que utilizado um ndice interno (j) para iterar cada coluna e linha (indexI) da grade para if (line.contains("#")){ cada N linhas do arquivo. Assim, o algoritmo if (indexI >0) realiza a transposio dos valores para a matriz lookingForProductiveAreas(); de simulao ao mesmo tempo em que verica e testCase = line; armazena as coordenadas dos lotes produtivos, continue; o que promoveu uma reduo no tempo total } de seu processamento. Um resumo da complexidade desse trecho do algoritmo pode ser visto if (line.length() < LinesAndColumns){ na Figura 4.
st = new StringTokenizer(line); lineSize = Integer.parseInt(st.nextToken()); columnSize = Integer.parseInt(st.nextToken()); indexI = 0; testCaseMatrix = new int[lineSize][columnSize]; produtiveAreas = new Vector<Element>(); expectedProfit = 0; continue;

OBJ3}). Neste caso a complexidade do algoritmo O(N), pois existem apenas atribuies de congurao para cada N linhas do arquivo.

st = new StringTokenizer(line); for (int j = 0; j < columnSize; j++) { number = Integer.parseInt(st.nextToken()); testCaseMatrix[indexI][j] = number; if (number > 0) { Element elemento = new Element(indexI, j, number); produtiveAreas.add(elemento); } } indexI++; }

Figura 4 - Complexidade do Trecho 1. O clculo do lote mais produtivo realizado ao obter os valores das coordenadas superior esquerda e inferior direita das areas produtivas e armazenadas no vetor. A utilizao dessa estrutura de dados mais rpida, visto que h apenas acessos para leitura de dados. Para cada elemento do vetor contendo as coordenadas (linhas 2-9), h uma busca dos valores referenciados na grade de simulao, sendo que o algoritmo apenas acessa a matriz atravs das coordenadas do vetor em cada iterao.

Lista 1 - Trecho do Algoritmo de Leitura dos dados de Teste.

Aps as vericaes, nalmente os valores das reas produtivas so lidos e armazenados na public void lookingForProductiveAreas(){ estrutura da matriz, em forma de linhas e colu- for (int i = nas, de acordo com o seu tamanho. O trecho do produtiveAreas.capacity() - 1;

i >= 0; i--) { try { Element elemento = produtiveAreas.get(i); posSuperiorLeft = testCaseMatrix[elemento.getLine()] [elemento.getColumn()]; posSuperiorRight = testCaseMatrix[elemento.getLine()] [elemento.getColumn() + 1]; posInferiorRight = testCaseMatrix[elemento.getLine() + 1] [elemento.getColumn() + 1]; posInferiorLeft = testCaseMatrix[elemento.getLine() + 1] [elemento.getColumn()]; totalProfit = posSuperiorLeft + posSuperiorRight + posInferiorRight + posInferiorLeft;

Lote mais Produtivo. Com base nas coordenadas do vetor das reas produtivas, foi possvel obter os outros dois quadrantes (superior direita e inferior esquerda) sem a necessidade de armazen-los usando uma memria temporria. Essa ao tambm diminiu o tempo total de processamento do algoritmo. Neste caso, o clculo do retngulo (lote produtivo), cou mais fcil. No nal do trecho h uma vericao simples para comparar se o lote calculado atualmente realmente mais produtivo que o anterior (linhas 1114). Aps, as seguintes informaes so armazenadas em outro vetor para anlise dos resultados: coordenadas do maior lote produtivo, lucro esperado, tempo de execuo do algoritmo e a identicao da regio simulada. A anlise da complexidade do trecho de cdigo da Lista 2 exibida na Figura 5.

if (expectedProfit < totalProfit) { expectedProfit = totalProfit; bigSuperiorLeft = posSuperiorLeft; bigInferiorRight = posInferiorRight; } }catch (ArrayIndexOutOfBoundsException e) {} } long tempoFinal = System.currentTimeMillis();

Figura 5 - Complexidade do Trecho 2.

Com base nas anlises anteriores, foi possvel notar que o algoritmo foi divido em dois trechos TestCaseResult testCaseResult = (Lista 1 e 2) e foram calculadas as suas comnew TestCaseResult( plexidades de forma isolada (Tabela 1). Para getTestCaseName(), conhecermos o crescimento da sua complexixpectedProfit,bigSuperiorLeft, dade (Teorema 1), a complexidade total do albigInferiorRight, goritmo(Teorema 2) e qual trecho domina as(tempoFinal - tempoInicial) / 1000d); sintoticamente o outro (Teorema 3), os clculos poderiam ser feitos da seguinte forma, segundo testCaseResults.add(testCaseResult); [6]:
}

Lista 2 - Trecho do Algoritmo para Clculo do dade do algoritmo dado quando O(g(n)) =

Teorema (1) - O crescimento da complexi-

{f(n): onde existem constantes positivas C e n0 tais que 0 <= f(n) <= Cg(n) para todo N >= n0}

Tabela 1: Complexidade do Algoritmo. Clculo da Complexidade - Lista 1 (1): T 1(n) = N i C1 + N i C2+ i=1 i=1
(
N i=1

Prova - Se a complexidade de T 1(n) = C5 + 2N 2 e de T 2(n) = C3 + N . Ento,

i(

N j=1

j C3 + C4)

(2): C5 = C1 + C2 + C3 + C4 (3): T 1(n) = C5 +


(
N i=1

N j=1

N i=1

i+

N i=1

i+

j)
N 2 i=1 i

o crescimento da complexidade dos trechos poderia ser dado por f(n) = O(g(n)) , onde O(T1(n)) = N 2 , pois ,ignorando os custos de atribuies e constantes da funo[6], 0 <= N 2 <= N 2 para todo N >= n0}, assim como O(T2(n)) = N, pois 0 <= N <= N para todo N > n0}

(4): T 1(n) = C5 +
N j=1

+(

N i=1

i*

j)
N (N +1)(2N +1) 6

(5): T 1(n) = C5 +
( N (N +1) 2
N (N +1) ) 2

Teorema (2) - A complexidade de dois trechos aninhados, em que o segundo repetido N vezes dentro do primeiro, dada pelo produto do trecho mais interno pela complexidade do mais externo.
Prova - Da forma que o trecho (Lista 1,

(6): T 1(n) = C5 + ( N (2N ) * N (2N ) ) 2 2 (7): T 1(n) = C5 +

N (2N )(3N ) 6

+
2

N 6N 6

+ ( 2N 2

2N 2 2 )

linha 7) para o clculo do lote mais produtivo executado toda vez que h leitura dos dados de uma nova regio, isto implica que a complexidade total do algoritmo ser dada pelo o produto de O(T 1(n) T 2(n)).

(8): T 1(n) = C5 + N N + N N (9): T 1(n) = C5 + N 2 + N 2 (10): T 1(n) = C5 + 2N 2 Clculo da Complexidade - Lista 2 (1): T 2(n) = N i C1 + C2 i=1 (2): C3 = C1 + C2 (3): T 2(n) = C3 + (4): T 2(n) = C3 + (5): T 2(n) = C3 + (6): T 2(n) = C3 +
N i=1

Se T 1(n) = O(f (n)) e T 2(n) = O(g(n)) ento T 1(n) T 2(n) = O(f (n) g(n)) , assim N 2 N = N 3 .

Teorema (3) - Uma funo g(n) domina assintticamente outra funo f(n) se f(n) = O(g(n)) e existem constantes c e n0 tais que, para valores de n >= n0, f(n) <= g(n)
Prova - Para demonstrar que o Trecho

N (N +1) 2 N (2N ) 2 2N 2 2

1 domina assintticamente o Trecho 2 e o algoritmo tem complexidade cbica ou O(N 3 ), possvel notar que se T2(n) = f(n) = N e T1(n) = g(n) = N 2 , f(n) <= g(n) <= N 3 (Prova do teorema 2), pois N <= N 2 <= N 3 .

(7): T 2(n) = C3 + N

A prxima seo apresenta os resultados do algoritmo na simulao do conjunto de testes e exibe um grco para demonstrar como cresceu o seu tempo de execuo em relao ao tamanho de cada entrada processada. No nal, feita a previso do tempo que o algoritmo levaria para realizar todas as operaes apresentadas utilizando entradas ainda maiores que as analisadas na simulao.

III Resultados
Aps a execuo do algoritmo foi constatado que as entradas menores do conjunto de testes (Figura 6), no inuenciavam tanto o seu tempo de execuo. Mesmo no trecho de maior complexidade, onde era necessrio realizar a transposio das linhas e colunas do arquivo para a grade e ainda buscar todas as reas produtivas.

Tabela 2: Trecho dos Resultados Completos [3]. Teste Lucro Sup.Esq Inf.Dir Tempo 20/1 278 90 86 0,016 ms 20/2 325 92 89 0,016 ms 20/3 317 67 66 0,016 ms 20/4 323 65 97 0,016 ms ... De acordo com a Figura 8 possvel ver claramente que o crescimento do tempo de execuo (linha azul ) quase linear quando o algoritmo processa as entradas menores. O que difere quando as entradas so bem maiores, pois nota-se que o tempo dobra a cada execuo a partir do teste 120 (em vermelho).

Figura 6 - Tempo de Execuo dos Testes I. A anlise dos resultados demonstrou que o tempo de execuo do algoritmo cresceu signiFigura 8 - Grco de Anlise do Tempo de cativamente para tamanhos grandes, como os Execuo do Algoritmo. apresentados na Figura 7. Entradas sucientemente grandes mudaram o padro de cresciNo arquivo de resultado dos testes [3] tammento da funo em relao ao tempo, ou seja, bm possvel ter outras informaes solicitamesmo com a sua complexidade cbica, o algoritmo poderia ser visto, erroneamente, como das no problema [1], a exemplo do que moslinear ou O(N) para entradas no to grandes. trado na Tabela 2. Cada conjunto de teste possui as seguintes informaes: a rea total projetada na simulao (e.g. Teste 20/1), o lucro esperado com a explorao do lote mais produtivo (Expected Prot), suas coordenadas e o tempo total de execuo do algoritmo para encontr-lo. Apesar de no ser solicitado em [1], o estudo buscou tambm conhecer a previso de execuo do algoritmo quando da ocorrncia de entradas ainda maiores que o conjunto de testes [2] utilizado na simulao. Foi feito um clculo estatstico usando um modelo de previso [7] para simular o tempo de execuo do algoritmo para essas entradas. O nosso objetivo foi tentar projetar a ecincia do algoritmo quando exeFigura 7 - Tempo de Execuo dos Testes II. cutado nas mesmas conguraes de hardware

e software em que foram feitas as simulaes, os dados da anlise esto expostos na Figura 9.

Referncias
[1] Basgalupp, M. P.. "As Minas Encantadas", Problema proposto como parte da avaliao da disciplina de Anlise de Algoritmos e Estruturas de Dados. Universidade Federal de So Paulo, So Jos dos Campos, 23 de maro de 2012. [2] Silva, J.B.. "t1.dat", Arquivo de casos de teste utilizado na soluo do problema proposto em [1]. Parte da Avaliao da Disciplina de Anlise de Algoritmos e Estruturas de Dados. Universidade Federal de So Paulo, So Jos dos Campos, 23 de maro de 2012.

Figura 9 - Previso de Resultados.

Para conhecer o padro de crescimento do [3] Silva, J.B.. "Arquivo de Resultados.csv", Arquivo contendo o tempo de tempo de execuo em relao ao tamanho das soluo para cada caso de teste proposto entradas, foram simulados valores entre 400em [2]. Parte da Avaliao da Disciplina de 1000. Com base nessa simulao, foi posAnlise de Algoritmos e Estruturas de Dasvel notar que o algoritmo poderia ser utidos. Universidade Federal de So Paulo, So lizado para encontrar os lotes mais produtiJos dos Campos, 23 de maro de 2012. vos em grandes regies (e.g.100.000 100.000 e 1.000.000 1.000.000) com um tempo aceitvel. [4] Silva, J.B.. "Arquivo de ResultaDesta forma, segundo a previso, o algoritmo dos.txt", Arquivo contendo os resultados poderia ser considerado timo. para cada caso de teste proposto em [2]. Parte da Avaliao da Disciplina de Anlise de Algoritmos e Estruturas de Dados. Universidade Federal de So Paulo, So Jos Este trabalho mostrou uma soluo algortmica dos Campos, 23 de maro de 2012. para o problema proposto em [1]. Aps as simulaes, foi constatado que o padro de cres- [5] Silva, J.B.. "Planilha de Anlise de Complexidade", Arquivo com a heurscimento do tempo de execuo do algoritmo tica utilizada, tabelas e grcos utilizadas possuia grandes diferenas quando do procesna anlise de uma soluo para [1]. Parte da samento de entradas pequenas e grandes por Avaliao da Disciplina de Anlise de Algocausa da sua complexidade. Neste trabalho ritmos e Estruturas de Dados. Universidade foi feito tambm um estudo para previso do Federal de So Paulo, So Jos dos Campos, tempo de execuo para entradas ainda maio23 de maro de 2012. res que as utilizadas na simulao. Com base nas anlises, o algoritmo construdo poderia ser [6] Cormen, T.H., Leiserson, C.E., Rivest, capaz de resolver o problema [1] em um tempo R.L., Stein, C.. "Introduction to Algotolervel, contudo, o nosso estudo no realizou rithms", MIT Press, Cambridge, Massacomparaes com outros algoritmos e simulachusetts, London, 2nd Ed, 2001. es para conrmar que o algoritmo timo. Outras informaes que no puderam ser des- [7] Microsoft. "Description of The cridas por conta do espao tambm esto dispoForecast Function in Excel", nveis: arquivos de resultados [3] , informaes http://support.microsoft.com/kb/828236, solicitadas pelo problema [4] e planilha utiliacessado em 23 de maro de 2012. zada na anlise dos resultados [5].

IV Concluso