|
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 Puzzle 8. Pode acompanhar o teste executando as aΓ§Γ΅es localmente.
No Visual Studio, selecione o projeto TProcuraConstrutiva, e execute. No Linux na pasta .../TProcura/Construtiva/Teste$ execute make seguido de ./bin/Release/TProcuraConstrutiva
Nota: ao executar no terminal, os parΓ’metros, indicadores e outros elementos, aparecem com realce de cor para facilitar a leitura.
Neste problema foi implementada a heurΓstica com a distΓ’ncia na horizontal e vertical, de cada peΓ§a atΓ© Γ sua posiΓ§Γ£o final. Esta heurΓstica relaxa a situaΓ§Γ£o de apenas ser possΓvel mover para o local onde estΓ‘ o espaΓ§o, e retorna o valor que seria o correto caso cada peΓ§a pudesse mover-se por cima das outras. Γ implementada no problema ao redefinir CPuzzle8::Heuristica().
Vamos comeΓ§ar por ver (notar que P6(VER_ACOES): 1 e P3(SEMENTE): 2). Introduza: 1; 40; 2; dir baixo; ENTER.
OpΓ§Γ£o: 2 ββ€β π° g:0 π― h:12 β 1|4|5 βββ β 4 7 3 β 1 . 2 β 6 8 5 β ββ ββ€β π° g:1 π― h:11 β 1|4|5 βββ baixo β β 4 . 3 β β 1 7 2 β β 6 8 5 β ββ ββ€β π° g:1 π― h:13 β 1|4|5 βββ cima β β 4 7 3 β β 1 8 2 β β 6 . 5 β ββ ββ€β π° g:1 π― h:11 β 1|4|5 βββ dir β β 4 7 3 β β . 1 2 β β 6 8 5 β ββ ββ€β π° g:1 π― h:13 β 1|4|5 βββ esq β 4 7 3 β 1 2 . β 6 8 5 π Sucessor [1-4, aΓ§Γ£o(Γ΅es), exe]: dir baixo ββ β ββββββββββββββββ β Executadas 2 aΓ§Γ΅es. ββββββββββββββββββββββ ββ€β π° g:0 π― h:10 β 4|13|8 βββ β . 7 3 β 4 1 2 β 6 8 5 β ββ ββ€β π° g:1 π― h:11 β 4|13|8 βββ cima β β 4 7 3 β β . 1 2 β β 6 8 5 β ββ ββ€β π° g:1 π― h:11 β 4|13|8 βββ esq β 7 . 3 β 4 1 2 β 6 8 5 π Sucessor [1-2, aΓ§Γ£o(Γ΅es), exe]: β΅ Puzzle 8 ββ β ParΓ’metros ββββββββββββββββββββββββββββββββββββββββββββββββββββββ β P1(ALGORITMO): Largura Primeiro | P2(NIVEL_DEBUG): NADA | P3(SEMENTE): 2 β P4(LIMITE_TEMPO): 10 | P5(LIMITE_ITERACOES): 0 | P6(VER_ACOES): 1 | P7(LIMITE): 0 β P8(ESTADOS_REPETIDOS): ascendentes | P11(BARALHAR_SUCESSORES): 0 βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ β . 7 3 β 4 1 2 β 6 8 5 ... OpΓ§Γ£o:
Na informaΓ§Γ£o de um estado, vemos nΓ£o apenas o valor de g (o custo), mas tambΓ©m o valor de h. O valor de h Γ© a heuristica, que idealmente Γ© uma estimativa conservadora da distΓ’ncia atΓ© ao objetivo.
No estado inicial a heurΓstica Γ© 12, porque:
O total serΓ‘ 3 + 6 + 3 = 12.
Vamos ver como esta heurΓstica guia os diferentes algoritmos informados.
Vamos executar o primeiro algoritmo informado, o melhor primeiro, que segue sempre pelo ramo com menor heurΓstica, ou seja, mais perto do objetivo, daΓ o nome de melhor primeiro.
Este Γ© um algoritmo em profundidade pelo que vamos deixar a configuraΓ§Γ£o de remoΓ§Γ£o de estados repetidos gerados, de modo a observar o desempenho deste algoritmo nas melhores condiΓ§Γ΅es.
Neste e em outras execuΓ§Γ΅es das procuras informadas, vamos limitar o nΓΊmero de avaliaΓ§Γ΅es (iteraΓ§Γ΅es) a 1000000, de modo a ter um critΓ©rio de paragem independente do tempo.
Introduza: 1; 40; 3; 1; 4; 2; 3; 5; 1000000; 6; 4; 8; 3; ENTER; 6.
OpΓ§Γ£o: 6 ββ€β βΊ ExecuΓ§Γ£o iniciada βββ ββ ββ€β π° g:0 π― h:10 βββ β ββ ββ€β π 1 π° g:1 π― h:11 β 1|4|4 βββ β‘ baixo β β ββ ββ€β π 5 π° g:2 π― h:10 β 2|6|6 βββ β‘ dir β β β ββ ββ€β π 7 π° g:3 π― h:9 β 3|7|7 βββ β‘ cima β β β ββ ββ€β π 8 π° g:4 π― h:10 β 4|9|9 βββ β‘ cima β β β β ββ ββ€β π 10 π° g:5 π― h:11 β 5|10|10 βββ β‘ esq β β β β ββ ββ€β π 11 π° g:6 π― h:10 β 6|12|12 βββ β‘ baixo β β β β β ββ ββ€β π 13 π° g:7 π― h:9 β 7|15|15 βββ β‘ baixo β β β β β β ββ ββ€β π 16 π° g:8 π― h:8 β 8|17|17 βββ β‘ dir β β β β β β β ββ ββ€β π 18 π° g:9 π― h:9 β 9|18|18 βββ β‘ cima β β β β β β β ββ ββ€β π 19 π° g:10 π― h:10 β 10|20|20 βββ β‘ cima ... ...β β β β β β β π― SoluΓ§Γ£o encontrada! π° g:70 ... ββ ParΓ’metros β P1=4 P2=3 P3=2 P4=10 P5=1000000 P6=4 P7=0 P8=3 P11=0 ββ§β π ExecuΓ§Γ£o terminada β± 7ms βββ Puzzle 8 ββ β ParΓ’metros ββββββββββββββββββββββββββββββββββββββββββββββββββββββ β P1(ALGORITMO): Melhor Primeiro | P2(NIVEL_DEBUG): DETALHE | P3(SEMENTE): 2 β P4(LIMITE_TEMPO): 10 | P5(LIMITE_ITERACOES): 1000000 | P6(VER_ACOES): 4 β P7(LIMITE): 0 | P8(ESTADOS_REPETIDOS): gerados | P11(BARALHAR_SUCESSORES): 0 βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ . 1 2 3 4 5 6 7 8 ββ β Indicadores βββββββββββββββββββββββββββββββββββββββββββββββββββββ β I1(IND_CUSTO): 70 | I2(Tempo(ms)): 7 | I3(IteraΓ§Γ΅es): 128 | I4(IND_EXPANSOES): 70 | β I5(IND_GERACOES): 128 | I6(IND_LOWER_BOUND): 0 βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ ... OpΓ§Γ£o:
Conseguimos uma soluΓ§Γ£o de 70 aΓ§Γ΅es, utilizando 70 expansΓ΅es. O output teve de ser cortado nΓ£o pelo nΓΊmero de expansΓ΅es mas pela profundidade. O resultado em termos de esforΓ§o computacional Γ© muito reduzido, pelo que a informaΓ§Γ£o dada pela heurΓstica foi ΓΊtil. No entanto, a qualidade da soluΓ§Γ£o baixa, jΓ‘ que fica com 70 de custo, quando sabemos existir uma soluΓ§Γ£o de custo 12.
Vamos agora ver o comportamento do AStar, que garante a soluΓ§Γ£o Γ³tima.
Introduza: 1; 40; 3; 1; 5; 2; 4; ENTER; 6.
OpΓ§Γ£o: 6 ββ€β βΊ ExecuΓ§Γ£o iniciada βββ ββ ββ€β π° g:0 π― h:10 βββ { } β 4 7 3 β 1 . 2 β 6 8 5 β ββ β‘ ββββ baixo cima dir esq { π 1 π 2 π 3 π 4 } ββ ββ€β π 1 π° g:1 π― h:11 β 1|4|4 βββ { π 3 π 2 π 4 } β 4 . 3 β 1 7 2 β 6 8 5 β ββ β‘ ββββ dir esq { π 5 π 6 } ββ ββ€β π 6 π° g:2 π― h:10 β 2|6|6 βββ { π 5 π 3 π 2 π 4 } β 4 3 . β 1 7 2 β 6 8 5 β ββ β‘ ββββ cima { π 7 } ββ ββ€β π 7 π° g:3 π― h:9 β 3|7|7 βββ { π 5 π 3 π 2 π 4 } β 4 3 2 β 1 7 . β 6 8 5 β ββ β‘ ββββ cima dir { π 8 π 9 } ββ ββ€β π 8 π° g:4 π― h:8 β 4|9|9 βββ { π 5 π 3 π 2 π 9 π 4 } β 4 3 2 β 1 7 5 β 6 8 . β ββ β‘ ββββ dir { π 10 } ββ ββ€β π 10 π° g:5 π― h:7 β 5|10|10 βββ { π 5 π 3 π 2 π 9 π 4 } β 4 3 2 β 1 7 5 β 6 . 8 β ββ β‘ ββββ baixo dir { π 11 π 12 } ββ ββ€β π 11 π° g:6 π― h:6 β 6|12|12 βββ { π 5 π 3 π 2 π 12 π 9 π 4 } β 4 3 2 β 1 . 5 β 6 7 8 β ββ β‘ ββββ baixo dir esq { π 13 π 14 π 15 } ββ ββ€β π 14 π° g:7 π― h:5 β 7|15|15 βββ { π 13 π 5 π 3 π 2 π 15 π 12 π 9 π 4 } β 4 3 2 β . 1 5 β 6 7 8 β ββ β‘ ββββ baixo cima { π 16 π 17 } ββ ββ€β π 16 π° g:8 π― h:4 β 8|17|17 βββ { π 13 π 5 π 3 π 2 π 17 π 15 π 12 π 9 π 4 } β . 3 2 β 4 1 5 β 6 7 8 β ββ β‘ ββββ esq { π 18 } ββ ββ€β π 18 π° g:9 π― h:3 β 9|18|18 βββ { π 13 π 5 π 3 π 2 π 17 π 15 π 12 π 9 π 4 } β 3 . 2 β 4 1 5 β 6 7 8 β ββ β‘ ββββ cima esq { π 19 π 20 } ββ ββ€β π 19 π° g:10 π― h:2 β 10|20|20 βββ { π 13 π 5 π 3 π 2 π 20 π 17 π 15 π 12 π 9 π 4 } β 3 1 2 β 4 . 5 β 6 7 8 β ββ β‘ ββββ cima dir esq { π 21 π 22 π 23 } ββ ββ€β π 22 π° g:11 π― h:1 β 11|23|23 βββ { π 13 π 5 π 3 β¦ π 12 π 9 π 4 } #12 β 3 1 2 β . 4 5 β 6 7 8 β ββ β‘ ββββ baixo cima { π 24 π 25 } ββ ββ€β π 24 π° g:12 β 12|25|25 βββ { π 13 π 5 π 3 β¦ π 12 π 9 π 4 } #13 β . 1 2 β 3 4 5 β 6 7 8 β π― SoluΓ§Γ£o encontrada! π° g:12 β . 1 2 β 3 4 5 β 6 7 8 ββ ParΓ’metros β P1=5 P2=4 P3=2 P4=10 P5=1000000 P6=4 P7=0 P8=3 P9=100 P10=0 P11=0 ββ§β π ExecuΓ§Γ£o terminada β± 1ms βββ Puzzle 8 ββ β ParΓ’metros ββββββββββββββββββββββββββββββββββββββββββββββββββββββ β P1(ALGORITMO): A* | P2(NIVEL_DEBUG): COMPLETO | P3(SEMENTE): 2 | P4(LIMITE_TEMPO): 10 β P5(LIMITE_ITERACOES): 1000000 | P6(VER_ACOES): 4 | P7(LIMITE): 0 | P8(ESTADOS_REPETIDOS): gerados β P9(PESO_ASTAR): 100 | P10(RUIDO_HEURISTICA): 0 | P11(BARALHAR_SUCESSORES): 0 βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ . 1 2 3 4 5 6 7 8 ββ β Indicadores βββββββββββββββββββββββββββββββββββββββββββββββββββββ β I1(IND_CUSTO): 12 | I2(Tempo(ms)): 1 | I3(IteraΓ§Γ΅es): 25 | I4(IND_EXPANSOES): 12 | β I5(IND_GERACOES): 25 | I6(IND_LOWER_BOUND): 0 βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ ... OpΓ§Γ£o:
Foram utilizadas 12 expansΓ΅es para obter a soluΓ§Γ£o Γ³tima de 12 movimentos. Notar na lista ordenada, um dos piores estados Γ© o estado 4, gerado no inΓcio, mas nem por isso foi expandido, jΓ‘ que tinha um mau valor heurΓstico. Como colocamos P6(VER_ACOES): 4, nΓ£o vemos os estados gerados, colocando a 1 jΓ‘ poderiamos confirmar o motivo para que este estado permaneΓ§a no final da lista de estados gerados nΓ£o expandidos.
Esta Γ© uma instΓ’ncia simples para este algoritmo.
O AStar pode ter problemas de memΓ³ria em instΓ’ncias complexas, existindo o IDAStar que permite a mesma ordem de expansΓ£o, mas sem o problema de memΓ³ria, em troca de algum tempo de CPU extra, gasto ao expandir multiplas vezes os mesmos estados. Vamos ver como se comporta nesta instΓ’ncia.
Introduza: 1; 40; 3; 1; 6; ENTER; 6.
OpΓ§Γ£o: 6 ββ€β βΊ ExecuΓ§Γ£o iniciada βββ ββββββββββββ π³ π 12 β± 1ms ββββββββββββ ββ ββ€β π° g:0 π― h:10 β |1 βββ β 4 7 3 β 1 . 2 β 6 8 5 β ββ ββ€β π 1 π° g:1 π― h:11 β 1|4|5 βββ β‘ baixo β β 4 . 3 β β 1 7 2 β β 6 8 5 β β ββ ββ€β π 5 π° g:2 π― h:10 β 2|6|7 βββ β‘ dir β β β . 4 3 β β β 1 7 2 β β β 6 8 5 β β β ββ ββ€β π 7 π° g:3 π― h:9 β 3|7|8 βββ β‘ cima β β β 1 4 3 β β β . 7 2 β β β 6 8 5 β β β ββπ 14 β π { π 8 } β β β ββπ { π 9 } β β ββ ββ€β π 6 π° g:2 π― h:10 β 4|9|10 βββ β‘ esq β β 4 3 . β β 1 7 2 β β 6 8 5 β β ββ ββ€β π 10 π° g:3 π― h:9 β 5|10|11 βββ β‘ cima β β 4 3 2 β β 1 7 . β β 6 8 5 β β ββ ββ€β π 11 π° g:4 π― h:8 β 6|12|13 βββ β‘ cima β β β 4 3 2 β β β 1 7 5 β β β 6 8 . β β β ββ ββ€β π 13 π° g:5 π― h:7 β 7|13|14 βββ β‘ dir β β β 4 3 2 β β β 1 7 5 β β β 6 . 8 β β β ββ ββ€β π 14 π° g:6 π― h:6 β 8|15|16 βββ β‘ baixo β β β β 4 3 2 β β β β 1 . 5 β β β β 6 7 8 β β β β ββ ββ€β π 16 π° g:7 π― h:5 β 9|18|19 βββ β‘ baixo β β β β β 4 . 2 β β β β β 1 3 5 β β β β β 6 7 8 β β β β β ββ ββ€β π 19 π° g:8 π― h:4 β 10|20|21 βββ β‘ dir β β β β β β . 4 2 β β β β β β 1 3 5 β β β β β β 6 7 8 β β β β β β ββ ββ€β π 21 π° g:9 π― h:3 β 11|21|22 βββ β‘ cima β β β β β β 1 4 2 β β β β β β . 3 5 β β β β β β 6 7 8 β β β β β β ββ ββ€β π 23 π° g:10 π― h:2 β 12|23|24 βββ β‘ esq β β β β β β β 1 4 2 β β β β β β β 3 . 5 β β β β β β β 6 7 8 β β β β β β β ββ ββ€β π 24 π° g:11 π― h:1 β 13|26|27 βββ β‘ baixo β β β β β β β β 1 . 2 β β β β β β β β 3 4 5 β β β β β β β β 6 7 8 β β β β β β β β ββ ββ€β π 27 π° g:12 β 14|28|29 βββ β‘ dir β β β β β β β β β . 1 2 β β β β β β β β β 3 4 5 β β β β β β β β β 6 7 8 β β β β β β β β β π― SoluΓ§Γ£o encontrada! π° g:12 β β β β β β β β β . 1 2 β β β β β β β β β 3 4 5 β β β β β β β β β 6 7 8 β β β β β β β β β π― 12 β π β β β β β β β β ββ { π 28 } β β β β β β β ββ { π 25 π 26 } β β β β β β ββ { π 22 } β β β β β ββ { π 20 } β β β β ββ { π 17 π 18 } β β β ββ { π 15 } β β ββ { π 12 } β ββ { π 3 π 2 π 4 } ββ ParΓ’metros β P1=6 P2=4 P3=2 P4=10 P5=1000000 P6=4 P7=0 P8=3 P9=100 P10=0 P11=0 ββ§β π ExecuΓ§Γ£o terminada β± 2ms βββ Puzzle 8 ββ β ParΓ’metros ββββββββββββββββββββββββββββββββββββββββββββββββββββββ β P1(ALGORITMO): IDA* | P2(NIVEL_DEBUG): COMPLETO | P3(SEMENTE): 2 | P4(LIMITE_TEMPO): 10 β P5(LIMITE_ITERACOES): 1000000 | P6(VER_ACOES): 4 | P7(LIMITE): 0 | P8(ESTADOS_REPETIDOS): gerados β P9(PESO_ASTAR): 100 | P10(RUIDO_HEURISTICA): 0 | P11(BARALHAR_SUCESSORES): 0 βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ . 1 2 3 4 5 6 7 8 ββ β Indicadores βββββββββββββββββββββββββββββββββββββββββββββββββββββ β I1(IND_CUSTO): 12 | I2(Tempo(ms)): 2 | I3(IteraΓ§Γ΅es): 29 | I4(IND_EXPANSOES): 14 | β I5(IND_GERACOES): 28 | I6(IND_LOWER_BOUND): 14 βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ ... OpΓ§Γ£o:
Podemos ver que em termos de iteraΓ§Γ΅es, ao contrΓ‘rio da procura em profundidade iterativa, tem menos iteraΓ§Γ΅es.
O limite da iteraΓ§Γ£o seguinte Γ© determinado pelo menor valor dos estados cortados, avanΓ§ando mais que uma unidade de cada vez. O primeiro limite Γ© determinado pelo valor da heurΓstica do estado inicial, que neste caso tinha o valor perfeito.
Acabou por ter apenas 14 expansΓ΅es, enquanto que o AStar utilizou 12 expansΓ΅es.
Neste caso como houve uma sΓ³ iteraΓ§Γ£o, correu bastante bem. Mas mesmo que fosse o dobro das expansΓ΅es, Γ© um pequeno preΓ§o a pagar por nΓ£o ter problemas de memΓ³ria.
Vamos agora ver como se comporta o Branch-and-Bound, o ΓΊltimo algoritmo informado. Este algoritmo pode ser visto como o Melhor Primeiro que continua a procura apΓ³s a primeira soluΓ§Γ£o. No entanto restringe o espaΓ§o de procura apenas aos estados que melhoram a soluΓ§Γ£o atual.
Γ um algoritmo em profundidade, pelo que nΓ£o tem problemas de memΓ³ria originados na procura em largura. Vamos baixar o nΓvel de debug para 1.
Introduza: 1; 40; 3; 1; 7; 2; 1; ENTER; 6.
OpΓ§Γ£o: 6 ββ€β βΊ ExecuΓ§Γ£o iniciada βββ# ββ π― SoluΓ§Γ£o encontrada! π° g:70 β . 1 2 β 3 4 5 β 6 7 8 ββ π― SoluΓ§Γ£o encontrada! π° g:68 β . 1 2 β 3 4 5 β 6 7 8 ββ π― SoluΓ§Γ£o encontrada! π° g:64 β . 1 2 β 3 4 5 β 6 7 8 ββ π― SoluΓ§Γ£o encontrada! π° g:60 β . 1 2 β 3 4 5 β 6 7 8 ββ π― SoluΓ§Γ£o encontrada! π° g:52 β . 1 2 β 3 4 5 β 6 7 8 ββ π― SoluΓ§Γ£o encontrada! π° g:50 β . 1 2 β 3 4 5 β 6 7 8 # ββ π― SoluΓ§Γ£o encontrada! π° g:48 β . 1 2 β 3 4 5 β 6 7 8 ββ π― SoluΓ§Γ£o encontrada! π° g:46 β . 1 2 β 3 4 5 β 6 7 8 # ββ π― SoluΓ§Γ£o encontrada! π° g:42 β . 1 2 β 3 4 5 β 6 7 8 ββ π― SoluΓ§Γ£o encontrada! π° g:32 β . 1 2 β 3 4 5 β 6 7 8 ββ π― SoluΓ§Γ£o encontrada! π° g:30 β . 1 2 β 3 4 5 β 6 7 8 ββ π― SoluΓ§Γ£o encontrada! π° g:28 β . 1 2 β 3 4 5 β 6 7 8 # ββ π― SoluΓ§Γ£o encontrada! π° g:24 β . 1 2 β 3 4 5 β 6 7 8 # ββ π― SoluΓ§Γ£o encontrada! π° g:12 β . 1 2 β 3 4 5 β 6 7 8 ββ ParΓ’metros β P1=7 P2=1 P3=2 P4=10 P5=1000000 P6=4 P7=0 P8=3 P9=100 P10=0 P11=0 ββ§β π ExecuΓ§Γ£o terminada β± 17ms βββ Puzzle 8 ββ β ParΓ’metros ββββββββββββββββββββββββββββββββββββββββββββββββββββββ β P1(ALGORITMO): Branch and Bound | P2(NIVEL_DEBUG): ATIVIDADE | P3(SEMENTE): 2 β P4(LIMITE_TEMPO): 10 | P5(LIMITE_ITERACOES): 1000000 | P6(VER_ACOES): 4 β P7(LIMITE): 0 | P8(ESTADOS_REPETIDOS): gerados | P9(PESO_ASTAR): 100 β P10(RUIDO_HEURISTICA): 0 | P11(BARALHAR_SUCESSORES): 0 βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ . 1 2 3 4 5 6 7 8 ββ β Indicadores βββββββββββββββββββββββββββββββββββββββββββββββββββββ β I1(IND_CUSTO): 12 | I2(Tempo(ms)): 17 | I3(IteraΓ§Γ΅es): 6666 | I4(IND_EXPANSOES): 4110 | β I5(IND_GERACOES): 6666 | I6(IND_LOWER_BOUND): 14 βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ ... OpΓ§Γ£o:
Vemos que primeiramente encontra a soluΓ§Γ£o de 70 movimentos, e depois vai encontrando sucessivamente soluΓ§Γ΅es melhores atΓ© que termina com a soluΓ§Γ£o de 12. Gasta nesta instΓ’ncia um nΓΊmero consideravelmente superior de expansΓ΅es e geraΓ§Γ΅es, quando comparado com o AStar.
Podemos agora ver outras instΓ’ncias, e executar cada um dos algoritmos para ver qual Γ© o melhor. No entanto seria um trabalho fastidioso.
NΓ£o o fazer, ficariamos com a informaΓ§Γ£o da performance dos algoritmos numa sΓ³ instΓ’ncia, nΓ£o necessariamente representativa de todas as instΓ’ncias.
Γ para melhor medir o desempenho de algoritmos e configuraΓ§Γ΅es, que existem os testes empΓricos, permitindo assim comparar algoritmos e/ou configuraΓ§Γ΅es num leque alargado de instΓ’ncias.
Vamos agora fazer testes empΓricos, para comparar os algoritmos informados. As configuraΓ§Γ΅es e testes no modo interativo, foram exemplificados no exemplo de teste do TVector.
Executamos o programa em linha de comando, pelo que vamos ver primeiramente todos os argumentos, com a opΓ§Γ£o "-h".
/TProcura/Construtiva/Teste$ ./bin/Release/TProcuraConstrutiva -h ββ Teste TProcuraConstrutiva βββ β 1 - Aspirador β β 2 - Puzzle 8 β β 3 - 8 Damas β β 4 - PartiΓ§Γ£o β β 5 - Artificial β ββββββββββββββββββββββββββββββββ OpΓ§Γ£o: 2 Uso: ./bin/Release/TProcuraConstrutiva[opΓ§Γ΅es] Conjunto de IDs: A | A,B,C | A:B[:C] OpΓ§Γ΅es: -R Nome do CSV de resultados (omissΓ£o: resultados.csv) -F Prefixo dos ficheiros de instΓ’ncia (omissΓ£o: instancia_) -M Modo MPI: 0 = divisΓ£o estΓ‘tica, 1 = gestor-trabalhador -I Lista de indicadores (e.g. 2,1,3) -h Esta ajuda -P ParΓ’metros (e.g. P1=1:3 x P2=0:2) - ΓΊltimo campo Exemplo: ./bin/Release/TProcuraConstrutiva 1:5 -R out -F fich_ -I 3,1,4,2 -P P1=1:5 x P6=1,2 Executar sem argumentos entra em modo interativo, para explorar todos os parΓ’metros e indicadores ββ β ParΓ’metros ββββββββββββββββββββββββββββββββββββββββββββββββββββββ β P1(ALGORITMO): Largura Primeiro (1 a 7) β P2(NIVEL_DEBUG): NADA (0 a 4) β P3(SEMENTE): 1 (1 a 1000000) β P4(LIMITE_TEMPO): 10 (1 a 3600) β P5(LIMITE_ITERACOES): 0 (0 a 1000000000) β P6(VER_ACOES): 4 (1 a 100) β P7(LIMITE): 0 (-1 a 1000000) β P8(ESTADOS_REPETIDOS): ascendentes (1 a 3) β P11(BARALHAR_SUCESSORES): 0 (0 a 1) βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ ββ β Indicadores βββββββββββββββββββββββββββββββββββββββββββββββββββββ β I1(IND_CUSTO): β 1ΒΊ lugar β o resultado Γ© o custo da soluΓ§Γ£o atual β I2(Tempo(ms)): β 2ΒΊ lugar β Tempo em milissegundos da execuΓ§Γ£o (medida de esforΓ§o computacional). β I3(IteraΓ§Γ΅es): β 3ΒΊ lugar β IteraΓ§Γ΅es do algoritmo, interpretadas conforme o algoritmo (medida de esforΓ§o independente do hardware). β I4(IND_EXPANSOES): β 4ΒΊ lugar β nΓΊmero de expansΓ΅es efetuadas β I5(IND_GERACOES): β 5ΒΊ lugar β nΓΊmero de estados gerados β I6(IND_LOWER_BOUND): β 6ΒΊ lugar β valor mΓnimo para a melhor soluΓ§Γ£o, se igual ao custo da soluΓ§Γ£o obtida, entΓ£o esta Γ© Γ³tima βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
A forma como temos o programa, requer interaΓ§Γ£o do utilizador, pelo que tivemos que escolher a opΓ§Γ£o 2 para o Puzzle 8.
Pretendemos comparar os algoritmos construtivos para este problema, P1=1,3:7. Retiramos o custo uniforme atendendo a que Γ© igual Γ procura em largura se as aΓ§Γ΅es tiverem todas custo 1, e utilizamos o valor por omissΓ£o da procura em profundidade, P7=0, para obter a profundidade iterativa.
Precisamos de selecionar instΓ’ncias, de simples a complexas. Como tempos bastantes instΓ’ncias, vamos fixar a semente com 4 valores, e alteramos o esforΓ§o do teste com o nΓΊmero de instΓ’ncias.
Assim, podemos executar o programa com a seguinte linha de comando:
/TProcura/Construtiva/Teste$ ./bin/Release/TProcuraConstrutiva 1:1000:100 -R Resultados/puzzle8_1 -P P2=3 P1=1,3:7 x P3=1:4
ββ Teste TProcuraConstrutiva βββ
β 1 - Aspirador β
β 2 - Puzzle 8 β
β 3 - 8 Damas β
β 4 - PartiΓ§Γ£o β
ββββββββββββββββββββββββββββββββ
OpΓ§Γ£o: 2
ββ€β InstΓ’ncias βββ { π 1 π 101 π 201 π 301 π 401 π 501 π 601 π 701 π 801 π 901 }
ββ π οΈ β P2=3 P4=10 P5=0 P6=4 P7=0 P8=2 P11=0 (parΓ’metros comuns)
ββͺβ ConfiguraΓ§Γ΅es βββ
ββ β [1] β P1=1 P3=1
ββ β [2] β P1=3 P3=1
ββ β [3] β P1=4 P3=1
β ...
ββ β [22] β P1=5 P3=4
ββ β [23] β P1=6 P3=4
ββ β [24] β P1=7 P3=4
ββ§βββββββββββββββββββ
ββ€β π§ͺ InΓcio do Teste (π₯οΈ 0) βββ
ββ π Tarefas:240 π InstΓ’ncias: 10 π οΈ ConfiguraΓ§Γ΅es: 24 π₯οΈ Processos: 1.
ββ β± 12" 825ms π 64 π 301 π οΈ 7 π₯οΈ 1
ββ β± 23" 208ms π 74 π 301 π οΈ 8 π₯οΈ 1
ββ β± 40" 580ms π 130 π 901 π οΈ 13 π₯οΈ 1
ββ β± 59" 226ms π 140 π 901 π οΈ 14 π₯οΈ 1
ββ β± 1' 9" 343ms π 236 π 501 π οΈ 24 π₯οΈ 1
ββ π Ficheiro Resultados/puzzle8_1.csv gravado.
β β± Tempo real: 1' 9" 758ms
β β± CPU total: 1' 9" 758ms
β π UtilizaΓ§Γ£o: 100.0%
ββ§β π Fim do Teste (π₯οΈ 0 β± 1' 9" 758ms ) βββ
O ficheiro de resultados foi gravado, toda a execuΓ§Γ£o decorreu em 1 minuto e 10 segundos, pelo que o nΓvel 3 de debug fez 4 relatΓ³rio a cada 10 segundos. O nΓvel 4 o relatΓ³rio Γ© em cada resultado, o que neste caso seria demasiado jΓ‘ que hΓ‘ 240 tarefas. O nΓvel 2 dΓ‘ um report a cada minuto.
Vamos ver os resultados em bruto, para saber toais de P1 face a diversos indicadores:
Adicionamos uma coluna para somar as instΓ’ncias resolvidas, as que tΓͺm custo igual ou superior a 0. O cΓ³digo -2 significa que a instΓ’ncia nΓ£o foi resolvida, e -1 significa instΓ’ncia impossΓvel. Estas instΓ’ncias sΓ£o todas possΓveis devido Γ forma como foram geradas, atravΓ©s de movimentos aleatΓ³rios desde a posiΓ§Γ£o objetivo.
Obtemos a seguinte tabela:
| Valores | 1:Largura Primeiro | 3:Profundidade Primeiro | 4:Melhor Primeiro | 5:A* | 6:IDA* | 7:Branch and Bound |
|---|---|---|---|---|---|---|
| Soma de I1(IND_CUSTO) | 730 | 699 | 8054 | 730 | 730 | 730 |
| Soma de I2(Tempo(ms)) | 26210 | 38293 | 18 | 31 | 47 | 4431 |
| Soma de I4(IND_EXPANSOES) | 29787206 | 59662841 | 8107 | 37266 | 61187 | 1734526 |
| MΓ‘ximo de I1(IND_CUSTO)2 | 29 | 27 | 815 | 29 | 29 | 29 |
| Soma de Resolvido | 40 | 39 | 40 | 40 | 40 | 40 |
A versΓ£o da procura em profundidade, Γ© a versΓ£o iterativa, com o parΓ’metro P7=0, sendo esse o valor por omissΓ£o.
Podemos agora confirmar que:
Podemos fazer a versΓ£o de maior esforΓ§o, mas com um teste de 1 minuto, jΓ‘ sabemos que dificilmente o Astar nΓ£o serΓ‘ o melhor neste problema, atendendo a que tem um valor claramente inferior em termos de expansΓ΅es, embora o tempo seja similar ao IDAstar.
Maior esforΓ§o e intervalos de confianΓ§a sΓ£o ΓΊteis apenas se pretendermos comprovar estatisticamente que o Melhor Primeiro Γ© o mais rΓ‘pido (sem retornar o Γ³ptimo), seguido do Astar e depois do IDAstar.
Interessante tambΓ©m o valor do maior custo, ou seja, da instΓ’ncia mais complexa encontrada, corresponde a 29 movimentos. O Melhor Primeiro chegou a dar soluΓ§Γ΅es de 815 movimentos, o que em termos de qualidade da soluΓ§Γ£o serΓ‘ certamente baixo, atendendo a que a instΓ’ncia mais complexa tem apenas 29 movimentos.
Ficamos com a comparaΓ§Γ£o dos algoritmos, e com a performance global. NΓ£o temos um teste de performance, em que se cruza o tempo com a dificuldade da instΓ’ncia. Neste caso o tamanho da instΓ’ncia Γ© sempre o mesmo, mas as instΓ’ncias nΓ£o sΓ£o todas da mesma complexidade. As que tΓͺm a soluΓ§Γ£o Γ³tima mais longa, podem ser consideradas mais complexas.
Como temos as soluΓ§Γ΅es Γ³ptimas utilizando por exemplo o Astar, podemos extrair o I1 Γ³timo e fazer os grΓ‘ficos com os resultados do teste puzzle8_1.
| RΓ³tulos de Linha | 1:Largura Primeiro | 3:Profundidade Primeiro | 4:Melhor Primeiro | 5:A* | 6:IDA* | 7:Branch and Bound |
|---|---|---|---|---|---|---|
| 1 | 0 | 0 | 0 | 0 | 0 | 0 |
| 13 | 2 | 6 | 0 | 0 | 0 | 21 |
| 15 | 8 | 12 | 0 | 0 | 0 | 35 |
| 17 | 34 | 31 | 1 | 0 | 0 | 118 |
| 19 | 42 | 77 | 0 | 0 | 0 | 28 |
| 21 | 139 | 252 | 1 | 1 | 1 | 242 |
| 23 | 429 | 763 | 1 | 1 | 1 | 289 |
| 25 | 1430 | 2242 | 0 | 1 | 2 | 97 |
| 27 | 4659 | 8014 | 0 | 5 | 11 | 63 |
| 29 | 9389 | 10000 | 1 | 9 | 8 | 119 |
Com o esforΓ§o atual, existem apenas 40 instΓ’ncias. NΓ£o temos assim uma amostra de instΓ’ncias linear na dificuldade. Para melhorar estes resultados Γ© preciso mais instΓ’ncias, utilizando este mesmo teste mas com maior esforΓ§o.
Podemos no entanto observar o auemnto gradual do tempo nos algoritmos cegos. Pelo contrΓ‘rio, os algoritmos informados tΓͺm um tempo muito reduzido, na ordem dos milissegundos. Apenas o BnB tem algum tempo superior, mas que aparenta nΓ£o ser dependnete da dificuldade da instΓ’ncia, serΓ‘ mais relacionado com a sorte ou azar da primeira soluΓ§Γ£o encontrada estar perto ou longe do Γ³timo.
Um maior volume de testes permitirΓ‘ aferir que provavelmente o Melhor Primeiro Γ© mais rΓ‘pido principalmente em instΓ’ncias complicadas.
Como o Melhor Primeiro nΓ£o obtΓ©m todas as soluΓ§Γ΅es Γ³ptimas, poderiamos calcular a percentagem de desvio da qualidade da soluΓ§Γ£o atΓ© ao valor Γ³ptimo: desvio = (ValorObtido - Γ³ptimo)/Γ³ptimo. Este indicador seria ΓΊtil para comparar dos algoritmos nΓ£o exatos, de modo a aferir a qualidade das suas soluΓ§Γ΅es. Temos neste caso um sΓ³ algoritmo, com soluΓ§Γ΅es de muito mΓ‘ qualidade, pelo que nΓ£o utilizaremos para jΓ‘ este indicador.