Você está na página 1de 5

Proposta de Soluo para o Problema "Palcio dos Espelhos"

Jaguaraci Silva
Resumo:
1

O problema "Palcio dos Espelhos"deseja encontrar uma soluo algortmica para calcular as possibilidades de caminhos que um raio de luz pode percorrer de acordo com um nmero variado de k reexes em n placas de vidros. O estudo realizou diversas simulaes e apresenta uma abordagem que utiliza o clculo de seqncias de polinmios.
Palavras-chave:

Complexidade, Anlise, Algoritmo. duas placas, conforme exibio dos dados na Tabela 1.

I Introduo
O problema "Palcio dos Espelhos"deseja encontrar uma soluo a qual se origina em uma situao fsica. Se colocarmos vrias placas de vidro umas sobre as outras, os raios de luz tero mltiplos caminhos, originados pelas reexes entre as placas. Os raios podero ter um nmero variado de reexes, entre zero e . O objetivo deste trabalho apresentar uma proposta de soluo algortmica para determinar de quantas formas um raio de luz poder sofrer k reexes em uma pilha de n placas de vidro. O estudo realizou simulaes para reconhecer um padro e em seguida apresentou os valores para 2 e 3 placas, aps generalizou a soluo para combinaes de n placas e k reexes. O trabalho apresenta os padres encontrados, o mtodo de soluo proposto e os algoritmos desenvolvidos na seo de soluo. Os resultados, uma breve anlise da complexidade dos algoritmos e a concluso deste trabalho, esto na parte nal deste artigo.

Tabela 1 - Simulao de Reexes em 2 Placas de Vidro.

Teorema (1) - As possibilidades para k reexes em duas placas de vidro demonstraram uma relao de recorrncia, onde o seu crescimento pode ser dado por: Pk = Pk-1 + Pk-2 para todo k > 2. Prova (1) - A possibilidade de 3 reexes, por exemplo, poderia ser dada pelo seguinte clculo: se Pk-1 = 3 e PK-2 = 2 ento PK = 5, pois 5=3+2, assim sucessivamente para todas as possibilidades de K reexes, conforme a informao destacada na Tabela 1.
Para todo N = 2 e K <= 2, ou ainda, um k nmero de reexes > 2 existe a seguinte relao de recorrncia:
f n(k) = k+1 f n(k 1) + f n(k 2)

II Soluo

se k <= 2, se K > 2.

Aps encontrar a relao de recorrncia, foi Reexes em uma placa tero apenas uma possibilidade de caminho distinto, por isso o estudo desenvolvido o algoritmo para resolver o proprocurou uma relao de recorrncia a partir de blema usando duas placas de vidro:
1 Trabalho
02/05/2012. II - Palcio dos Espelhos, entregue em

Inteiro CalculeDuasPlacas(int n, int k) Se k <= 2 Ento

Retorne k + 1 Seno Retorne CalculeDuasPlacas (k-1) + CalculeDuasPlacas (k-2)

Listagem 1 - Algoritmo Desenvolvido para Soluo de duas Placas. O estudo avanou na investigao de uma nova relao de recorrncia para 3 placas e os seus resultados so apresentados na Tabela 2.

Seno Para i=3 onde i <= k Faa possibilidades = 2 * k2 + K1 - K0 K0 = K1 K1 = K2 K2 = possibilidades Fim-Para Retorne Numero

Listagem 2 - Algoritmo Desenvolvido para Resolver o Problema com 3 Placas. A partir do padro encontrado no clculo das combinaes possveis em 3 placas de vidro, foi feita uma tentativa de generalizao, porm os valores estavam incorretos de acordo com os casos de teste. Assim, foi necessrio pesquisar um novo padro de recorrncia. Aps a simulao, foi percebido que os resultados formavam uma seqncia de polinmios, conforme o aumento do nmero de placas (Tabela 3).

Tabela 2 - Simulao de Reexes em 3 Placas de Vidro.

Teorema (2) - As possibilidades para k reexes em trs placas de vidro demonstraram um padro de recorrncia, onde o seu crescimento pode ser dado por: Pk = 2 * Pk-1 + Pk-2 PK-3 para todo k maior que 2. Prova (2) - Para 3 reexes, por exemplo, poderia ser feito o seguinte clculo: se Pk-1 = 6, PK-2 = 3 e PK-1 = 1 ento PK = 14, pois 14 = 2*6+3-1, assim sucessivamente para todo clculo de possibilidades de K, conforme os dados destacados na Tabela 2.

