TProcura
Biblioteca em C++ para testes paramétricos de algoritmos, e coleção de algoritmos de procura e otimização
Loading...
Searching...
No Matches
✏️ Partição, profundidade primeiro

O problema da partição consiste em dividir um conjunto de números em dois grupos, de forma a que somem exatamente o mesmo valor.

Suponhamos a seguinte instância: 5;4;3;2;2. Os valores estão por ordem decrescente, existindo o número 2 repetido. Estes números podem ser colocados em dois grupos 5+3 = 4+2+2.

Considerando o estado vazio como sendo todos os números ainda por colocar, os sucessores de um determinado estado pode consistir na colocação do número mais alto num dos dois grupos. A ramificação é portanto binária, e a profundidade máxima igual à quantidade de números. Poder-se-ia optar por um conjunto de sucessores que consistia em colocar qualquer número num dos grupos, mas assim ter-se-ia uma ramificação muito superior, e é indiferente a ordem pela qual os números são colocados nos grupos.

A representação do estado é autoexplicativa.

Geração Estado Nível Pai Expansão
1
(5;4;3;2;2) 0 = 0
5
0 1
2
(4;3;2;2) 5 = 0
4
1  
3
(4;3;2;2) 0 = 5
4
1 2
4
(3;2;2) 4 = 5
3
3 18
5
(3;2;2) 0 = 9
3
3 3
6
(2;2) 3 = 9
2
5 11
7
(2;2) 0 = 12
2
5 4
8
(2) 2 = 12
1
7 8
9
(2) 0 = 14
1
7 5
10
2 = 14
0
9 7
11
0 = 16
0
9 6
12
4 = 12
0
8 10
13
2 = 14
0
8 9
14
(2) 5 = 9
1
6 15
15
(2) 3 = 11
1
6 12
16
5 = 11
0
15 14
17
3 = 13
0
15 13
18
7 = 9
0
14 17
19
5 = 11
0
14 16
20
(2;2) 7 = 5
2
4  
21
(2;2) 4 = 8
2
4 19
22
(2) 6 = 8
1
21 23
23
(2) 4 = 10
1
21 20
24
6 = 10
0
23 22
25
4 = 12
0
23 21
26
8 = 8
0
22 25 Solução!
27
6 = 10
0
22 24

Ficheiro de Excel, passo a passo:

A solução foi encontrada com 27 gerações e 25 expansões. No entanto há vários estados que já se saberia não poderem levar a uma divisão válida, mas continuaram a ser explorados. Por exemplo o estado 5, embora num dos grupos já some 9, excedendo portanto o limite de 8, mesmo assim expande-se logo na 3ª expansão este estado, desperdiçando tempo já que não leva a lado nenhum. Para que o algoritmo não incorra nesse tipo de desperdícios, o conjunto de sucessores tem de ser redefinido, não gerando estados em que um dos grupos já ultrapassa metade da soma de todos os números.


⚡ Ação: Refaça esta procura já com o novo sucessor.
Geração Estado Nível Pai Expansão
1 (5;4;3;2;2) 0 = 0 5 0 1
2 (4;3;2;2) 5 = 0 4 1  
3 (4;3;2;2) 0 = 5 4 1 2
4 (3;2;2) 4 = 5 3 3 3
5 (2;2) 7 = 5 2 4  
6 (2;2) 4 = 8 2 4 4
7 (2) 6 = 8 1 6 5
8 8 = 8 0 7 6 Solução!

◀ Passo anterior Próximo passo ▶