50 #if !defined(ERX) && \
56 #error "must choose one GEQO recombination mechanism in geqo.h"
86 int edge_failures = 0;
88 #if defined(CX) || defined(PX) || defined(OX1) || defined(OX2)
97 root->join_search_private = (
void *) &
private;
98 private.initial_rels = initial_rels;
107 status_interval = 10;
111 pool =
alloc_pool(root, pool_size, number_of_rels);
122 elog(
DEBUG1,
"GEQO selected %d pool entries, best %.2f, worst %.2f",
134 elog(
DEBUG2,
"using edge recombination crossover [ERX]");
140 elog(
DEBUG2,
"using partially matched crossover [PMX]");
153 elog(
DEBUG2,
"using position crossover [PX]");
178 for (generation = 0; generation < number_generations; generation++)
198 if (cycle_diffs == 0)
223 if (status_interval && !(generation % status_interval))
224 print_gen(
stdout, pool, generation);
231 #if defined(GEQO_DEBUG)
232 if (edge_failures != 0)
233 elog(
LOG,
"[GEQO] failures: %d, average: %d",
234 edge_failures, (
int) number_generations / edge_failures);
236 elog(
LOG,
"[GEQO] no edge failures detected");
239 (void) edge_failures;
243 #if defined(CX) && defined(GEQO_DEBUG)
245 elog(
LOG,
"[GEQO] mutations: %d, generations: %d",
246 mutations, number_generations);
248 elog(
LOG,
"[GEQO] no mutations processed");
252 print_pool(
stdout, pool, 0, pool_size - 1);
256 elog(
DEBUG1,
"GEQO best is %.2f after %d generations",
257 pool->
data[0].
worth, number_generations);
269 if (best_rel == NULL)
270 elog(
ERROR,
"geqo failed to make a valid plan");
274 print_plan(best_plan, root);
302 root->join_search_private = NULL;
325 size = pow(2.0, nr_rel + 1.0);
335 return (
int) ceil(size);
elog(ERROR, "%s: %s", p2, msg)
float gimme_edge_table(PlannerInfo *root, Gene *tour1, Gene *tour2, int num_gene, Edge *edge_table)
void free_edge_table(PlannerInfo *root, Edge *edge_table)
int gimme_tour(PlannerInfo *root, Edge *edge_table, Gene *new_gene, int num_gene)
Edge * alloc_edge_table(PlannerInfo *root, int num_gene)
Cost geqo_eval(PlannerInfo *root, Gene *tour, int num_gene)
RelOptInfo * gimme_tree(PlannerInfo *root, Gene *tour, int num_gene)
RelOptInfo * geqo(PlannerInfo *root, int number_of_rels, List *initial_rels)
static int gimme_number_generations(int pool_size)
static int gimme_pool_size(int nr_rel)
double Geqo_selection_bias
void geqo_mutation(PlannerInfo *root, Gene *tour, int num_gene)
void sort_pool(PlannerInfo *root, Pool *pool)
void free_chromo(PlannerInfo *root, Chromosome *chromo)
void free_pool(PlannerInfo *root, Pool *pool)
void random_init_pool(PlannerInfo *root, Pool *pool)
Chromosome * alloc_chromo(PlannerInfo *root, int string_length)
void spread_chromo(PlannerInfo *root, Chromosome *chromo, Pool *pool)
Pool * alloc_pool(PlannerInfo *root, int pool_size, int string_length)
void geqo_set_seed(PlannerInfo *root, double seed)
void free_city_table(PlannerInfo *root, City *city_table)
void pmx(PlannerInfo *root, Gene *tour1, Gene *tour2, Gene *offspring, int num_gene)
void ox1(PlannerInfo *root, Gene *mom, Gene *dad, Gene *offspring, int num_gene, City *city_table)
int cx(PlannerInfo *root, Gene *tour1, Gene *tour2, Gene *offspring, int num_gene, City *city_table)
void ox2(PlannerInfo *root, Gene *mom, Gene *dad, Gene *offspring, int num_gene, City *city_table)
void px(PlannerInfo *root, Gene *tour1, Gene *tour2, Gene *offspring, int num_gene, City *city_table)
City * alloc_city_table(PlannerInfo *root, int num_gene)
void geqo_selection(PlannerInfo *root, Chromosome *momma, Chromosome *daddy, Pool *pool, double bias)