Escolar Documentos
Profissional Documentos
Cultura Documentos
Volume do show
Elverton C. Fazzion
1
Departamento de Ciência da Computação – Universidade Federal de Minas Gerais (UFMG)
elverton@dcc.ufmg.br
1. Introdução
Este trabalho tem como plano de fundo, um problema parecido com o problema da
mochila, com a diferença que neste problema eu não tenho uma pergunta do tipo “coloco
ou não o item“ . Neste caso, uma analogia talvez seja melhor para entender.
Suponha que seja um balde com um pequeno volume inicial de àgua. Eu tenho x
passos a se fazer: acrescentar ou retirar um determinado volume de água. Meu limite é
que a àgua do balde não transborde e que eu não fique com um volume de água negativo.
Assim, o que eu devo fazer nesses x passos para que eu termine com o maior volume de
àgua possı́vel?
Analisando este exemplo, podemos jogá-lo para o nosso problema atual onde a
àgua representa o volume, o volume máximo representa o balde e o volume de àgua final
representa o volume da última música. Dessa forma, neste trabalho iremos responder
algumas perguntas pensando nisso. Tais perguntas serão: O problema tem subestrutura
ótima? O problema tem propriedade gulosa? Há sobreposição de subproblemas? Dessa
forma, prosseguimos a documentação para responder a essas perguntas.
2. REFERÊNCIAS RELACIONADAS
Podemos dividir as referências associadas ao problema estudado e a solução proposta
dentre os seguintes grupos:
• LateX: Não basta apenas resolver um problema. É necessário documentá-lo para
que outros o entendem e o utilizem como guia para a resolução de um problema.
O LateX é uma ferramenta amplamente utilizada para gerar documentações.
• Linguagem C: Todo o trabalho foi implementado em linguagem de programação
C. A linguagem C é uma linguagem de propósito geral amplamente utilizada no
desenvolvimento de sistemas de alto desempenho, de tempo real, sistemas op-
eracionais, compiladores, dentre outros. O compilador mais utilizado para a lin-
guagem C é o GCC (desenvolvido pelo projeto GNU).
• Projeto e análise de algoritmos: Algoritmos são procedimentos computacionais
capazes de resolver diversos problemas do mundo real. Entender sobre eles é
muito útil para se tentar produzir algoritmos mais eficientes e como melhor de-
sempenho, retirando passos desnecessários ao problema.
3. SOLUÇÃO PROPOSTA
Para dar a solução proposta, é necessário que seja respondida as perguntas feitas, para
abordar a solução para cada uma delas. A solução do problema pede para implementar
um algoritmo força bruta. Além disso, é preciso implementar uma solução gulosa e uma
solução usando programação dinâmica. Assim, essa sessão será dividida em três partes:
uma explicando cada uma dessas programações (força bruta, dinâmica e gulosa). Caso
não haja como fazer alguma delas, será explicado no seu escopo.
O algoritmo força-bruta funciona dessa forma. Assim sendo, fazendo sua análise
de complexidade no pior dos casos, onde nenhum nodo não ultrapassará o limite ou ficará
negativo. Dessa forma, ele percorrerá uma árvore binária e o custo para se percorrer isto
é O(2n ).
Como esse algoritmo ficou com muitos algumentos de entrada (7 no total), para
melhorar o uso dele, visto que p,x e xm podem ser criados dinâmicamente, existe uma
função máscara para usar essa função. Ela gera o p,x e xm, só necessitando de n,v,L,t.
2: Mascara(n,v,L,t)
Cria p,x,xm;
Chama Operação binaria(n,v,L,p,t,x,xm);
Porém, não há uma regra para um algoritmo guloso. A prova se dá por contra-
exemplo. Suponha que haja esse algoritmo. Dessa forma, para cada subestrutura ótima,
Figura 2. Observe pelas setas
o que o algoritmo guloso faria.
Porém o melhor resultado está
num caminho que ele excluiu.
ele irá pegar o melhor valor de cada subestrutura. Porém isso pode nos levar a um resul-
tado que não seja o melhor. A figura abaixo nos mostra isso:
Por essa razão, como não há garantia que, sempre ao seguir o melhor resultado
de cada subproblema, ele estará indo pelo melhor caminho. Assim, não há um algoritmo
guloso para este problema.
Nesse problema, temos uma sobreposição de problemas. Suponha que, após descer um
nı́vel da árvore, encontremos dois nodos com o mesmo valor. Dali para baixo, esses nodos
darão origem às mesmas árvores, pois fará as mesmas operações para cada variação no
volume. Ou seja, basta calcular um, visto que temos resultados duplicados, que achamos
um resultado único para comparar com os demais resultados.
Uma proposta para resolver o problema usando programação dinâmica se encontra
abaixo, usando matriz.
4. IMPLEMENTAÇÃO
A implementação foi dividida em duas. Uma para a força bruta e uma para a programação
dinâmica, cada qual em pasta separada, com sua própria main. Porém por motivos de
simplicidade, serão citadas aqui em conjunto.
4.1. Código
4.1.1. Arquivos .c
4.2. Compilação
O programa deve ser compilado através do compilador GCC através de um makefile in-
cluı́do com o programa. Tanto o força bruta quanto o dinâmico possuem seus próprios
makefiles em suas pastas.
4.3. Execução
A execução do programa tem como parâmetros:
• Um arquivo padronizado de acordo com a especificação do problema.
O comando para a execução do programa é da forma:
./Executable <arquivo de entrada>
A entrada é composta de múltiplos casos de teste. Cada caso de teste é fornecido em duas
linhas. A primeira linha contém 3 inteiros: número de músicas no show, volume inicial e
o volume limite. Na segunda linha, temos N -1 inteiros que representam as alterações no
volume de uma música para a próxima.
1 (número de instâncias)
4 5 10
5 3 7
A saı́da do programa é feita na saı́da padrão. Cada linha da saı́da padrão contém o maior
volume possı́vel para cada instância.
10
5. AVALIAÇÃO EXPERIMENTAL
A avaliação experimental foi feita com base no timer do bash: time ¡comando¿ e usando
sys time + user time. Dessa forma, para comparar o desempenho do dinâmico com o
força bruta, foram colocados no mesmo grafico o tempo gasto por cada um para cada
música. O importe a comentar é que o o limite nesse caso foi o maior possı́vel e o volume
inicial foi algo mediano. Além disso, as variações foram colocadas as minimas possı́veis
fazendo com que o força bruta percorresse a árvore ao máximo, mostrando o seu tempo
de execução máximo. O mesmo foi feito para o dinâmico, para que o mesmo tivesse uma
grande variedade de números diferentes.
Figura 3. Observe que o
tempo para o dinâmico per-
manece quase que constante
para até 1000 entradas en-
quanto o força bruta tem um
pico com 33 músicas.
6. CONCLUSÃO
O objetivo do trabalho, que era estudar e aplicar a teoria de programação dinâmica,
força bruta, sobreposição de problemas e subestruturas ótimas foi atingido. Deu para
notar aa diferença de desempenho quando um problema é resolvido por força bruta e
por programação dinâmica. Além do mais, a busca por um modelo guloso para re-
solver esse problema, fez com que chegasse a conclusões exemplificadas como: um prob-
lema com subestrutura ótima nem sempre pode-se aplicar um algoritmo guloso e que a
implementação dinâmica melhora em grande escala o tempo de execução do algoritmo.
7. BIBLIOGRAFIA:
• Cplusplus:(”http://cplusplus.com”): Referência de Syntax C.
• Cormen: Algoritmo e prática: Livro para a teoria de programação dinâmica,
sobreposição de problemas, subestrutura ótima, e algoritmo guloso.