|
TProcura
Biblioteca em C++ para testes paramรฉtricos de algoritmos, e coleรงรฃo de algoritmos de procura e otimizaรงรฃo
|
Execuรงรฃo de exemplo com base no problema do Aspirador. Pode acompanhar o teste executando as aรงรตes localmente.
โโ Teste TProcuraConstrutiva โโโ
โ 1 - Aspirador โ
โ 2 - Puzzle 8 โ
โ 3 - 8 Damas โ
โ 4 - Partiรงรฃo โ
โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
Opรงรฃo: 1
Selecione o problema do Aspirador: 1.
Avanรงamos agora para a procura em profundidade. Neste caso temos neste algoritmo diversas estratรฉgias. Podemos executar esta procura com um limite de profundidade. Vamos fazer isso na instรขncia 2, que sabemos ter uma soluรงรฃo de 3 movimentos.
Utilizar a instรขncia nรบmero 2, o algoritmo profundidade primeiro, com limite de profundidade a 3, com nรญvel de debug mรกximo, ignorando repetidos e ver aรงรตes a 1: 1; 2; 3; 1; 3; 7; 3; 2; 4; 8; 1; 6; 1; ENTER; 6.
O parรขmetro 1 รฉ o algoritmo, em que o 3 รฉ a profundidade primeiro.
โโ โ P1(ALGORITMO) โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ โ Algoritmo base a executar. โ 1: Largura Primeiro โ 2: Custo Uniforme โ 3: Profundidade Primeiro โ 4: Melhor Primeiro โ 5: A* โ 6: IDA* โ 7: Branch and Bound โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ ALGORITMO (atual 1): 3
O parรขmetro 7 รฉ o limite, com diferentes interpretaรงรตes conforme o algoritmo.
Na procura em largura o limite servia para limitar o nรบmero de estados gerados mas nรฃo expandidos. Aqui serve para limitar o nรญvel de profundidade, que รฉ fixado a 3.
Opรงรฃo: 6 โโคโ โบ Execuรงรฃo iniciada โโโ โโ โโคโ ๐ฐ g:0 โโโ โ * [*] โ โโ โโคโ ๐ 1 ๐ฐ g:1 โ 1|2 โโโ โก esq โ โ [*] * โ โ โโ โโคโ ๐ 3 ๐ฐ g:2 โ 2|4 โโโ โก dir โ โ โ * [*] โ โ โ ๐ ๐ช โ โ โโ โโคโ ๐ 4 ๐ฐ g:2 โ 2|4 โโโ โก asp โ โ [.] * โ โ ๐ ๐ช โ โโ โโคโ ๐ 2 ๐ฐ g:1 โ 2|4 โโโ โก asp โ * [.] โ โโ โโคโ ๐ 5 ๐ฐ g:2 โ 3|6 โโโ โก esq โ โ [*] . โ โ ๐ ๐ช โ โโ โโคโ ๐ 6 ๐ฐ g:2 โ 3|6 โโโ โก asp โ * [.] โ ๐ ๐ช โโ Parรขmetros โ P1=3 P2=4 P3=1 P4=10 P5=0 P6=1 P7=3 P8=1 P11=0 โโงโ ๐ Execuรงรฃo terminada โฑ โโโ Aspirador โโ โ Parรขmetros โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ โ P1(ALGORITMO): Profundidade Primeiro | P2(NIVEL_DEBUG): COMPLETO | P3(SEMENTE): 1 โ P4(LIMITE_TEMPO): 10 | P5(LIMITE_ITERACOES): 0 | P6(VER_ACOES): 1 | P7(LIMITE): 3 โ P8(ESTADOS_REPETIDOS): ignorar | P11(BARALHAR_SUCESSORES): 0 โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ * [*] โโ โ Indicadores โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ โ I1(IND_CUSTO): -1 | I2(Tempo(ms)): 0 | I3(Iteraรงรตes): 0 | I4(IND_EXPANSOES): 3 | โ I5(IND_GERACOES): 6 | I6(IND_LOWER_BOUND): 0 โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ โโ โฐ Menu โโโโโโโโโโฌโโโโโโโโโโโโโโโโโฌโโโโโโโโโโโโโโโโโโโโโโฌโโโโโโโโโโโโโโโ โ 1 ๐ Instรขncia โ 2 ๐ Explorar โ 3 โ Parรขmetros โ 4 โ Soluรงรฃo โ โ 5 โ Indicadores โ 6 โบ Executar โ 7 ๐ ๏ธ Configuraรงรตes โ 8 ๐งช Teste โ โโโโโโโโโโโโโโโโโโโโโดโโโโโโโโโโโโโโโโโดโโโโโโโโโโโโโโโโโโโโโโดโโโโโโโโโโโโโโโ Opรงรฃo:
Podemos ver todos os estados gerados. A รกrvore tendo 3 nรญveis, permite dois movimentos, pelo que nรฃo foi descoberta a soluรงรฃo, retornando -1. No รบltimo nรญvel hรก um nรณ folha, indicando que รฉ final da รกrvore, e motivo, neste caso uma escada a simbolizar o limite da procura.
Embora o indicador 6 nรฃo seja atualizado, este resultado pode ser utilizado para saber que nรฃo hรก nenhuma soluรงรฃo de comprimento inferior a 3, ou seja, รฉ um lower bound, neste caso 3, jรก que o custo de cada movimento รฉ unitรกrio.
Esta visualizaรงรฃo da รกrvore da procura รฉ interessante para pequenos problemas, mas naturalmente que procuras maiores torna-se impraticรกvel. Podemos observar aqui que o estado inicial foi gerado novamente, com etiqueta 3, dado que estamos a ignorar os repetidos.
Colocar a profundidade a 10, e o nรญvel de debug a 3, ver aรงรตes a 4: 1; 2; 3; 7; 10; 2; 3; 6; 4; ENTER; 6.
Opรงรฃo: 6 โโคโ โบ Execuรงรฃo iniciada โโโ โโ โโคโ ๐ฐ g:0 โโโ โ โโ โโคโ ๐ 1 ๐ฐ g:1 โ 1|2 โโโ โก esq โ โ โโ โโคโ ๐ 3 ๐ฐ g:2 โ 2|4 โโโ โก dir โ โ โ โโ โโคโ ๐ 5 ๐ฐ g:3 โ 3|6 โโโ โก esq โ โ โ โ โโ โโคโ ๐ 7 ๐ฐ g:4 โ 4|8 โโโ โก dir โ โ โ โ โ โโ โโคโ ๐ 9 ๐ฐ g:5 โ 5|10 โโโ โก esq โ โ โ โ โ โ โโ โโคโ ๐ 11 ๐ฐ g:6 โ 6|12 โโโ โก dir โ โ โ โ โ โ โ โโ โโคโ ๐ 13 ๐ฐ g:7 โ 7|14 โโโ โก esq โ โ โ โ โ โ โ โ โโ โโคโ ๐ 15 ๐ฐ g:8 โ 8|16 โโโ โก dir โ โ โ โ โ โ โ โ โ โโ โโคโ ๐ 17 ๐ฐ g:9 โ 9|18 โโโ โก esq โ โ โ โ โ โ โ โ โ โ [*] * โโโ ๐ ๐ช โ โ โ โ โ โ โ โ โ โโ โโคโ ๐ 18 ๐ฐ g:9 โ 9|18 โโโ โก asp โ โ โ โ โ โ โ โ โ * [.] โโโ ๐ ๐ช โ โ โ โ โ โ โ โ โโ โโคโ ๐ 16 ๐ฐ g:8 โ 9|18 โโโ โก asp โ โ โ โ โ โ โ โ โโ โโคโ ๐ 19 ๐ฐ g:9 โ 10|20 โโโ โก dir โ โ โ โ โ โ โ โ โ . [*] โโโ ๐ ๐ช โ โ โ โ โ โ โ โ โโ โโคโ ๐ 20 ๐ฐ g:9 โ 10|20 โโโ โก asp โ โ โ โ โ โ โ โ [.] * โโโ ๐ ๐ช โ โ โ โ โ โ โ โโ โโคโ ๐ 14 ๐ฐ g:7 โ 10|20 โโโ โก asp โ โ โ โ โ โ โ โโ โโคโ ๐ 21 ๐ฐ g:8 โ 11|22 โโโ โก esq โ โ โ โ โ โ โ โ โโ โโคโ ๐ 23 ๐ฐ g:9 โ 12|24 โโโ โก dir โ โ โ โ โ โ โ โ โ * [.] โโโ ๐ ๐ช โ โ โ โ โ โ โ โ โโ โโคโ ๐ 24 ๐ฐ g:9 โ 12|24 โโโ โก asp โ โ โ โ โ โ โ โ [.] . โ โ โ โ โ โ โ โ ๐ฏ Soluรงรฃo encontrada! ๐ฐ g:9 โ โ โ โ โ โ โ โ โ [.] . โโโ ๐ฏ 9 โ ๐ โโโ { ๐ 22 } โโโ { ๐ 12 } โโโ { ๐ 10 } โโโ { ๐ 8 } โโโ { ๐ 6 } โโโ { ๐ 4 } โโโ { ๐ 2 } โโ Parรขmetros โ P1=3 P2=3 P3=1 P4=10 P5=0 P6=4 P7=10 P8=1 P11=0 โโงโ ๐ Execuรงรฃo terminada โฑ โโโ Aspirador โโ โ Parรขmetros โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ โ P1(ALGORITMO): Profundidade Primeiro | P2(NIVEL_DEBUG): DETALHE | P3(SEMENTE): 1 โ P4(LIMITE_TEMPO): 10 | P5(LIMITE_ITERACOES): 0 | P6(VER_ACOES): 4 | P7(LIMITE): 10 โ P8(ESTADOS_REPETIDOS): ignorar | P11(BARALHAR_SUCESSORES): 0 โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ [.] . โโ โ Indicadores โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ โ I1(IND_CUSTO): 9 | I2(Tempo(ms)): 0 | I3(Iteraรงรตes): 0 | I4(IND_EXPANSOES): 12 | โ I5(IND_GERACOES): 24 | I6(IND_LOWER_BOUND): 0 โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ ... Opรงรฃo:
Com o nรญvel debug a 3 vemos a รกrvore de procura sem os estados expandidos, mas vemos as aรงรตes. Vemos no entanto todos os estados folha, o que pode ser importante para conhecer os estados cortados. A informaรงรฃo รฉ mais reduzida, e poderรก ser uma boa forma de analisar e ver a รกrvore, o que com a informaรงรฃo completa dos estados poderia jรก nรฃo ser possรญvel.
Vemos que no nรญvel 10 os estados sรฃo todos nรณs folha, o que permite que o algoritmo evolua em largura, alcanรงando um estado soluรงรฃo.
Notar que ao retornar, os estados gerados nรฃo expandidos sรฃo mostrados no final de cada ramo. Assim, รฉ possรญvel confirmar a totalidade de estados gerados e quando foram expandidos.
A soluรงรฃo nรฃo รฉ รณptima, tem comprimento 9! Podemos visualizar a soluรงรฃo, introduza: 4.
Opรงรฃo: 4
โโ โ Soluรงรฃo โโ
* [*] (๐ฐ g:0) โก โ esq โ dir โ esq โ dir
* [*] (๐ฐ g:4) โก โ esq โ dir โ asp โ esq
[*] . (๐ฐ g:8) โก โ asp
[.] . (๐ฐ g:9) ๐ฏ
Como o algoritmo รฉ cego, segue a ordem dos sucessores. Neste caso estรก sempre a trocar de posiรงรฃo antes de aspirar. Notar que houve a primeira parte da soluรงรฃo que andou da esquerda para a direita, ficando igual ao estado inicial.
Apenas foi ver as alternativas quando teve de voltar para trรกs, devido ao limite de profundidade. Se tivรฉssemos escolhido uma profundidade menor, a soluรงรฃo obtida seria tambรฉm menor. Mas se a profundidade fosse menor que a soluรงรฃo mais curta, nรฃo iriamos obter nenhuma soluรงรฃo.
ร com base nesse dilema que surge a procura em profundidade iterativa, no caso deste cรณdigo รฉ executada com o limite=0.
Colocar a profundidade iterativa (limite a 0), e o nรญvel de debug a 2: 1; 2; 3; 7; 0; 2; 2; ENTER; 6.
Opรงรฃo: 6 โโคโ โบ Execuรงรฃo iniciada โโโ โโโโโโโโโโโโ ๐ณ ๐ช 1 โฑ โโโโโโโโโโโโ โโ โโคโ ๐ฐ g:0 โโโ โโโ ๐ ๐ช โโโโโโโโโโโโ ๐ณ ๐ช 2 โฑ โโโโโโโโโโโโ โโ โโคโ ๐ฐ g:0 โโโ โ โโ โโคโ ๐ 1 ๐ฐ g:1 โ 1|2 โโโ โก esq โโโ ๐ ๐ช โ โโ โโคโ ๐ 2 ๐ฐ g:1 โ 1|2 โโโ โก asp โโโ ๐ ๐ช โโโโโโโโโโโโ ๐ณ ๐ช 3 โฑ โโโโโโโโโโโโ โโ โโคโ ๐ฐ g:0 โ 1|2 โโโ โ โโ โโคโ ๐ 3 ๐ฐ g:1 โ 2|4 โโโ โก esq โ โ โโ โโคโ ๐ 5 ๐ฐ g:2 โ 3|6 โโโ โก dir โโโ ๐ ๐ช โ โ โโ โโคโ ๐ 6 ๐ฐ g:2 โ 3|6 โโโ โก asp โโโ ๐ ๐ช โ โโ โโคโ ๐ 4 ๐ฐ g:1 โ 3|6 โโโ โก asp โ โโ โโคโ ๐ 7 ๐ฐ g:2 โ 4|8 โโโ โก esq โโโ ๐ ๐ช โ โโ โโคโ ๐ 8 ๐ฐ g:2 โ 4|8 โโโ โก asp โโโ ๐ ๐ช โโโโโโโโโโโโ ๐ณ ๐ช 4 โฑ โโโโโโโโโโโโ โโ โโคโ ๐ฐ g:0 โ 4|8 โโโ โ โโ โโคโ ๐ 9 ๐ฐ g:1 โ 5|10 โโโ โก esq โ โ โโ โโคโ ๐ 11 ๐ฐ g:2 โ 6|12 โโโ โก dir โ โ โ โโ โโคโ ๐ 13 ๐ฐ g:3 โ 7|14 โโโ โก esq โโโ ๐ ๐ช โ โ โ โโ โโคโ ๐ 14 ๐ฐ g:3 โ 7|14 โโโ โก asp โโโ ๐ ๐ช โ โ โโ โโคโ ๐ 12 ๐ฐ g:2 โ 7|14 โโโ โก asp โ โ โโ โโคโ ๐ 15 ๐ฐ g:3 โ 8|16 โโโ โก dir โโโ ๐ ๐ช โ โ โโ โโคโ ๐ 16 ๐ฐ g:3 โ 8|16 โโโ โก asp โโโ ๐ ๐ช โ โโ โโคโ ๐ 10 ๐ฐ g:1 โ 8|16 โโโ โก asp โ โโ โโคโ ๐ 17 ๐ฐ g:2 โ 9|18 โโโ โก esq โ โ โโ โโคโ ๐ 19 ๐ฐ g:3 โ 10|20 โโโ โก dir โโโ ๐ ๐ช โ โ โโ โโคโ ๐ 20 ๐ฐ g:3 โ 10|20 โโโ โก asp โ โ ๐ฏ Soluรงรฃo encontrada! ๐ฐ g:3 โ โ โ [.] . โโโ ๐ฏ 3 โ ๐ โโโ { ๐ 18 } โโ Parรขmetros โ P1=3 P2=2 P3=1 P4=10 P5=0 P6=4 P7=0 P8=1 P11=0 โโงโ ๐ Execuรงรฃo terminada โฑ โโโ Aspirador โโ โ Parรขmetros โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ โ P1(ALGORITMO): Profundidade Primeiro | P2(NIVEL_DEBUG): PASSOS | P3(SEMENTE): 1 โ P4(LIMITE_TEMPO): 10 | P5(LIMITE_ITERACOES): 0 | P6(VER_ACOES): 4 | P7(LIMITE): 0 โ P8(ESTADOS_REPETIDOS): ignorar | P11(BARALHAR_SUCESSORES): 0 โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ [.] . โโ โ Indicadores โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ โ I1(IND_CUSTO): 3 | I2(Tempo(ms)): 0 | I3(Iteraรงรตes): 0 | I4(IND_EXPANSOES): 10 | โ I5(IND_GERACOES): 20 | I6(IND_LOWER_BOUND): 0 โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ ... Opรงรฃo:
Podemos observar que o algoritmo encontrou a soluรงรฃo de comprimento 3, a soluรงรฃo รณtima. Fez vรกrias iteraรงรตes que nรฃo serviram para nada, antes de executar na iteraรงรฃo 4 com limite a 4. Cada iteraรงรฃo fica marcada com a sinalรฉtica de รกrvore, e com a escada com o limite da รกrvore. Essas รกrvores de procura a mais, sรฃo muito mais pequenas que a รกrvore final, pelo que o peso de executar essas procuras extra nรฃo รฉ muito relevante.
As iteraรงรตes que nรฃo serviram para nada, รฉ na verdade uma afirmaรงรฃo pouco precisa. Serviram para saber que nรฃo hรก soluรงรฃo nesse nรญvel. Apenas assim รฉ que se pode concluir na iteraรงรฃo 4 que a soluรงรฃo รฉ รณptima. Executando a procura em profundidade com limite 4, obtรญnhamos a soluรงรฃo รณtima, mas sem saber que รฉ รณtima.
Podemos ver tambรฉm a versรฃo compactada da รกrvore de procura, contendo apenas informaรงรฃo do estado, tal como na procura em largura, mas desta vez com informaรงรฃo de onde o estado veio. Hรก uma sรณ linha por cada estado expandido. Os estados gerados nรฃo expandidos sรฃo em muito menor nรบmero, e estรฃo em ramos ainda nรฃo explorados, sendo indicados no final, tal como nos outros nรญveis de debug. Pela observaรงรฃo da รกrvore รฉ possรญvel verificar que a maior parte das ramificaรงรตes sรฃo de dois sucessores, o que รฉ natural dado que este problema tem apenas duas salas.
Vamos agora ver o que acontece se nรฃo limitarmos a procura em profundidade, colocando o limite=-1
Colocar a profundidade ilimitada (limite a -1), e o nรญvel de debug a 1: 1; 2; 3; 7; -1; 2; 1; ENTER; 6.
Opรงรฃo: 6
Segmentation fault (core dumped)
Temos um crash do programa, e bem cedo. Como a procura em profundidade estรก implementada de forma recursiva, houve um problema no stack. Se tivesse implementada com listas, terรญamos um problema de memรณria, como na procura em largura. Entrou-se num ramo infinito, mesmo neste pequeno problema, como aliรกs รฉ possรญvel imaginar apรณs conhecermos a soluรงรฃo da procura com nรญvel 10.
Lembra-se de algo dado na procura em largura, que impede ciclos infinitos e poderia permitir o uso da procura em profundidade ilimitada?
Sim, nรฃo ignorar os estados repetidos nรฃo servem apenas para reduzir a รกrvore de procura. Evitam tambรฉm ciclos infinitos. Com repetidos nos ascendentes ou gerados, consegue resolver com a procura em profundidade ilimitada, qualquer uma das 50 instรขncias.
Estรก terminado esta execuรงรฃo de exemplo. Este problema tem uma heurรญstica perfeita, pelo que, qualquer algoritmo informado encontra a soluรงรฃo รณtima sem nunca se enganar. Iremos em outros problemas testar os algoritmos informados.
O custo de cada aรงรฃo รฉ sempre unitรกrio, pelo que, o custo uniforme serรก mostrado num problema em que cada aรงรฃo possa ter custo variรกvel. As configuraรงรตes e os testes empรญricos, com as opรงรตes 7 e 8 do menu, sรฃo exemplificadas em outros problemas.