Tabela 3 - Exemplo de Seqncias de polinmios.

Assim, para todo N = 3 e K reexes foi Uma nova simulao buscou o nmero de posencontrada a seguinte relao de recorrncia: sibilidades de k reexes em 4 placas, conforme demonstrao apresentada na Tabela 4. se k = 0, k+1 nk se k = 1ou2,
f n(k) = 2 (k 1) + (k 2) (k 2) se k > 2.

Aps encontrar uma nova relao de recorrncia, foi construdo o algoritmo para resolver Tabela 4 - Simulao de Valores para 4 Placas. o problema usando 3 placas de vidro:
Inteiro CalculePlacas(int n, int k) int k0 = 1 ; int K1 = n ; int K2 = 2 * n ; int possibilidades = 0; Se (k = 0) Retorne 1 Se (k >=1 e k <=2) Retorne k*n

Teorema (3) - A frmula encontrada para o clculo uma seqncia de polinmios, onde N = placas e Pk = possibilidades de k reexes: (N-2 * Pk-1) + (N-1 * PK-2) - (N-3 * Pk-3) (N-3 * PK-4). Onde: N-2 = 2; N-1 = 3; K = 3; Pk-1 = 19; Pk-2 = 8; Pk-3 = 4; Pk-4 = 1;. Prova (3) - Substituindo os valores contidos na Tabela 4, possvel realizar o clculo com mais facilidade: (2 * 27) + (3 * 8) - (1 * 4) (1 * 1) = 73.

O caso de generalizao buscou uma aproximao com a resoluo das seqncias de pocount=0; linmios, onde a partir de uma congurao de j= posicao-1 n placas e k reexes, gerada uma seqncia especca a ser utilizada para calcular as possienquanto j>=0 decremente j-1 { bilidades das reexes. Para facilitar o entendise arrayAux[j] <> 0 { mento, o algoritmo foi divido em 3 partes: (I) placa[++i]=arrayAux[j]; gerao da seqncias de placas, (II) gerao } } da seqncia de termos e cada operando dos } polinmios e (III) algoritmo principal. placa[++i] = n-(n-1) {parte em verde}; A gerao das seqncias de placas enconplaca[++i] = n-1 {parte em amarelo}; trou uma padronizao de crescimento (Tabela placa[++i] = n-1 {parte em amarelo}; 5), onde existia uma diferena para os nmeros de placas pares e mpares (vermelho), a forma para j=0 se j<n incremente j+1 faa de crescimento dos elementos direita (amase (placa[j]==0) relo), esquerda (azul) e o elemento central count++; que sempre se repete (verde).
fim-para se (count>0) retorne geraSequenciaPlacas(n); }} retorne placa; }

Tabela 5 - Padro de Formao Encontrado no Crescimento das Placas de Vidro.

Listagem 3 - Algoritmo Desenvolvido para Gerao das Seqncias de Placas.

