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

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.

SumΓ‘rio

β”Œβ”€ Teste TProcuraConstrutiva ──┐
β”‚ 1 - Aspirador                β”‚
β”‚ 2 - Puzzle 8                 β”‚
β”‚ 3 - 8 Damas                  β”‚
β”‚ 4 - PartiΓ§Γ£o                 β”‚
β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜
OpΓ§Γ£o: 3

8 Damas - colocar 8 damas no tabuleiro sem que se ataquem mutuamente

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.

AΓ§Γ£o 1 - Ver instΓ’ncias

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.

AΓ§Γ£o 2 - Resolver manualmente

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.

AΓ§Γ£o 3 - Procura em Largura

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.

AΓ§Γ£o 4 - Procura em Profundidade

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.

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

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.

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

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.

Teste: 8damas_1

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.

  • Tipo de Teste / Objetivo: ParamΓ©trico (P8=1,3)
  • DefiniΓ§Γ£o: InstΓ’ncias: 4:40:4; ConfiguraΓ§Γ΅es: P1=3 P7=-1 P8=1,3
  • EsforΓ§o: 4:40:4; 4:40
  • ExecuΓ§Γ£o: TProcura 4:40:4 -R Resultados/8damas_1 -P P1=3 P2=4 P7=-1 P8=1,3

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.

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

Vamos ver os resultados:

  • Colunas: P8
  • Linhas: InstΓ’ncia
  • Valores: I2(tempo(ms))

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.

Teste: 8damas_2

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.

  • Tipo de Teste / Objetivo: ParamΓ©trico (P11=0,1)
  • DefiniΓ§Γ£o: InstΓ’ncias: 4:40:4; ConfiguraΓ§Γ΅es: P1=3 P7=-1 P8=1 P11=0,1 x P3=1:4
  • EsforΓ§o: 4:40:4; 4:40
  • ExecuΓ§Γ£o: TProcura 4:40:4 -R Resultados/8damas_2 -P P1=3 P2=3 P7=-1 P8=1 P11=0,1 x P3=1:4

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:

  • Colunas: P11
  • Linhas: InstΓ’ncia
  • Valores: I2(tempo(ms))

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.

Teste: 8damas_3

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.

  • Tipo de Teste / Objetivo: Performance (tempo vs tamanho)
  • DefiniΓ§Γ£o: InstΓ’ncias: 4:40; ConfiguraΓ§Γ΅es: P1=3 P7=-1 P8=1 P11=1
  • EsforΓ§o: P3=1:10, P3=1:100, P3=1:1000
  • ExecuΓ§Γ£o: TProcura 4:40 -R Resultados/8damas_3 -P P1=3 P2=3 P7=-1 P8=1 P11=1 P3=1:10

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:

  • Colunas: valores
  • Linhas: InstΓ’ncia
  • Valores: mΓ­nimo I2, mΓ©dia I2, mΓ‘ximo I2
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.

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