TProcura
Biblioteca em C++ para testes paramétricos de algoritmos, e coleção de algoritmos de procura e otimização
Loading...
Searching...
No Matches
ProblemaArtificial.cpp
Go to the documentation of this file.
2#include <stdio.h>
3#include <string.h>
4
5
7
11
15
17{
19 if(clone!=NULL)
20 clone->Copiar(this);
21 else
22 memoriaEsgotada = true;
23 return clone;
24}
25
27{
29 // acertar as variáveis estáticas, com a instância
30 CarregaInstancia();
31
32 nivel = 0;
33 id = 1;
34 heur = 0;
35
37}
38
39// gerar os sucessores de acordo com a instância, de forma aleatória
41{
42 // valores após o nível máximo, são becos sem saída
43 if (nivel < espaco.maxNivel) {
45 int ramificacao;
46 // para garantir que a árvore é gerada da mesma forma, a semente aleatória tem de ser reinicializada
47 // depende de ID do pai, e do seed da instância
48 // utilizar sequência 1 de TRand, para não perturbar sequência aleatória do algoritmo base
50
53 else
55
56 for (int i = 0; i < ramificacao; i++) {
58 sucessor->nivel++;
59 // ID tem de ser dependente do pai e da semente, para poder serem gerados os mesmos sucessores,
60 // independente da ordem de expansão que o algoritmo utilizar
61 // caso possam ser repetidos globalmente, utilizar o resto da divisão pela quantidade de estados
62 // caso possam ser repetidos no mesmo nível, mas não em níveis distintos,
63 // utilizar o resto da divisão pela quantidade de estados no nível e concatenar o nível
64 if (espaco.maxEstadosNivel > 0)
66 else if (espaco.maxEstados > 0)
68 else
69 sucessor->id = TRand::rand(1);
70
71 // custos
72 sucessor->custo = 1 + (espaco.maxCusto > 1 ? TRand::rand(1) % espaco.maxCusto : 0);
73
74 // heuristica
75 sucessor->heur = 0;
76 }
77 }
78
80}
81
82// Retorna a ação (movimento, passo, jogada, lance, etc.) que gerou o sucessor
84 static char str[256];
85 // dado que os estados são aleatórios independentes, colocar na ação o número
86 sprintf(str, "a%u", ((CProblemaArtificial*)sucessor)->id);
87 return str;
88}
89
90
92{
93 NovaLinha();
94 printf("--<([%u])>--", id);
95}
96
98{
99 // solução completa se o estado estiver num nível compativel, e o resto da divisão por raridadeObjeto for 0
100 return (nivel >= espaco.minNivelObjetivo && (id % espaco.objetivo) == 0);
101}
102
104{
106 // ação e estado é o mesmo neste problema artificial, já que um estado muda completamente do pai para o filho
107 parametro[verAcoes].valor = 1;
108 // limitar as iterações, para que a paragem por tempo não ocorra
109 parametro[limiteIteracoes].valor = 1000000;
110
111 // definir as instâncias
112 instancia = { "Problema", 1,1,10, "Caracteristicas dos problemas", NULL };
113
114}
115
116
118 return CProblemaArtificial::id != ((CProblemaArtificial*)estado)->id;
119}
120
121// o problema artificial, simular heurística com diferentes características:
123 heuristica = heur = 0;
124 // utilizar apenas a distância até ao nível mínimo onde pode estar a solução
128}
129
130
131// método para lidar com estados repetidos
133{
135 estado[0] = id;
136}
137
138
139/*
140TParametrosEspaco:
141int minRamificacao, maxRamificacao; // valores mínimos e máximos para a ramificação
142int minNivelObjetivo; // valor mínimo do nível para um estado poder ser objetivo
143int maxNivel; // valor máximo de nível de um estado (se atingido, não gera sucessores)
144int objetivo; // se ID módulo objetivo for nulo, e o nível mínimo for respeitado, o estado é objetivo
145int maxCusto; // custo máximo de uma ação, mínimo é 1
146int maxEstados; // os IDs dos estados ficam em módulo de maxEstados, de modo a poderem ser repetidos (0 não repete)
147int maxEstadosNivel; // IDs dos estados ficam em módulo de maxEstadosNivel, concatenado com o nível para não haver colisões entre níveis (0 não repete)
148unsigned int sementeAleatoria; // semente aleatória, definindo esta instância (para poder reproduzir a árvore de procura)
149*/
150void CProblemaArtificial::CarregaInstancia() {
152 {2,2,4,5,10,1,0,0,1}, // pequena instância, ramificação baixa, profundidade baixa, objetivo 1 em 10 (termina em 0)
153 {4,4,1,6,10,1,100,0,2}, // ramificação média, estados máximos 100 (repetem-se, resto da divisão por 100). minNivelObjetivo tem de ser 1 sempre que maxEstados>0
154 {6,6,5,7,10,1,0,100,3}, // estados máximos em cada nível 100 (repetem-se, resto da divisão por 100, mas sem colisões entre níveis)
155 {1,4,4,7,10,10,0,0,4}, // custos não unitários (até 10), ramificação variável baixa
156 {1,4,20,20,100,2,0,0,5}, // profundidade média, solução no último nível apenas, custos variáveis mas menos, objetivo 1 em 100 (termina em 00)
157 {1,4,1,20,100,2,10000,0,6}, // máximo número de estados 10K (minNivelObjetivo tem de ser 1 sempre que maxEstados>0)
158 {1,4,20,20,100,2,0,1000,7}, // máximo número de estados num nível 1K
159 {10,20,10,20,100,1,0,0,8}, // ramificação média, profundidade média, solução variável, custo fixo
160 {10,20,1,20,100,1,10000,0,9}, // máximo número de estados 10K (minNivelObjetivo tem de ser 1 sempre que maxEstados>0)
161 {20,100,40,60,100,2,0,0,10}, // ramificação elevada, profundidade elevada,
162 };
163
165}
@ verAcoes
Mostra estado a cada K ações. Se 1, mostra sempre estados e nunca ações.
#define OBJETO_HASHTABLE
@ limiteIteracoes
Número máximo de iterações (0 significa sem limite).
Definition TProcura.h:46
Representa um estado num problema artificial.
void Debug(void)
Mostra o estado no ecrã, para debug.
bool Distinto(TNo estado)
Verifica se o estado actual distinto do fornecido.
bool SolucaoCompleta(void)
Verifica se o estado actual é objectivo (é uma solução completa)
void Sucessores(TVector< TNo > &sucessores)
Coloca em sucessores a lista de estados sucessores.
static TParametrosEspaco espaco
void Codifica(uint64_t estado[OBJETO_HASHTABLE])
Codifica o estado para um vetor de inteiros de 64 bits.
void Inicializar(void)
Coloca o objecto no estado inicial da procura.
int Heuristica(void)
Função para calcular quanto falta para o final, o valor da heurística.
TProcuraConstrutiva * Duplicar(void)
Cria um objecto que é uma cópia deste.
void ResetParametros()
Inicializa os parametros, indicadores e instâncias.
const char * Acao(TProcuraConstrutiva *sucessor)
void Copiar(TNo objecto)
Fica com uma cópia do objecto.
Representa um estado no espaço de estados.
void NovaLinha(bool tudo=true)
static bool memoriaEsgotada
Flag indicando problemas de memória esgotada.
Definition TProcura.h:467
static int resultado
Resultado retornado pelo algoritmo na última execução.
Definition TProcura.h:459
static TParametro instancia
ID da instância atual, a ser utilizado em SolucaoVazia().
Definition TProcura.h:21
static TVector< TParametro > parametro
Parâmetros a serem utilizados na configuração atual.
Definition TProcura.h:451
virtual void Sucessores(TVector< TNo > &sucessores)
Coloca em sucessores a lista de estados sucessores.
void Inicializar(void) override
Coloca o objecto no estado inicial da procura.
void ResetParametros() override
Redefinição. Ver TProcura::ResetParametros().
virtual int Heuristica(void)
Função para calcular quanto falta para o final, o valor da heurística.
virtual void Codifica(uint64_t estado[OBJETO_HASHTABLE])
Codifica o estado para um vetor de inteiros de 64 bits.
int heuristica
Estimativa para o custo até um estado objetivo, se disponível.
static int tamanhoCodificado
Número de inteiros de 64 bits utilizados para codificar um objeto (≤ OBJETO_HASHTABLE).
unsigned int rand(int seq)
Retorna o próximo valor pseudo-aleatório.
Definition TRand.cpp:46
void srand(unsigned int seed, int seq)
Inicializa a semente da geração pseudo-aleatória.
Definition TRand.cpp:34
int valor
valor do parametro
Definition TProcura.h:114
unsigned int sementeAleatoria