12
Uma Proposta de Solução para o Problema do “Círculo Cortado” Jaguaraci Batista Silva Instituto de Ciência e Tecnologia, Universidade Federal de São Paulo Campus São José dos Campos, São Paulo-SP [email protected] Resumo: O problema do “circulo cortado” pode ser divido em dois desafios principais, quando os números de 1 a n são ordenados em forma circular. O primeiro é encontrar dois números (a e b) no círculo, de forma que se uma linha for desenhada ligando esses números, cortando o círculo, a soma dos números de um lado do círculo é igual à soma dos números do outro lado. O segundo, é executar todas as combinações possíveis que satisfaçam as condições do primeiro desafio para todos os círculos de tamanho 2 até 2 milhões. O presente trabalho apresenta três propostas de solução: (i) algoritmo híbrido baseado nas técnicas de programação dinâmica e força bruta, (ii) programação linear combinada com a técnica de força bruta e (iii) estratégia de busca mínima e máxima para otimização das soluções anteriores e assim vencer os dois principais desafios do problema. Palavras-chaves: Complexidade, Algoritmo, Problema, Partição, Subconjuntos. 1 - Introdução Dado por uma situação em que os números de 1 a n são ordenados em forma circular, o problema proposto possui dois grandes desafios. O primeiro é encontrar dois números (a e b) no círculo, de forma que se uma linha for desenhada ligando esses números, cortando o círculo, a soma dos números de um lado do círculo é igual à soma dos números do outro lado. O segundo, é executar todas as combinações possíveis que satisfaçam as condições do primeiro desafio para todos os círculos de tamanho 2 até 2 milhões. O estudo relacionou os conceitos envolvidos com os desafios, a partir dos problemas clássicos de partição e soma de subconjuntos [1][3][4], propondo três soluções. A primeira combina os algoritmos de força bruta e seu refinamento [1][3]. A segunda propõe a melhoria da primeira solução combinando o algoritmo de força bruta com a técnica de programação linear [1]. A terceira cria uma estratégia de busca mínima e máxima de subconjuntos com base em uma variação do problema da mochila [5] (knapsack problems) para resolver o desafio em tempo hábil. O artigo apresenta, de forma breve, os conceitos relacionados com os problemas clássicos de partição e soma de subconjuntos, suas definições e algumas soluções encontradas na literatura na seção 2. Apresenta um maior detalhamento do problema e as três soluções propostas neste trabalho na seção 3. Em seguida são apresentados

Artigo Circulo Cortado

Embed Size (px)

DESCRIPTION

O problema do “circulo cortado” pode ser divido em dois desafios principais,quando os números de 1 a n são ordenados em forma circular. O primeiro é encontrardois números (a e b) no círculo, de forma que se uma linha for desenhada ligandoesses números, cortando o círculo, a soma dos números de um lado do círculo é igual àsoma dos números do outro lado. O segundo, é executar todas as combinaçõespossíveis que satisfaçam as condições do primeiro desafio para todos os círculos detamanho 2 até 2 milhões. O presente trabalho apresenta três propostas de solução: (i)algoritmo híbrido baseado nas técnicas de programação dinâmica e força bruta, (ii)programação linear combinada com a técnica de força bruta e (iii) estratégia de buscamínima e máxima para otimização das soluções anteriores e assim vencer os doisprincipais desafios do problema.

Citation preview

Page 1: Artigo Circulo Cortado

Uma Proposta de Solução para o Problema do “Círculo Cortado”

Jaguaraci Batista Silva

Instituto de Ciência e Tecnologia, Universidade Federal de São Paulo

Campus São José dos Campos, São Paulo-SP

[email protected]

Resumo: O problema do “circulo cortado” pode ser divido em dois desafios principais,

quando os números de 1 a n são ordenados em forma circular. O primeiro é encontrar

dois números (a e b) no círculo, de forma que se uma linha for desenhada ligando

esses números, cortando o círculo, a soma dos números de um lado do círculo é igual à

soma dos números do outro lado. O segundo, é executar todas as combinações

possíveis que satisfaçam as condições do primeiro desafio para todos os círculos de

tamanho 2 até 2 milhões. O presente trabalho apresenta três propostas de solução: (i)

algoritmo híbrido baseado nas técnicas de programação dinâmica e força bruta, (ii)

