TProcura
Biblioteca em C++ para testes paramΓ©tricos de algoritmos, e coleΓ§Γ£o de algoritmos de procura e otimizaΓ§Γ£o
Loading...
Searching...
No Matches
πŸ’» Puzzle 8 - Procuras Informadas

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.

SumΓ‘rio

AΓ§Γ£o 5 - HeurΓ­stica

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:

  • os nΓΊmeros 2, 5, 8 estΓ£o a distΓ’ncia 1
  • os nΓΊmeros 1, 4, 7 estΓ£ Γ  distΓ’ncia 2
  • o nΓΊmero 3 estΓ‘ Γ  distΓ’ncia 3

O total serΓ‘ 3 + 6 + 3 = 12.

Vamos ver como esta heurΓ­stica guia os diferentes algoritmos informados.

AΓ§Γ£o 6 - Melhor Primeiro

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.

AΓ§Γ£o 7 - AStar

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.

AΓ§Γ£o 8 - IDAStar

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.

AΓ§Γ£o 9 - Branch-and-Bound

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.

AΓ§Γ£o 10 - Testes EmpΓ­ricos

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.

Teste: puzzle8_1

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.

  • Tipo de Teste / Objetivo: ParamΓ©trico (P1=1,3:7)
  • DefiniΓ§Γ£o: InstΓ’ncias: 1:1000:100; ConfiguraΓ§Γ΅es: P1=1,3:7 x P3=1:4
  • EsforΓ§o: 1:1000:100; 1:1000:10; 1:1000
  • ExecuΓ§Γ£o: TProcura 1:1000:100 -R Resultados/puzzle8_1 -P P2=3 P1=1,3:7 x P3=1:4

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.

  • hardware: 11th Gen Intel(R) Core(TM) i7-1185G7 @ 3.00GHz, RAM 16.0 GB (4267 MT/s)
  • Ficheiro de AnΓ‘lise: puzzle8.xlsx

Vamos ver os resultados em bruto, para saber toais de P1 face a diversos indicadores:

  • Colunas: InstΓ’ncia (usar a coluna de tvetor_1)
  • Linhas: valores
  • Valores: I1, I2, I4, mΓ‘ximo I1, Resolvido

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:

  • procuras informadas sΓ£o no geral mais eficientes em termos de tempo;
  • a procura em profundidade primeiro iterativa foi o ΓΊnico a nΓ£o conseguir resolver uma das instΓ’ncias, no limite dos 10 segundos;
  • o Melhor Primeiro nem sempre retorna a soluΓ§Γ£o Γ³tima, todos os outros retornam sempre a soluΓ§Γ£o Γ³tima;
  • os algoritmos informados mais eficientes em termos de esforΓ§o computacional, medido pelo tempo CPU e nΓΊmero de expansΓ΅es sΓ£o o Astar e IDAstar

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.

  • Tipo de Teste / Objetivo: Performance (I2 (tempo) vs I1 (Γ³timo))

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.

β—€ Passo anterior PrΓ³ximo passo β–Ά