|
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 das 8 Damas. 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.
ββ Teste TProcuraConstrutiva βββ
β 1 - Aspirador β
β 2 - Puzzle 8 β
β 3 - 8 Damas β
β 4 - PartiΓ§Γ£o β
ββββββββββββββββββββββββββββββββ
OpΓ§Γ£o: 3
Vamos entrar no problema das 8 damas. Introduza: 3.
8 Damas ββ β ParΓ’metros ββββββββββββββββββββββββββββββββββββββββββββββββββββββ β P1(ALGORITMO): Largura Primeiro | P2(NIVEL_DEBUG): NADA | 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 βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ β :: :: :: :: β :: :: :: :: β :: :: :: :: β :: :: :: :: β :: :: :: :: β :: :: :: :: β :: :: :: :: β :: :: :: :: ββ β° Menu ββββββββββ¬βββββββββββββββββ¬ββββββββββββββββββββββ¬βββββββββββββββ β 1 π InstΓ’ncia β 2 π Explorar β 3 β ParΓ’metros β 4 β SoluΓ§Γ£o β β 5 β Indicadores β 6 βΊ Executar β 7 π οΈ ConfiguraΓ§Γ΅es β 8 π§ͺ Teste β βββββββββββββββββββββ΄βββββββββββββββββ΄ββββββββββββββββββββββ΄βββββββββββββββ OpΓ§Γ£o:
Este estado vazio Γ© um tabuleiro de 8x8. O objetivo Γ© colocar damas no tabuleiro de xadrez, sem que as damas se ataquem mutuamente.
Vamos ver que instΓ’ncias temos. Introduza: 1; 4.
OpΓ§Γ£o: 1 ββ π InstΓ’ncia βββββββββββββββββββββββββββββββββββββββββββββββββββββββ β ID atual: 8 Intervalo: [4β40] β Prefixo atual: 'instancia_' βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ Novo ID (ENTER mantΓ©m) ou novo prefixo (texto): 4 8 Damas ... :: :: :: :: :: :: :: :: ... OpΓ§Γ£o:
O tabuleiro foi generalizado a largura N. Podemos escolher entre 4 e 40 colunas.
HΓ‘ vΓ‘rias formas de se colocar damas no tabuleiro. EstΓ‘ implementada a colocaΓ§Γ£o de uma dama, na linha superior que nΓ£o esteja atacada.
Poder-se-ia permitir a colocaΓ§Γ£o de uma dama em qualquer posiΓ§Γ£o. No entanto, como em cada linha tem de estar uma dama, optamos por colocar sempre na primeira linha vazia. Caso se tivessem implementado diferentes opΓ§Γ΅es, seria adicionado um parΓ’metro, e os sucessores seria distinto conforme o valor desse parΓ’metro.
Vamos resolver esta instΓ’ncia manualmente, para explorar o espaΓ§o de estados. Introduza: 2; d1; d4; d2.
OpΓ§Γ£o: 2 ββ€β π° g:0 β 1|4|5 βββ β :: :: β :: :: β :: :: β :: :: β ββ β‘ ββββ d1 d2 d3 d4 π Sucessor [1-4, aΓ§Γ£o(Γ΅es), exe]: d1 ββ β ββββββββββββββββ β Executadas 1 aΓ§Γ΅es. ββββββββββββββββββββββ ββ€β π° g:0 β 3|10|8 βββ β β :: β :: :: β :: :: β :: :: β ββ β‘ ββββ d3 d4 π Sucessor [1-2, aΓ§Γ£o(Γ΅es), exe]: d4 ββ β ββββββββββββββββ β Executadas 1 aΓ§Γ΅es. ββββββββββββββββββββββ ββ€β π° g:0 β 5|13|10 βββ β β :: β :: β β :: :: β :: :: β ββ β‘ ββββ d2 π Sucessor [1-1, aΓ§Γ£o(Γ΅es), exe]: d2 ββ β ββββββββββββββββ β Executadas 1 aΓ§Γ΅es. ββββββββββββββββββββββ ββ€β π° g:0 β 7|14|11 βββ β β :: β :: β β ::β :: β :: :: β ββ β‘ ββββ ββ β βββββββββββββββ β Sem sucessores. βββββββββββββββββββββ 8 Damas ... β β :: β :: β β ::β :: β :: :: ... OpΓ§Γ£o:
Esta resoluΓ§Γ£o correu mal e chegamos a um beco sem saida. NΓ£o hΓ‘ nenhuma coluna onde possa ser colocada a quarta dama sem que esteja atacada.
A escolha na primeira aΓ§Γ£o por d2 (ou d3), Γ© crΓtica para obter a soluΓ§Γ£o.
Neste problema a soluΓ§Γ£o tem sempre o mesmo nΓΊmero de aΓ§Γ΅es, igual a N.
Vamos fazer uma procura em largura, no tabuleiro de 4x4, debug completo. Vamos deixar desde jΓ‘ fixado o limite no nΓΊmero de iteraΓ§Γ΅es a 1000000. Introduza: 1; 4; 3; 2; 4; 5; 1000000; ENTER; 6.
OpΓ§Γ£o: 6 ββ€β βΊ ExecuΓ§Γ£o iniciada βββ ββ ββ€β π° g:0 βββ { } β :: :: β :: :: β :: :: β :: :: β ββ β‘ ββββ d1 d2 d3 d4 { π 1 π 2 π 3 π 4 } ββ ββ€β π 1 π° g:1 β 1|4 βββ { π 2 π 3 π 4 } β β :: β :: :: β :: :: β :: :: β ββ β‘ ββββ d3 d4 { π 5 π 6 } ββ ββ€β π 2 π° g:1 β 2|6 βββ { π 3 π 4 π 5 π 6 } β ::β :: β :: :: β :: :: β :: :: β ββ β‘ ββββ d4 { π 7 } ββ ββ€β π 3 π° g:1 β 3|7 βββ { π 4 π 5 π 6 π 7 } β :: β β :: :: β :: :: β :: :: β ββ β‘ ββββ d1 { π 8 } ββ ββ€β π 4 π° g:1 β 4|8 βββ { π 5 π 6 π 7 π 8 } β :: ::β β :: :: β :: :: β :: :: β ββ β‘ ββββ d1 d2 { π 9 π 10 } ββ ββ€β π 5 π° g:2 β 5|10 βββ { π 6 π 7 π 8 π 9 π 10 } β β :: β ::β :: β :: :: β :: :: β ββ β‘ ββββ ββ ββ€β π 6 π° g:2 β 6|10 βββ { π 7 π 8 π 9 π 10 } β β :: β :: β β :: :: β :: :: β ββ β‘ ββββ d2 { π 11 } ββ ββ€β π 7 π° g:2 β 7|11 βββ { π 8 π 9 π 10 π 11 } β ::β :: β :: β β :: :: β :: :: β ββ β‘ ββββ d1 { π 12 } ββ ββ€β π 8 π° g:2 β 8|12 βββ { π 9 π 10 π 11 π 12 } β :: β β β :: :: β :: :: β :: :: β ββ β‘ ββββ d4 { π 13 } ββ ββ€β π 9 π° g:2 β 9|13 βββ { π 10 π 11 π 12 π 13 } β :: ::β β β :: :: β :: :: β :: :: β ββ β‘ ββββ d3 { π 14 } ββ ββ€β π 10 π° g:2 β 10|14 βββ { π 11 π 12 π 13 π 14 } β :: ::β β β :: β :: :: β :: :: β ββ β‘ ββββ ββ ββ€β π 11 π° g:3 β 11|14 βββ { π 12 π 13 π 14 } β β :: β :: β β ::β :: β :: :: β ββ β‘ ββββ ββ ββ€β π 12 π° g:3 β 12|14 βββ { π 13 π 14 } β ::β :: β :: β β β :: β :: :: β ββ β‘ ββββ d3 { π 15 } β π― SoluΓ§Γ£o encontrada! π° g:4 β ::β :: β :: β β β :: β ::β :: ββ ParΓ’metros β P1=1 P2=4 P3=1 P4=10 P5=1000000 P6=4 P7=0 P8=1 P11=0 ββ§β π ExecuΓ§Γ£o terminada β± βββ 8 Damas ββ β ParΓ’metros ββββββββββββββββββββββββββββββββββββββββββββββββββββββ β P1(ALGORITMO): Largura Primeiro | P2(NIVEL_DEBUG): COMPLETO | P3(SEMENTE): 1 β P4(LIMITE_TEMPO): 10 | P5(LIMITE_ITERACOES): 1000000 | P6(VER_ACOES): 4 β P7(LIMITE): 0 | P8(ESTADOS_REPETIDOS): ignorar | P11(BARALHAR_SUCESSORES): 0 βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ ::β :: :: β β :: ::β :: ββ β Indicadores βββββββββββββββββββββββββββββββββββββββββββββββββββββ β I1(IND_CUSTO): 4 | I2(Tempo(ms)): 0 | I3(IteraΓ§Γ΅es): 0 | I4(IND_EXPANSOES): 13 | β I5(IND_GERACOES): 15 | I6(IND_LOWER_BOUND): 0 βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ ... OpΓ§Γ£o:
A soluΓ§Γ£o foi encontrada. No entanto, o algoritmo explora todos os estados do nΓvel 3 antes de ver o primeiro do nΓvel 4. Neste problema, como a soluΓ§Γ£o estΓ‘ no nΓvel 4, acaba por nΓ£o ser muito interessante esta procura. Qualquer estado no nΓvel 4 seria uma soluΓ§Γ£o, e foram expandidos todos os estados do nΓvel 3. NΓ£o podia ser pior.
NΓ£o sΓ³ este algoritmo gasta muito tempo nos nΓveis inferiores, a explorar completamente, como a procura em profundidade ilimitada nΓ£o tem problema, jΓ‘ que nΓ£o existem ciclos infinitos.
Vamos executar a mesma instΓ’ncia com a procura em profundidade ilimitada. Introduza: 1; 4; 3; 1; 3; 7; -1; ENTER; 6.
OpΓ§Γ£o: 6 ββ€β βΊ ExecuΓ§Γ£o iniciada βββ ββ ββ€β π° g:0 βββ β :: :: β :: :: β :: :: β :: :: β ββ ββ€β π 1 π° g:1 β 1|4 βββ β‘ d1 β β β :: β β :: :: β β :: :: β β :: :: β β ββ ββ€β π 5 π° g:2 β 2|6 βββ β‘ d3 β β β β :: β β β ::β :: β β β :: :: β β β :: :: β β β π β β ββ ββ€β π 6 π° g:2 β 3|6 βββ β‘ d4 β β β :: β β :: β β β :: :: β β :: :: β β ββ ββ€β π 7 π° g:3 β 4|7 βββ β‘ d2 β β β :: β β :: β β β ::β :: β β :: :: β β π β ββ ββ€β π 2 π° g:1 β 5|7 βββ β‘ d2 β β ::β :: β β :: :: β β :: :: β β :: :: β β ββ ββ€β π 8 π° g:2 β 6|8 βββ β‘ d4 β β ::β :: β β :: β β β :: :: β β :: :: β β ββ ββ€β π 9 π° g:3 β 7|9 βββ β‘ d1 β β ::β :: β β :: β β β β :: β β :: :: β β ββ ββ€β π 10 π° g:4 β 8|10 βββ β‘ d3 β β ::β :: β β :: β β β β :: β β ::β :: β β π― SoluΓ§Γ£o encontrada! π° g:4 β β β ::β :: β β β :: β β β β β :: β β β ::β :: β β β π― 4 β π β ββ { π 3 π 4 } ββ ParΓ’metros β P1=3 P2=4 P3=1 P4=10 P5=1000000 P6=4 P7=-1 P8=1 P11=0 ββ§β π ExecuΓ§Γ£o terminada β± βββ 8 Damas ββ β ParΓ’metros ββββββββββββββββββββββββββββββββββββββββββββββββββββββ β P1(ALGORITMO): Profundidade Primeiro | P2(NIVEL_DEBUG): COMPLETO | P3(SEMENTE): 1 β P4(LIMITE_TEMPO): 10 | P5(LIMITE_ITERACOES): 1000000 | P6(VER_ACOES): 4 β P7(LIMITE): -1 | P8(ESTADOS_REPETIDOS): ignorar | P11(BARALHAR_SUCESSORES): 0 βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ ::β :: :: β β :: ::β :: ββ β Indicadores βββββββββββββββββββββββββββββββββββββββββββββββββββββ β I1(IND_CUSTO): 4 | I2(Tempo(ms)): 0 | I3(IteraΓ§Γ΅es): 0 | I4(IND_EXPANSOES): 8 | β I5(IND_GERACOES): 10 | I6(IND_LOWER_BOUND): 0 βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ ... OpΓ§Γ£o:
Podemos observar que o algoritmo em profundidade fez o mesmo erro que nΓ³s fizemos, foi escolher d1 na primeira aΓ§Γ£o. No entanto, apΓ³s ver que nΓ£o Γ© possΓvel, testa a opΓ§Γ£o de d2 e encontra a soluΓ§Γ£o.
Notar que os nΓ³s folha foram atingidos por nΓ£o haver sucessores na posiΓ§Γ£o concreta, e nΓ£o por nΓvel da Γ‘rvore de procura, jΓ‘ que o limite foi colocado a -1, ou seja, ilimitado.
No final da procura, ainda havia um ramo para analisar, com dois estados pendentes. Esses estados eram as aΓ§Γ΅es d3 e d4 inicial, que sΓ£o aΓ§Γ΅es simΓ©tricas a d1 e d2. Como temos P8(ESTADOS_REPETIDOS): ignorar, estas aΓ§Γ΅es sΓ£o geradas.
Neste caso houve 8 expansΓ΅es na procura em profundidade, contra 13 da procura em largura. Mas evidentemente que nΓ£o serΓ‘ esta pequena instΓ’ncia que irΓ‘ suportar as nossas conclusΓ΅es. Temos um teste empΓrico na aΓ§Γ£o 6, com mais instΓ’ncias.
Na abordagem construtiva, atendendo a que este problema tem o nΓΊmero de aΓ§Γ΅es fixas, se as aΓ§Γ΅es tivessem custo variΓ‘vel, faria sentido uma heurΓstica para estimar o custo atΓ© ao final. Sendo o custo fixo, apenas sabemos que se existir soluΓ§Γ£o, a distΓ’ncia Γ© conhecida e igual para todos os estados num determinado nΓvel. Assim, nΓ£o faz sentido construir uma heurΓtsica, nem ter procuras informadas com a abordagem construtiva.
Podemos sempre considerar a hipΓ³tese de ter uma heurΓstica ignorando a admissibilidade, apenas para guiar a procura. No entanto neste problema nΓ£o Γ© claro que heurΓstica possa ser.
Podemos ter no entanto outras opΓ§Γ΅es que melhoram a abordagem construtiva. Uma das possibilidades Γ© considerar ou nΓ£o os estados repetidos. Neste problema temos 3 eixos de simetria. Significa que a mesma posiΓ§Γ£o pode ao ser refletida em cada eixo, transformar-se numa das outras, num total de 8 posiΓ§Γ΅es simΓ©tricas. Ao anular as simetrias por normalizaΓ§Γ£o do estado, e remoΓ§Γ£o de repetidos, o espaΓ§o de estados reduz-se. As simetrias estΓ£o implementadas, pelo que vamos testar na prΓ³xima aΓ§Γ£o.
Outra possibilidade nΓ£o implementada neste cΓ³digo, Γ© a verificaΓ§Γ£o se hΓ‘ linhas/colunas vazias, que estejam totalmente atacadas. Ao colocar duas ou trΓͺs damas, estas podem cobrir a totalidade das casas da ΓΊltima linha, e essa linha sΓ³ Γ© analisada no ΓΊltimo nΓvel. Esta implementaΓ§Γ£o causa tambΓ©m mais peso, mas invalida estados antecipadamente.
Nos testes empΓricos vamos passar para a interface da linha de comando, por ser mais simples.
Vamos obter primeiramente a lista de todos os parΓ’metros.
/TProcura/Construtiva/Teste$ ./bin/Release/TProcuraConstrutiva -h ββ Teste TProcuraConstrutiva βββ β 1 - Aspirador β β 2 - Puzzle 8 β β 3 - 8 Damas β β 4 - PartiΓ§Γ£o β β 5 - Artificial β ββββββββββββββββββββββββββββββββ OpΓ§Γ£o: 3 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): ignorar (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 βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
Atendendo a que o algoritmo em profundidade primeiro Γ© o ΓΊnico que faz sentido, atendendo a que os algoritmos informados nΓ£o fazem sentido utilizar dado que nΓ£o existe heurΓstica, vamos estudar uma das opΓ§Γ΅es disponΓveis nesta implementaΓ§Γ£o. Nesse sentido temos P1=3 fixo.
Podemos ver se a remoΓ§Γ£o de estados repetidos ajuda ou prejudica, atendendo a que pode reduzir os estados analisados mas Γ© tambΓ©m consumidora de tempo, pelo que fica em aberto P8=1,3. NΓ£o faz sentido os estados ascendentes dado que nΓ£o hΓ‘ movimentos inversos.
Vamos tambΓ©m ver se baralhar os sucessores tem algum impacto nos resultados, face Γ ordem fixa dos sucessores, P11=0,1. No caso de P11=1, podemos utilizar vΓ‘rias sementes aleatΓ³rias, P3 a variar, caso P11=0, nΓ£o faz sentido jΓ‘ que nΓ£o temos utilizaΓ§Γ£o para os valores aleatΓ³rios, e as instΓ’ncias sΓ£o sempre as mesmas.
Sobre a melhor configuraΓ§Γ£o, procuraremos fazer um teste de performance final.
Vamos primeiramente fazer um teste, para verificar se os estados repetidos sΓ£o benΓ©ficos. Como temos poucas instΓ’ncias, de 4 a 40, e o algoritmo nΓ£o Γ© aleatΓ³rio, o esforΓ§o nΓ£o pode ser aumentando demasiado, pelo que utilizamos dois nΓveis.
Colocamos P2=4 atendendo a que sΓ£o poucas tarefas:
OpΓ§Γ£o: 3
ββ€β InstΓ’ncias βββ { π 4 π 8 π 12 π 16 π 20 π 24 π 28 π 32 π 36 π 40 }
ββ π οΈ β P1=3 P2=4 P3=1 P4=10 P5=0 P6=4 P7=-1 P11=0 (parΓ’metros comuns)
ββͺβ ConfiguraΓ§Γ΅es βββ
ββ β [1] β P8=1
ββ β [2] β P8=3
ββ§βββββββββββββββββββ
ββ€β π§ͺ InΓcio do Teste (π₯οΈ 0) βββ
ββ π Tarefas:20 π InstΓ’ncias: 10 π οΈ ConfiguraΓ§Γ΅es: 2 π₯οΈ Processos: 1.
ββ β± π 1 π 4 π οΈ 1 π₯οΈ 1 π― 4 β 4 0 0 8 10 0
ββ β± π 2 π 8 π οΈ 1 π₯οΈ 1 π― 8 β 8 0 0 113 124 0
ββ β± π 3 π 12 π οΈ 1 π₯οΈ 1 π― 12 β 12 0 0 261 295 0
ββ β± π 4 π 16 π οΈ 1 π₯οΈ 1 π― 16 β 16 8 0 10052 10112 0
ββ β± 8ms π 5 π 20 π οΈ 1 π₯οΈ 1 π― 20 β 20 142 0 199635 199733 0
ββ β± 150ms π 6 π 24 π οΈ 1 π₯οΈ 1 π― 24 β 24 348 0 411608 411755 0
ββ β± 498ms π 7 π 28 π οΈ 1 π₯οΈ 1 π― 28 β 28 2931 0 3006298 3006508 0
ββ β± 3" 429ms π 8 π 32 π οΈ 1 π₯οΈ 1 π« β± β -2 10000 0 8723766 8724049 0
ββ β± 13" 429ms π 9 π 36 π οΈ 1 π₯οΈ 1 π« β± β -2 10000 0 7550046 7550403 0
ββ β± 23" 429ms π 10 π 40 π οΈ 1 π₯οΈ 1 π« β± β -2 10000 0 6476857 6477321 0
ββ β± 33" 430ms π 11 π 4 π οΈ 2 π₯οΈ 1 π― 4 β 4 38 0 8 8 0
ββ β± 33" 467ms π 12 π 8 π οΈ 2 π₯οΈ 1 π― 8 β 8 7 0 113 120 0
ββ β± 33" 475ms π 13 π 12 π οΈ 2 π₯οΈ 1 π― 12 β 12 8 0 261 289 0
ββ β± 33" 483ms π 14 π 16 π οΈ 2 π₯οΈ 1 π― 16 β 16 19 0 2850 2896 0
ββ β± 33" 502ms π 15 π 20 π οΈ 2 π₯οΈ 1 π― 20 β 20 302 0 112596 112672 0
ββ β± 33" 804ms π 16 π 24 π οΈ 2 π₯οΈ 1 π― 24 β 24 1800 0 534849 534950 0
ββ β± 35" 604ms π 17 π 28 π οΈ 2 π₯οΈ 1 π« β± β -2 10005 0 2223083 2223228 0
ββ β± 45" 608ms π 18 π 32 π οΈ 2 π₯οΈ 1 π« β± β -2 10004 0 1531492 1531650 0
ββ β± 55" 612ms π 19 π 36 π οΈ 2 π₯οΈ 1 π« β± β -2 10004 0 1215677 1215871 0
ββ β± 1' 5" 617ms π 20 π 40 π οΈ 2 π₯οΈ 1 π« β± β -2 10006 0 1081955 1082181 0
ββ π Ficheiro Resultados/8damas_1.csv gravado.
β β± Tempo real: 1' 15" 623ms
β β± CPU total: 1' 15" 623ms
β π UtilizaΓ§Γ£o: 100.0%
ββ§β π Fim do Teste (π₯οΈ 0 β± 1' 15" 623ms ) βββ
As 20 tarefas foram realizadas em pouco mais de 1 minuto, existindo instΓ’ncias nΓ£o resolvidas por causa do limite de tempo.
O output detalhado revela jΓ‘ que a configuraΓ§Γ£o 1 resolve mais uma instΓ’ncia que a configuraΓ§Γ£o 2.
Vamos ver os resultados:
Podemos ver a tabela com os resultados:
| RΓ³tulos de Linha | 1:ignorar | 3:gerados |
|---|---|---|
| 4 | 0 | 38 |
| 8 | 0 | 7 |
| 12 | 0 | 8 |
| 16 | 8 | 19 |
| 20 | 142 | 302 |
| 24 | 348 | 1800 |
| 28 | 2931 | 10005 |
| 32 | 10000 | 10004 |
| 36 | 10000 | 10004 |
| 40 | 10000 | 10006 |
| Total Geral | 33429 | 42193 |
Esta anΓ‘lise aparenta nΓ£o ser de todo compensador o uso dos estados gerados. No ponto de transiΓ§Γ£o, a instΓ’ncia 28 conseguiu ainda ser resolvida sem estados gerados, mas nΓ£o com estados gerados. Os tempos aparentam ser sempre superiores com estados gerados.
Poder-se-ia fazer vΓ‘rias execuΓ§Γ΅es para ter vΓ‘rios valores de tempo para as mesmas instΓ’ncias, para poder utilizar intervalos de confianΓ§a. Em todo o caso as diferenΓ§as sΓ£o bastantes, e a nΓ£o ser que se possa optimizar o algoritmo para normalizar o estado e verificar se Γ© igual, com os tempos atuais, nΓ£o aparenta trazer qualquer vantagem.
A versΓ£o com maior esforΓ§o, poderΓ‘ dar com maior precisΓ£o o ponto de transiΓ§Γ£o, entre instΓ’ncias simples para complexas.
Vamos agora verificar se baralhar os sucessores influencia ou nΓ£o o algoritmo. A ordem atual Γ© a ordem de geraΓ§Γ£o, que poderia ser trocada facilmente, caso exista alguma informaΓ§Γ£o heurΓstica nesse sentido, embora sem ser no contexto do Astar, com uma estimativa atΓ© Γ soluΓ§Γ£o Γ³tima, jΓ‘ que essa estimativa Γ© conhecida. A existir uma heurΓstica serΓ‘ para ordenar os sucessores por ordem de probabilidade de conter a soluΓ§Γ£o Γ³tima. Se tal for ΓΊtil, a ordem aleatΓ³ria poderΓ‘ ter impacto na performance, e Γ© isso que se pretende obter neste teste.
Vamos utilizar o aleatΓ³rio em 4 corridas, atendendo a que os sucessores sΓ£o baralhados.
Reduzimos o debug para 3, atendendo a que hΓ‘ 80 tarefas.
OpΓ§Γ£o: 3
ββ€β InstΓ’ncias βββ { π 4 π 8 π 12 π 16 π 20 π 24 π 28 π 32 π 36 π 40 }
ββ π οΈ β P1=3 P2=3 P4=10 P5=0 P6=4 P7=-1 P8=1 (parΓ’metros comuns)
ββͺβ ConfiguraΓ§Γ΅es βββ
ββ β [1] β P3=1 P11=0
ββ β [2] β P3=1 P11=1
ββ β [3] β P3=2 P11=0
ββ β [4] β P3=2 P11=1
ββ β [5] β P3=3 P11=0
ββ β [6] β P3=3 P11=1
ββ β [7] β P3=4 P11=0
ββ β [8] β P3=4 P11=1
ββ§βββββββββββββββββββ
ββ€β π§ͺ InΓcio do Teste (π₯οΈ 0) βββ
ββ π Tarefas:80 π InstΓ’ncias: 10 π οΈ ConfiguraΓ§Γ΅es: 8 π₯οΈ Processos: 1.
ββ β± 13" 536ms π 9 π 36 π οΈ 1 π₯οΈ 1
ββ β± 23" 536ms π 10 π 40 π οΈ 1 π₯οΈ 1
ββ β± 33" 536ms π 11 π 4 π οΈ 2 π₯οΈ 1
ββ β± 47" 343ms π 29 π 36 π οΈ 3 π₯οΈ 1
ββ β± 57" 343ms π 30 π 40 π οΈ 3 π₯οΈ 1
ββ β± 1' 7" 344ms π 31 π 4 π οΈ 4 π₯οΈ 1
ββ β± 1' 21" 166ms π 49 π 36 π οΈ 5 π₯οΈ 1
ββ β± 1' 31" 167ms π 50 π 40 π οΈ 5 π₯οΈ 1
ββ β± 1' 41" 167ms π 51 π 4 π οΈ 6 π₯οΈ 1
ββ β± 1' 54" 622ms π 69 π 36 π οΈ 7 π₯οΈ 1
ββ β± 2' 4" 622ms π 70 π 40 π οΈ 7 π₯οΈ 1
ββ β± 2' 14" 622ms π 71 π 4 π οΈ 8 π₯οΈ 1
ββ π Ficheiro Resultados/8damas_2.csv gravado.
β β± Tempo real: 2' 14" 625ms
β β± CPU total: 2' 14" 625ms
β π UtilizaΓ§Γ£o: 100.0%
ββ§β π Fim do Teste (π₯οΈ 0 β± 2' 14" 625ms ) βββ
Vamos ver os resultados de forma idΓͺntica, mas utilizando mΓ©dias atendedo a que temos 4 corridas para cada cΓ©lula:
Vamos ver os resultados, sΓ£o surpreendentes:
| RΓ³tulos de Linha | 0 | 1 |
|---|---|---|
| 4 | 0 | 0 |
| 8 | 0 | 0 |
| 12 | 0 | 0 |
| 16 | 7 | 0 |
| 20 | 151 | 0,25 |
| 24 | 372 | 0,5 |
| 28 | 3119,5 | 0,5 |
| 32 | 10000,25 | 1,25 |
| 36 | 10000 | 0,25 |
| 40 | 10000 | 2,25 |
| Total Geral | 3364,975 | 0,5 |
A utilizaΓ§Γ£o de sucessores aleatΓ³rios resolve por completo todas as instΓ’ncias. Qualquer uma das 4 ordens aleatΓ³rias resolveu todas as instΓ’ncias. Significa portanto que a ordem fixa inicial, gera uma Γ‘rvore de procura mais complexa, que uma ordem aleatΓ³ria dos sucessores, sendo responsΓ‘vel pela complexidade do problema.
Assim sendo, as instΓ’ncias atuais atΓ© 40, sΓ£o muito simples para uma configuraΓ§Γ£o com ordem aleatΓ³ria de sucessores.
Vamos fazer um teste de performance final, com todas as instΓ’ncias, de modo a medir o aumento do tempo face ao tamanho da instΓ’ncia. Fazemos 10 execuΓ§Γ΅es por instΓ’ncia para poder aferir a variabilidade dos resultados.
OpΓ§Γ£o: 3
ββ€β InstΓ’ncias βββ { π 4 π 5 π 6 β¦ π 38 π 39 π 40 } #37
ββ π οΈ β P1=3 P2=3 P4=10 P5=0 P6=4 P7=-1 P8=1 P11=1 (parΓ’metros comuns)
ββͺβ ConfiguraΓ§Γ΅es βββ
ββ β [1] β P3=1
ββ β [2] β P3=2
ββ β [3] β P3=3
ββ β [4] β P3=4
ββ β [5] β P3=5
ββ β [6] β P3=6
ββ β [7] β P3=7
ββ β [8] β P3=8
ββ β [9] β P3=9
ββ β [10] β P3=10
ββ§βββββββββββββββββββ
ββ€β π§ͺ InΓcio do Teste (π₯οΈ 0) βββ
ββ π Tarefas:370 π InstΓ’ncias: 37 π οΈ ConfiguraΓ§Γ΅es: 10 π₯οΈ Processos: 1.
ββ π Ficheiro Resultados/8damas_3.csv gravado.
β β± Tempo real: 741ms
β β± CPU total: 741ms
β π UtilizaΓ§Γ£o: 100.0%
ββ§β π Fim do Teste (π₯οΈ 0 β± 741ms ) βββ
Vamos ver os resultados:
| RΓ³tulos de Linha | MΓnimo de I2(Tempo(ms)) | MΓ©dia de I2(Tempo(ms)) | MΓ‘ximo de I2(Tempo(ms)) |
|---|---|---|---|
| 4 | 0 | 0 | 0 |
| 5 | 0 | 0 | 0 |
| 6 | 0 | 0 | 0 |
| 7 | 0 | 0 | 0 |
| 8 | 0 | 0 | 0 |
| 9 | 0 | 0 | 0 |
| 10 | 0 | 0 | 0 |
| 11 | 0 | 0,1 | 1 |
| 12 | 0 | 0 | 0 |
| 13 | 0 | 0 | 0 |
| 14 | 0 | 0 | 0 |
| 15 | 0 | 0 | 0 |
| 16 | 0 | 0 | 0 |
| 17 | 0 | 0,1 | 1 |
| 18 | 0 | 0,3 | 2 |
| 19 | 0 | 0,2 | 2 |
| 20 | 0 | 0,1 | 1 |
| 21 | 0 | 0,3 | 2 |
| 22 | 0 | 0,1 | 1 |
| 23 | 0 | 0,2 | 1 |
| 24 | 0 | 0,4 | 1 |
| 25 | 0 | 0,2 | 2 |
| 26 | 0 | 0,2 | 1 |
| 27 | 0 | 0,4 | 2 |
| 28 | 0 | 1,4 | 10 |
| 29 | 0 | 0,5 | 2 |
| 30 | 0 | 1,9 | 10 |
| 31 | 0 | 1,2 | 9 |
| 32 | 0 | 0,8 | 6 |
| 33 | 0 | 11,1 | 63 |
| 34 | 0 | 1,2 | 7 |
| 35 | 0 | 3 | 12 |
| 36 | 0 | 0,6 | 2 |
| 37 | 0 | 26,6 | 158 |
| 38 | 0 | 1,9 | 6 |
| 39 | 0 | 17,2 | 160 |
| 40 | 0 | 1,3 | 7 |
Podemos ver que atΓ© 40 o tempo Γ© sempre muito baixo. Houve algumas instΓ’ncias a levarem 0.16 segundos, mas mesmo essas foram porque tiveram azar na ordem dos sucessores, outras ordens resolveram a instΓ’ncia menos de 1 milissegundo. Aparentam ser as instΓ’ncias Γmpar as que podem ter um tempo mΓ‘ximo por vezes superior.
A vantagem dos testes paramΓ©tricos permitiu identificar um ponto crΓtico nΓ£o identificado inicialmente. A ordem dos sucessores Γ© crΓtica, mas nΓ£o Γ© necessΓ‘rio para instΓ’ncias deste tamanho, a construΓ§Γ£o de uma heurΓstica para as ordenar. A ordem aleatΓ³ria Γ© suficiente, juntamente com um algoritmo cego em profundidade ilimitada.
Caso o tamanho das instΓ’ncias aumente, a heurΓstica que leve a resoluΓ§Γ΅es mais rΓ‘pidas, poderia ser uma mais valia.
Naturalmente que se poderiam fazer melhorias na implementaΓ§Γ£o, para alΓ©m de uma heurΓstica. Pode-se implementar testes que permitam podar a Γ‘rvore de forma a que nΓ£o elimine soluΓ§Γ΅es. Existindo um teste para verificar se a soluΓ§Γ£o parcial pode ou nΓ£o ser completa, caso falhe, o ramo pode ser cortado. Um desses casos Γ© verificar se hΓ‘ linhas/colunas, nΓ£o forΓ§osamente a prΓ³xima linha a ser processada, sem damas mas jΓ‘ totalmente atacada. Uma soluΓ§Γ£o parcial deste tipo, nΓ£o pode ser convertida numa soluΓ§Γ£o completa, pelo que nΓ£o Γ© necessΓ‘rio gerar sucessores. Esta otimizaΓ§Γ£o poderia ser colocada em parΓ’metro, e verificar tambΓ©m se compensa o tempo de ser executada.