programação linear combinada com a técnica de força bruta e (iii) estratégia de busca

mínima e máxima para otimização das soluções anteriores e assim vencer os dois

principais desafios do problema.

Palavras-chaves: Complexidade, Algoritmo, Problema, Partição, Subconjuntos.

1 - Introdução

Dado por uma situação em que os números de 1 a n são ordenados em forma circular, o problema proposto possui dois grandes desafios. O primeiro é encontrar dois números (a e b) no círculo, de forma que se uma linha for desenhada ligando esses números, cortando o círculo, a soma dos números de um lado do círculo é igual à soma dos números do outro lado. O segundo, é executar todas as combinações possíveis que satisfaçam as condições do primeiro desafio para todos os círculos de tamanho 2 até 2 milhões. O estudo relacionou os conceitos envolvidos com os desafios, a partir dos problemas clássicos de partição e soma de subconjuntos [1][3][4], propondo três soluções. A primeira combina os algoritmos de força bruta e seu refinamento [1][3]. A segunda propõe a melhoria da primeira solução combinando o algoritmo de força bruta com a técnica de programação linear [1]. A terceira cria uma estratégia de busca mínima e máxima de subconjuntos com base em uma variação do problema da mochila [5] (knapsack problems) para resolver o desafio em tempo hábil.

O artigo apresenta, de forma breve, os conceitos relacionados com os problemas clássicos de partição e soma de subconjuntos, suas definições e algumas soluções encontradas na literatura na seção 2. Apresenta um maior detalhamento do problema e as três soluções propostas neste trabalho na seção 3. Em seguida são apresentados

Page 2: Artigo Circulo Cortado

os resultados encontrados nas abordagens e uma breve análise da complexidade dos algoritmos na seção 4. Por fim, a conclusão e referências utilizadas neste trabalho.

2 - O Problema Clássico da Partição e Soma de Subconjuntos

Os problemas de partição e soma de subconjuntos são bastante investigados e existe

uma vasta literatura sobre os assuntos, a exemplo dos trabalhos de: Kerlin e O’Neil [3],

Ciliebak et al [4] e Martello e Toth [5]. O problema de partição de conjuntos é definido

por [3] como: dado um conjunto S de inteiros positivos, determinar se S pode ser

particionado em dois subconjuntos que possui a mesma soma. Outra definição é dada

por [4], onde pretende-se conhecer a existência de um subconjunto A' de um

determinado conjunto de números A, tal que os elementos do subconjunto A' serão

adicionados exatamente até a metade da soma total de todos os elementos do

conjunto A. Já o problema da soma de subconjuntos é semelhante: dado um conjunto

S de inteiros positivos e um inteiro t, determinar se algum subconjunto de S

corresponde a soma t [3]. Segundo os autores [3], é possível reformular o problema da

partição de conjuntos como um caso especial do problema da soma de subconjuntos,

onde dado um conjunto de números inteiros positivos S = {y1, y2, ... yn}, determinar se

S tem um subconjunto cuja soma é (y1 + y2 + ... + yn) / 2. Em [4], os autores

apresentam uma pesquisa extensa com uma variedade de soluções para o problema

da soma de subconjuntos e em [3] um algoritmo é aplicado para resolver qualquer

problema de partição ou soma de subconjuntos, segundo os seus autores.

Por este motivo, todas as soluções utilizaram esses conceitos como referência para

resolver o problema. A próxima seção melhora o entendimento do problema e destaca

os principais entraves a serem vencidos, enquanto expõe as soluções propostas para

resolvê-los.

3 – Solução

O problema é descrito por uma situação em que os números de 1 a n são ordenados em forma circular. Após, é necessário encontrar dois números (a e b) no círculo, de forma que se uma linha for desenhada ligando esses números, cortando o círculo, a soma dos números de um lado do círculo é igual à soma dos números do outro lado. A Figura 1 ilustra um exemplo com 15 números.

Figura 1 – Simulação com 15 números.

Page 3: Artigo Circulo Cortado

