|
TProcura
Biblioteca em C++ para testes paramétricos de algoritmos, e coleção de algoritmos de procura e otimização
|
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.
| 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! |