TProcura
Biblioteca em C++ para testes paramétricos de algoritmos, e coleção de algoritmos de procura e otimização
Loading...
Searching...
No Matches
Particao.cpp
Go to the documentation of this file.
1#include "Particao.h"
2#include <stdio.h>
3#include <string.h>
4
5CParticao::CParticao(void) : totalDireita(0), totalEsquerda(0)
6{
7}
8
10{
11}
12
14{
16 direita.Count(0);
17 esquerda.Count(0);
18 numeros.Count(0);
21
22 // gerar uma instancia provavelmente possivel
23 int soma1, soma2;
24 soma1 = soma2 = 0;
25 for (int i = 0; i < instancia.valor; i++) {
27 if (soma1 < soma2)
28 soma1 += numeros.Last();
29 else soma2 += numeros.Last();
30 }
31 // acertar a paridade, muito embora não se saiba se há ou não solução
32 if ((soma1 + soma2) % 2 == 1)
33 numeros.Last() + 1;
34 // garantir que há uma solução
35 //if (soma1 != soma2)
36 // numeros.Add(abs(soma1 - soma2));
37 numeros.Remove(0);
38 numeros.Sort();
39}
40
41void CParticao::Debug(void)
42{
43 int i, j;
44 printf("\nColocar #%d: %d = %d",
46 if (solCompleta.Count() > 0) {
47 for (i = 0, j = 0; i < solCompleta.Count(); i++) {
48 if (solCompleta[i]) { // esquerda
49 if (j++ % 4 == 0) {
50 printf("\n ");
51 }
52 printf("%3d ", numeros[i]);
53 if (j % 4 == 0)
54 printf(" <<<");
55 }
56 }
57 if (j % 4 != 0) {
58 while (j++ % 4 != 0)
59 printf(" ");
60 printf(" <<<");
61 }
62 for (i = 0, j = 0; i < solCompleta.Count(); i++) {
63 if (!solCompleta[i]) { // direita
64 if (j++ % 4 == 0) {
65 printf("\n>>> ");
66 }
67 printf("%3d ", numeros[i]);
68 }
69 }
70 }
71 else {
72 for (i = 0; i < numeros.Count(); i++) {
73 if (i % 4 == 0) {
74 printf("\n--- ");
75 }
76 printf("%3d ", numeros[i]);
77 if ((i + 1) % 4 == 0)
78 printf(" ---");
79 }
80 if (i % 4 != 0) {
81 while (i++ % 4 != 0)
82 printf(" ");
83 printf(" ---");
84 }
85 for (i = 0; i < esquerda.Count(); i++) {
86 if (i % 4 == 0) {
87 printf("\n ");
88 }
89 printf("%3d ", esquerda[i]);
90 if ((i + 1) % 4 == 0)
91 printf(" <<<");
92 }
93 if (i % 4 != 0) {
94 while (i++ % 4 != 0)
95 printf(" ");
96 printf(" <<<");
97 }
98 for (i = 0; i < direita.Count(); i++) {
99 if (i % 4 == 0) {
100 printf("\n>>> ");
101 }
102 printf("%3d ", direita[i]);
103 }
104 }
105}
106
107void CParticao::TesteManual(const char* nome)
108{
109 instancia = { NULL, 10,2,1000, NULL, NULL };
111}
112
113// métodos melhorativos
117 for (int i = 0; i < solCompleta.Count(); i++)
118 solCompleta[i] = TRand::rand() % 2;
119}
120
124 for (int i = 0; i < solCompleta.Count(); i++)
125 if (solCompleta[i])
127 else
130}
131
133 // trocar cada valor
134 for (int i = 0; i < solCompleta.Count(); i++) {
136 vizinho->solCompleta[i] = !solCompleta[i];
138 }
140}
141
143 // coloca um valor aleatório, com probabilidade de nova mudança em 75%
144 do {
146 } while (TRand::rand() % 4);
147}
148
150 // divisao tem de ter elementos de um e de outro
151 int divisao = 1 + TRand::rand() % solCompleta.Count()-2;
152 for (int i = 0; i < divisao; i++)
153 solCompleta[i] = ((CParticao*)a)->solCompleta[i];
154 for (int i = divisao; i < solCompleta.Count(); i++)
155 solCompleta[i] = ((CParticao*)b)->solCompleta[i];
157}
158
160 int diferentes = 0; // número de posições distintas
161 for (int i = 0; i < solCompleta.Count(); i++)
162 if (solCompleta[i] != ((CParticao*)a)->solCompleta[i])
163 diferentes++;
164 return diferentes;
165}
166
Representa um estado do problema da partição.
Definition Particao.h:13
TVector< bool > solCompleta
Definition Particao.h:25
void Mutar(void)
Definition Particao.cpp:142
~CParticao(void)
Definition Particao.cpp:9
int Distancia(TPonto a)
Definition Particao.cpp:159
int Avaliar(void)
Definition Particao.cpp:121
void Vizinhanca(TVector< TPonto > &vizinhos)
Definition Particao.cpp:132
TVector< int > direita
Definition Particao.h:19
TVector< int > esquerda
Definition Particao.h:19
void Cruzamento(TPonto a, TPonto b)
Definition Particao.cpp:149
TVector< int > numeros
Definition Particao.h:19
void NovaSolucao(void)
Definition Particao.cpp:114
int totalDireita
Definition Particao.h:20
void Inicializar(void)
Coloca o objecto no estado inicial da procura.
Definition Particao.cpp:23
void Debug(void)
Mostra o estado no ecrã, para debug.
Definition Particao.cpp:86
void TesteManual(const char *nome)
Inicializa a interação com o utilizador.
Definition Particao.cpp:107
TProcuraConstrutiva * Duplicar(void)
Cria um objecto que é uma cópia deste.
Definition Particao.cpp:13
int totalEsquerda
Definition Particao.h:20
CParticao(void)
Definition Particao.cpp:5
virtual void Cruzamento(TPonto a, TPonto b)
virtual void Vizinhanca(TVector< TPonto > &vizinhos)
virtual int Avaliar(void)
virtual void Inicializar(void)
Coloca o objecto no estado inicial da procura.
Definition TProcura.h:182
static int resultado
Resultado retornado pelo algoritmo na última execução.
Definition TProcura.h:459
virtual void TesteManual(const char *nome)
Inicializa a interação com o utilizador.
Definition TProcura.cpp:104
static TParametro instancia
ID da instância atual, a ser utilizado em SolucaoVazia().
Definition TProcura.h:21
TVector< Item > & Sort(TVector< int > *idxvect=nullptr)
Ordena todo o vetor, opcionalmente devolvendo índices ordenados.
Definition TVector.h:539
Item & Random()
Definition TVector.h:180
TVector< Item > & Remove(Item const &i)
Remove todas as ocorrências de um dado elemento.
Definition TVector.h:707
TVector< Item > & Add(Item a)
Definition TVector.h:115
Item & Last()
Definition TVector.h:157
int Count() const
Definition TVector.h:160
int custo
Custo total acumulado desde o estado inicial.
unsigned int rand(int seq)
Retorna o próximo valor pseudo-aleatório.
Definition TRand.cpp:46
int valor
valor do parametro
Definition TProcura.h:114