É possível notar na ilustração (Figura 1), que a linha desenhada entre os números 7 e 13 divide o círculo em 2 sub-conjuntos: A = {8,9,10,11,12} e B= {6,5,4,3,2,1,15,14} e que a soma dos elementos dos subconjuntos possuem o mesmo valor em ambos os lados (Definição 1). Também, que os elementos que formam a linha são excluídos dos subconjuntos (Definição 2). O desafio é, principalmente, desenvolver um algoritmo que determine, para os valores de n, quais os dez conjuntos que possuem mais subconjuntos formados entre 2 e 2 milhões que atendam as seguintes definições, conforme o teorema geral: Definição 1 – O algoritmo construído deve assegurar que soma dos elementos dos

subconjuntos possíveis (lados do círculo) possuem o mesmo valor em ambos os lados.

Definição 2 – Quando da formação dos possíveis subconjuntos, a partir da divisão do

círculo, todos os seus elementos serão formados, excluindo os pares que entrecortam o círculo (linha de divisão).

Definição 3 – Um subconjunto formado a partir dos números ordenados contidos em

um círculo de tamanho n, não deve conter qualquer elemento oriundo de outro

subconjunto quando da partição do círculo em subconjuntos.

Teorema Geral - Dado um conjunto A com elementos ordenados de forma circular em

uma matriz, a serem agrupados em 3 subconjuntos distintos (A’, A’’e A’’’). A soma dos

elementos dos subconjuntos A’ e A’’ são iguais (Definição 1) e não constam os pares

que formam a linha que entrecorta o circulo (subconjunto A’’’) (Definição 2) e os

elementos dos subconjuntos são distintos (Definição 3).

Prova do Teorema Geral - Todo círculo pode ser dado pela seguinte fórmula ∑A = ∑A’ +

∑A’’ + ∑A’’’. Se ∑A’ é a soma dos elementos consecutivos de um subconjunto, a mesma

fórmula pode ajudar a encontrar a soma dos elementos não consecutivos, através da

seguinte equação: ∑A’’ = ∑A’ - (∑A - ∑A’’’). Assim, a soma de todos os elementos do

círculo (∑A), subtraindo os elementos pares que o entrecortam (∑A’’’) e os elementos

consecutivos já calculados (∑A’), resulta na soma dos elementos do outro lado do

círculo (∑A’’). Por conseqüência, se igual à soma dos elementos consecutivos, estas

condições satisfazem todas as definições de corte do círculo. Assim ∑A = ∑A’ + ∑A’’ +

∑A’’’. Também, A/3 subconjuntos possíveis, ∑A’ = ∑A’’ (Definição 1), A’’’ = {x A’ Ѵ

A’’} (Definição 2) e A’ = {x A’’ Ѵ A’’’} e suas inversões (Definição 3).

3.1 Soluções

Com base no estudo realizado sobre os problemas clássicos de partição e soma de

subconjuntos (Seção 2), o estudo construiu três soluções para vencer os desafios. A

primeira utiliza programação dinâmica [1] e propõe melhorias na primeira versão do

algoritmo empregando a técnica da força bruta [1]. A segunda solução suscita

melhorias na primeira utilizando a programação linear [1]. Após, foi construída uma

terceira solução, que se beneficia das soluções anteriores, e cria uma estratégia

Page 4: Artigo Circulo Cortado

baseada em uma variação do problema da mochila [5] para realizar buscas mínimas e

máximas de subconjuntos.

3.1.1 Solução 1 - Programação Dinâmica e Força Bruta

A primeira investigação foi tentar obter uma forma padrão para satisfazer as 3

definições do desafio (Seção 3), onde a partir de algumas simulações (Figuras 2 e 4), foi

percebido que o problema não possui essa característica. Dessa forma, o estudo

procurou desenvolver um algoritmo que pudesse verificar a correção de um primeiro

comportamento comum, e após, realizar buscas exaustivas utilizando um algoritmo de

força bruta.

Figura 2 – Solução Inicial.

A solução inicial foi encontrada com base no teorema da cruz, a ser detalhado mais

adiante nesse estudo. De acordo com a Figura 2, é possível notar que alguns conjuntos

com valores de n >=2 até ∞ e que possuem elementos ordenados em forma circular

em uma matriz de largura [2, n/2], podem ser divididos em 2 subconjuntos,

conseqüentemente, à direita e a esquerda das colunas centrais das matrizes (CC). Além

disso, essas colunas podem ser encontradas facilmente através do seguinte cálculo:

((n/2)/2)+1. E por sua vez, as colunas centrais, que dividem as matrizes (destacadas em

azul), possuem elementos superiores e inferiores que formam as extremidades das