De posse dessa padronizao, foi desenvolA prxima gerao de seqncia apresenvido o algoritmo para resolver o padro de crestada na Tabela 6, onde demonstrado o padro cimento das placas: de crescimento para os valores das possibilidainteiro[] geraSequenciaPlacas(int n){ des de k reexes. Uma explicao sobre como int[n] placa; sero feitos os clculos usando essa padronizaint i=-1; o ser demonstrada adiante.
se (n>2){ se ((n>3) e (n%2==0)) {par}{ placa[++i] = n/2; se ((n>5) e (count >0)){ incrementaPar++; } } seno ((n>3) e (n%2!=0)) {impar}{ placa[++i] = (n-1)/2; placa[++i] = (n-1)/2; } se(count>0) {parte em azul} { enquanto (posicao < count){ arrayAux[posicao]=incrementaPar; posicao++;}

Tabela 6 - Padro de Formao das Possibilidades de k Reexes por Nmero de Placas. Conforme a gerao dos termos dos polinmios foi encontrada uma nova seqncia de padronizao para adio e subtrao dos seus termos (Tabela 7).

Tabela 7 - Padro de Formao das Operaes por Nmero de Placas. Com base nessa informao e simulao de casos de testes, foi possvel desenvolver um algoritmo para resolver o padro de crescimento das possibilidades de k reexes e padro de formao das operaes por nmero de placas:
inteiro[] geraSequenciaTermos(int n){ int[n] termos; string[n]operandos; int incrementaPares=1; string sinal="+"; se (n>3) { para i de 0 at n-1 faa termos[i] = n/2+i+1-n/2; se (incrementaPares==3){ if (sinal == "+") sinal="-"; else sinal="+"; incrementaPares=1; } operandos[i] = sinal; incrementaPares++; }} retorne termos;

O algoritmo inicia o clculo para k reexes com atribuio de valores para todo k < 3 da mesma forma que apresentada na soluo anterior para 3 placas de vidro, pois no houve mudana nesse padro. Quando o valor de k >= 3 realizado o clculo de cada termo do polinmio, que depende da quantidade de placas e reexes. O resultado de cada termo acumulado e realizado o clculo repetidamente at ndar o clculo de todos os termos da seqncia. Essa iterao demonstrada nas Tabelas 8 e 9, onde k possibilidades de 3 placas e reexes foram calculadas utilizando uma seqncia de polinmios gerada automaticamente pelo algoritmo.

Tabela 9 - Simulao do Algoritmo para 3 Placas. Aps a averiguao dos resultados com base nos casos de testes, foi possvel desenvolver o algoritmo nal para calcular as possibilidades de n placas e k reexes:
Inteiro CalculePlacas(int p, int r) Int k = 0; double soma = 0; double[] possibilidades; double[] aux; int proxTermo=3; int[] placa; int[] termo; String[] operando; Se (r = 0)

Listagem 4 - Algoritmo para de termos do polinmio e seu operando.

De posse das informaes contidas nas TabeRetorne 1 las 5, 6 e 7, cada linha das tabelas foram itera- Se (r >=1 e r <=2) das conjuntamente para formar uma sequncia Retorne r * p (Tabela 8). Seno

placa = geraSequenciaPlacas(p); termo = geraSequenciaTermos(p); possibilidades[k] = 1 possibilidades[k++] = p possibilidades[k++] = 2* p Para i=3 at r faa

Tabela 8 - Clculo dos Termos dos Polinmios.

Para j=0 at j < proxTermo faa Se (operando[j+1]=="+") soma = soma + p-placa[j] * possibilidades[k-termo[j]] Seno soma = soma - p-placa[j] * possibilidades[k-termo[j]] Fim- Para Se (r>i) { Se (k=p){ aux[k-1] = soma Para j=0 at j<k-1 faa aux[j] = possibilidades[j+1]; Para j=0 at j<k faa possibilidades[j]=aux[j]; }else{ possibilidades[k++] = soma; proxTermo++; } soma = 0;} Fim - Para Retorne Numero

de maior complexidade o clculo de 3 placas ou mais, onde existem duas iteraes para o clculo dos termos das seqncias de polinmios que podem ser representadas pelos seguintes somatrios N i N j . i=1 j=1

III Resultados
Os resultados (Tabela 10) foram obtidos com base em diversas conguraes at o limite proposto no estudo (16) para que pudesse ser feita uma comparao de resultados com outros trabalhos.

Listagem 5 - Algoritmo para Calcular as Possibilidades de Placas maiores que 2. Assim, exibida a combinao dos algoritmos desenvolvidos neste trabalho para soluo de qualquer congurao de n placas e k reexes:

Tabela 10 - Resultados.

IV Concluso

Inteiro CalculaCombinacoes(int n, int k) O problema buscava determinar de quantas formas um raio de luz poderia sofrer k reexes Se n = 1 Ento em uma pilha de n placas de vidro. Aps as Retorne 1 simulaes foram encontrados padres de reSe n = 2 Ento corrncia e a abordagem utilizada foi a geraRetorne CalculeDuasPlacas(n, k) o de sequncias de polinmios. A partir de Se n > 2 Ento uma congurao inicial (placas e reexes), Retorne CalculePlacas(n, k)

uma sequncia especca gerada automaticaListagem 6 - Algoritmo Proposto para Soluo mente para resolver a recorrncia, onde o algoritmo proposto calculou as possibilides para do Problema. as conguraes at o limite de 16 placas e 16 De posse da soluo algortmica foi possvel reexes e seus resultados foram apresentados realizar o clculo da sua complexidade, que ser neste trabalho. Embora no tenha sido realiapresentado brevemente. A complexidade do zado qualquer estudo, acredita-se que tcnica algoritmo desenvolvido para calcular duas pla- apresentada neste estudo pode ser mais ecaz cas de vidro pode ser dada pela anlise de sua e de simples construo que um interpretador recorrncia, onde a sua complexidade (logn). de expresses algbricas e pode ser melhorada Entretanto, a complexidade total do algoritmo para criar um modelo genrico para este tipo proposto O(n2 ) ou quadrtica, pois o trecho de aplicao na indstria.

Você também pode gostar