linhas que cortam os círculos.

Figura 3 – Teorema da Cruz.

Teorema da Cruz – O teorema da cruz (Figura 3 à direita) define a primeira condição

comum a ser considerada na busca exaustiva por subconjuntos. Ao organizar os

elementos em uma matriz onde: na primeira linha superior consta a indicação dos

números de elementos do círculo, em seguida, cada coluna da segunda linha existe a

soma dos elementos contidos nas linhas inferiores, inclusive os elementos que formam

Page 5: Artigo Circulo Cortado

a linha que divide o círculo (em azul). Esses elementos centrais formam uma cruz e

dividem os lados do círculo satisfazendo todas as definições (Seção 3).

Prova do Teorema da Cruz – Dado um círculo com o número de elementos n = 5,

formando um conjunto A = {0, 1, 2, 3, 4, 5}, onde A Є Z. Este será sempre dividido em 3

subconjuntos possíveis: A’ = {0, 5} , A’’ = {2, 3} e A’’’ {1, 4}. Assim se ∑A’ = {5}, ∑A’’ = {5}

e ∑A’’’ = {5}, ∑A = {15}, pois 15 = 5 + 5 + 5 (Teorema Geral). Também ∑A’ = ∑A’’ ou 5 = 5

(Definição 1), A’’’ = {x A’ Ѵ A’’} (Definição 2) e A’ = {x A’’ Ѵ A’’’} e suas inversões

(Definição 3).

obterPossibilidadesApartirDoTeoremadaCruz(int n) {

double ladoDireito = 0;

double ladoEsquerdo = 0;

possibilidade = 0;

Para j=0 até j<2 faça{

Para i=0 até i<limite/2 faça{

R[i+1][j] = M[j][i];

ladoEsquerdo =

ladoEsquerdo + R[i+1][j];

}

}

R[0][0]= ladoEsquerdo;

Para j=0 até j<2 faça{

Para i=limite/2 até i<M[1].tamanho-1 faça{

R[i+1][j] = M[j][i+1];

ladoDireito =

ladoDireito + R[i+1][j];

}

}

R[0][1]= ladoDireito;

Se (R[0][0] == R[0][1])

possibilidade++;

retorne possibilidade;

} Listagem 1 – Solução usando Programação Dinâmica.

A Listagem 1 apresenta a implementação do teorema da Cruz, entretanto apenas o

teorema da cruz não foi suficiente para verificar todas as possibilidades. Durante

outras simulações foram encontrados diversos casos em que as definições foram

satisfeitas, porém o padrão de formação dos subconjuntos não seguiu a solução

apresentada no teorema. Desta forma, o algoritmo não poderia ser considerado uma

solução ótima para o problema. Para alcançar essa condição, foi necessário utilizar a

técnica de força bruta [1], verificando todas as combinações possíveis que

satisfizessem as definições (Figura 4).

Page 6: Artigo Circulo Cortado

Figura 4 – Alguns Resultados Utilizando o Algoritmo de Força Bruta.

Com o apoio da combinação das técnicas de programação dinâmica e força bruta, cada

partição de um conjunto foi verificada, testando todas as possibilidades possíveis. Para

comparar a somas dos lados, após o corte do circulo, à medida que o algoritmo

realizava a busca por elementos e agrupando-os em subconjuntos. Uma tabela foi

adicionada para guardar os resultados e comparar, a partir de uma escolha ótima, se

os totais de cada lado eram iguais e se todas as definições haviam sido satisfeitas,

conforme exibição dos dados na Figura 5.

Figura 5 – Soma dos subconjuntos.

3.1.2 Solução 2 – Programação Linear e Força Bruta

O principal problema encontrado na primeira solução, utilizando o algoritmo de força

bruta, é que todas as situações são testadas à exaustão. As condições onde ∑A’ ou ∑A’’

é menor ou maior que K, onde K = ∑A’ - (∑A - ∑A’’’) e inversões, resultam em um

aumento significativo do custo computacional durante a realização dos cálculos das

possíveis divisões de A. A primeira melhoria foi adicionar limites (superior e inferior)

para garantir que o algoritmo não realizasse todas as combinações possíveis

desnecessariamente. Os limites foram adicionados com base em um modelo de

dispersão após a coleta dos primeiros resultados. O limite superior inicia a partir do

último elemento de A até a sua metade e o inferior a partir do antepenúltimo até o

primeiro. Também, toda vez que uma possibilidade é encontrada nesse limiar de

possibilidades, há uma condição de parada para que o algoritmo prossiga com a

próxima. Assim, a otimização do algoritmo permitiu adicionar um pouco de inteligência

à solução, conforme a exibição do pseudocódigo (Listagem 2).

obterApartirDaForcaBruta(int n) {

double somaX=0;

double somaY=0;

V=preencheVetor(n);

Page 7: Artigo Circulo Cortado

Para j=n até j>=n/2 decremente j-1)

Para i=n-2 até i>=1 decremente i-1){

somaX = somaPA(V[i+1],V[j-1]);

somaZ = somaPA(1,n);

somaY = ((somaZ-(j+i))-somaX);

Se (somaX==somaY && somaX>0 && somaY>0)

possibilidade++;

break;

}

retorne possibilidade;

}

Listagem 2 – Solução usando Programação Linear.

A segunda melhoria foi baseada na redução da complexidade quando da soma dos

termos dos elementos (linhas 7-9) dos subconjuntos (A’ e A’’). Foi utilizada a fórmula

de cálculo de uma Progressão Aritmética (PA) [6], adaptada a fórmula geral

demonstrada na seção 3 (Teorema Geral), o que possibilitou reduzir a complexidade

do trecho das somas dos elementos (somaX e somaY) de O(��) para O(1).

3.1.3 Solução 3 – Busca Mínima e Busca Máxima

A primeira parte do desafio tinha sido vencida, faltava apenas realizar um ranking das

maiores possibilidades de cortes utilizando círculos de tamanhos enormes (2 milhões)

e este foi o principal entrave do desafio. Apesar de haver uma mudança significativa

em relação ao primeiro algoritmo, até esta etapa do estudo, não havia condições de

responder a questão em um tempo tolerável. Por isso, o estudo buscou mais uma

melhoria na solução com base em uma variação de um dos problemas clássicos da

mochila [5].

A terceira solução buscou uma combinação dos algoritmos construídos na primeira e

segunda solução, associando-os a uma das soluções do problema da mochila binária

em três etapas:

1) É construído um algoritmo inicial (busca mínima), que possui maior

otimização por não realizar pesquisas exaustivas, o qual é executado para

procurar por círculos que satisfazem as definições apenas uma única vez

para todo N >= 2 e N <= 2000.000.

2) Após, cada conjunto N que satisfaz as definições de corte mínimo é

adicionado em uma mochila.

3) O algoritmo de força bruta obtém cada conjunto da mochila e procura pelos

subconjuntos que satisfazem as definições, porém em um universo maior,

buscando todas as combinações possíveis (busca máxima).

A combinação das buscas (mínimas e máximas) foi bastante promissora para

redução do tempo de processamento, porém não pôde ser considerada ótima na

sua primeira versão. Houve casos em que o algoritmo baseado no teorema da cruz

Page 8: Artigo Circulo Cortado

(busca mínima) não encontrou conjuntos que poderiam ser cortados, devido ao

seu limite de pesquisa ser reduzido, ao testar essa amostra com o algoritmo de

força bruta (busca máxima) houve uma contradição a idéia formulada na solução 3

(Figura 6 em amarelo).

Figura 6 – Primeira Versão da Solução 3.

Em uma nova simulação com o valor de N igual a 6.222, a busca mínima, utilizando o

algoritmo melhorado da segunda solução (força bruta), reduziu para 64% ou 3.982 o

universo de busca exaustiva, evitando que a busca máxima fosse empregada em 36%

dos conjuntos que não tinha nenhuma possibilidade de divisão. Os resultados de todas

as simulações e comparações entre as versões melhoradas dos algoritmos serão

apresentados na próxima seção.

4 - Resultados

O estudo utilizou um notebook de 32 bits, com processador Intel Core2 Duo (1.83 GHz)

e memória de 3GB (667 MHz DDR2), sistema operacional Microsoft Windows Vista

Business (Versão 6.0, Compilação 6002, Service Pack 2) o ambiente de

desenvolvimento Eclipse 3.5.1 (Buid 20090920-1017), com o Java Development Kit

(JDK) 1.6 e linguagem de programação Java.

A análise dos resultados demonstra que houve realmente uma melhoria significativa

em relação às versões dos algoritmos propostos nas soluções. A primeira solução (T.

Cruz) possui complexidade O(n/2), sua implementação foi baseada no teorema

formulado nesta pesquisa e conseguiu o melhor tempo para realizar as buscas.

Entretanto, a segunda solução (FBc/PL) é ótima, pois verifica todas as possibilidades

Page 9: Artigo Circulo Cortado

realizando buscas exaustivas, por isso sua complexidade é O(n/2*n), o que justifica o

seu tempo de solução ser muito maior que o da primeira. A segunda versão do

algoritmo (FBc/PL*), utilizando programação linear e as otimizações citadas (Seção

3.1.2), reduziu drasticamente o tempo de busca em relação a primeira versão (FBc/PL).

É possível notar claramente (Figura 7) que ele é muito mais rápido que o anterior,

mesmo com a utilização da técnica de força bruta.

Figura 7 – Comparação dos Algoritmos Construídos.

A Figura 8 apresenta uma análise realizada com aumento do volume de dados, o que

apresenta uma idéia da eficiência da solução 2 quando comparada com o primeiro

algoritmo desenvolvido. A primeira solução (T. Cruz) segue com o melhor tempo entre

todos, porém sem efetividade na busca. A versão otimizada da solução 2 (FBc/PL*)

conseguiu encontrar todas as possibilidades com uma melhoria significativa em

relação a primeira versão e pode ser considerada uma solução ótima para conjuntos

de dados com tamanho grandes (e.g. milhares).

Figura 8 – Comparação dos Algoritmos com Tamanhos Maiores.

Conforme relatado (Seção 3.1.3) a última solução buscou uma estratégia de busca

mínima e máxima de subconjunto. Apresentou melhorias significativas na solução,

Page 10: Artigo Circulo Cortado

reduzindo em 36% a quantidade de conjuntos a serem verificados (Figura 9). Com base

nesse resultado, o estudo utilizou a versão ótima do algoritmo construído na solução 2

(FBc/PL*) adaptado para realizar buscas mínimas e máximas.

Figura 9 – Redução do Universo de Busca.

Embora o último algoritmo desenvolvido tenha melhorias significativas, com base nos

testes para valores ainda maiores que os anteriores (Figura 11), a última solução não

conseguiria resolver uma grande quantidade de dados em tempo hábil. Conforme

demonstram os dados, o tempo de solução de cada conjunto separadamente é baixo

(linha em branco), porém, o tempo total da solução (linha em azul) é ainda intolerável

para solução do problema. Com base nessa última análise dos resultados, a principal

dúvida seria responder em quanto tempo o algoritmo seria capaz de resolver o desafio

para valores de n >= 2 milhões.

Figura 11 – Resultados da Solução 3 com Algoritmo Otimizado.

Após realizar diversas simulações e cálculo da complexidade total do algoritmo, foi

possível estimar o tempo de solução dos algoritmos de busca mínima e máxima de

subconjuntos combinados (FBc/PL*). A Figura 12 exibe a projeção de alguns valores

utilizando uma fórmula de previsão [8] até o limite proposto no desafio. De posse

dessa previsão, foi possível conhecer o tempo de solução para conjuntos de dados

enormes, o que reduziu o tempo de análise e simulação de experimentos. Também,

facilita a comparação dos resultados com outras soluções para o mesmo problema,

além de demonstrar claramente, quais os limites do algoritmo proposto. No entanto, a

projeção foi realizada com os resultados dos experimentos realizados em um

computador específico, desta forma, além da possibilidade de erros por desvios nos

Page 11: Artigo Circulo Cortado

resultados coletados, pode haver também diferenças quando o mesmo algoritmo for

executado em computadores com maior ou menor poder de processamento que o

utilizado neste estudo (Seção 4).

Figura 12 – Previsão de Tempo para Solução do Desafio.

Um novo experimento poderia ser proposto para construção de um algoritmo híbrido

combinando uma estratégia gulosa [1] e outra variação do problema da mochila [5].

Por realizar uma busca mínima começando por 2 milhões e reduzindo o universo das

buscas (36%) de forma iterativa (e.g. 1.000.000, 640.000, 409.600, 262.144) a cada

iteração. O algoritmo guloso iria buscar um mínimo possível (1, 2, 3, 4, 5... n),

armazenando na mochila apenas os valores de n com possibilidades n+1. Com o

conjunto de dados sempre reduzindo e buscando apenas o próximo maior valor uma

única vez, acredita-se que essa estratégia teria uma redução significativa no tempo

total de processamento.

5 - Conclusão

O problema do círculo cortado é dado por um círculo composto por números de 1 a n

ordenados em forma circular, onde se deseja encontrar dois números no círculo, de

forma que se uma linha for desenhada ligando esses números, cortando o círculo, a

soma dos números de um lado do círculo é igual à soma dos números do outro lado.

Após, devem ser listados os círculos com as maiores possibilidades de cortes a partir

de uma configuração (n>=2 e n<=2 milhões). Este trabalho associou o desafio ao

problema clássico de partição e soma de subconjuntos e apresentou três soluções.

A primeira solução utilizou técnicas de programação dinâmica e força bruta e

necessitou de melhorias significativas para resolver o desafio. O algoritmo proposto na

Page 12: Artigo Circulo Cortado

segunda solução utilizou técnicas de programação linear e força bruta e os seus

resultados foram melhores, porém não conseguiu obter êxito no processamento de

todas as possibilidades até o limite proposto de 2 milhões de círculos. A terceira

solução reduziu o tempo final de processamento, utilizando uma estratégia de busca

mínima e máxima, conseguiu diminuir para 64% o universo de busca. Conforme os

resultados apresentados, o algoritmo é ótimo para resolver conjuntos de dados com

tamanhos grandes, porém não é possível resolver o desafio em tempo hábil.

Embora não tenha sido provado com um experimento completo (por limitação de

tempo), acredita-se que o algoritmo proposto na última solução poderia resolver o

problema em aproximadamente 23 dias. Todo o estudo foi realizado em um

computador de uso doméstico, e se fosse utilizado um equipamento projetado

especificamente para este tipo de trabalho (próprios de institutos de pesquisa),

acredita-se que a solução poderia ser dada em tempo muito inferior ao previsto neste

estudo. Também o estudo sugeriu outras melhorias (Seção 4), que combinadas ou não

às outras técnicas de otimização [2][7], podem adicionar maior inteligência aos

algoritmos de busca mínima e máxima, reduzindo o tempo total de processamento de

dias para talvez horas.

Referências

[1] Cormen, T.H., Leiserson, C.E., Rivest, R.L., Stein, C.. "Introduction to Algorithms", MIT Press, Cambridge, Massachusetts, London, 2nd Ed, 2001. [2] Gurari, E. M.. “Backtracking Algorithms”. CIS 680: Data Structures Course Notes, Ohio state University, Columbus, Ohio, 1999. Acessado em 29 de maio de 2012, http://www.cse.ohio-tate.edu/~gurari/course/cis680/cis680Ch19.html. [3] Neil, T. E., Kerlin, S.. “A Simple 2 ^0(sqrt(x)) Algorithm for PARTITION and SUBSET SUM”. Computer Science Department, University of North Dakota. Acessado em 29 de maio de 2012, http://people.aero.und.edu/~oneil/pubs/fcs10.pdf. [4] Ciliebal, M., Eidebenz, S., Pagourtzis, A., Schlude, K.. “Equal Sum subsets: Complexity of Variations”. Institute of Theoretical Computer Science. ETH Zurich,2002 . [5] Martello, S., Toth P.. “Knapsack Problems Algorithms and Computer Implementation”. Wiley-Interscience Series in Discrete Mathematics and Optimization. ISBN 0471924202, John Wiley & Sons, Canada, 1990. [6] Wikipedia. “Fórmula do Termo Geral”, seção: Somatório da PA. Acessado em 01 de junho de 2012, http://pt.wikipedia.org/wiki/F%C3%B3rmula_do_termo_geral. [7] Constantino, A. A., Dos Reis, P. A., Neto, C. F. X. M., Figueiredo, M. F.. “Aplicação de Algoritmos Genéticos Ao Problema de Cobertura de Conjunto”. Anais do XXXV Simpósio Brasileiro de Pesquisa Operacional (SBPO). Natal-RN, 2003. [8] Microsoft. "Description of the Forecast Function in Excel". Acessado em 01 de junho de 2012, http://support.microsoft.com/kb/828236.