73{
75 int generation;
80 int pool_size,
81 number_generations;
82
83#ifdef GEQO_DEBUG
84 int status_interval;
85#endif
88
89#if defined(ERX)
91 int edge_failures = 0;
92#endif
93#if defined(CX) || defined(PX) || defined(OX1) || defined(OX2)
95#endif
96#if defined(CX)
97 int cycle_diffs = 0;
98 int mutations = 0;
99#endif
100
101
102 root->join_search_private = &
private;
103 private.initial_rels = initial_rels;
104
105
107
108
111#ifdef GEQO_DEBUG
112 status_interval = 10;
113#endif
114
115
117
118
120
121
123
124
125
126#ifdef GEQO_DEBUG
127 elog(
DEBUG1,
"GEQO selected %d pool entries, best %.2f, worst %.2f",
128 pool_size,
131#endif
132
133
136
137#if defined (ERX)
138#ifdef GEQO_DEBUG
139 elog(
DEBUG2,
"using edge recombination crossover [ERX]");
140#endif
141
143#elif defined(PMX)
144#ifdef GEQO_DEBUG
145 elog(
DEBUG2,
"using partially matched crossover [PMX]");
146#endif
147
149#elif defined(CX)
150#ifdef GEQO_DEBUG
152#endif
153
156#elif defined(PX)
157#ifdef GEQO_DEBUG
158 elog(
DEBUG2,
"using position crossover [PX]");
159#endif
160
163#elif defined(OX1)
164#ifdef GEQO_DEBUG
166#endif
167
170#elif defined(OX2)
171#ifdef GEQO_DEBUG
173#endif
174
177#endif
178
179
180
181
182
183 for (generation = 0; generation < number_generations; generation++)
184 {
185
187
188#if defined (ERX)
189
191
192 kid = momma;
193
194
196#elif defined(PMX)
197
199#elif defined(CX)
200
202
203 if (cycle_diffs == 0)
204 {
205 mutations++;
207 }
208#elif defined(PX)
209
211#elif defined(OX1)
212
214#elif defined(OX2)
215
217#endif
218
219
220
222
223
225
226
227#ifdef GEQO_DEBUG
228 if (status_interval && !(generation % status_interval))
229 print_gen(
stdout, pool, generation);
230#endif
231
232 }
233
234
235#if defined(ERX)
236#if defined(GEQO_DEBUG)
237 if (edge_failures != 0)
238 elog(
LOG,
"[GEQO] failures: %d, average: %d",
239 edge_failures, (int) number_generations / edge_failures);
240 else
241 elog(
LOG,
"[GEQO] no edge failures detected");
242#else
243
244 (void) edge_failures;
245#endif
246#endif
247
248#if defined(CX) && defined(GEQO_DEBUG)
249 if (mutations != 0)
250 elog(
LOG,
"[GEQO] mutations: %d, generations: %d",
251 mutations, number_generations);
252 else
253 elog(
LOG,
"[GEQO] no mutations processed");
254#endif
255
256#ifdef GEQO_DEBUG
257 print_pool(
stdout, pool, 0, pool_size - 1);
258#endif
259
260#ifdef GEQO_DEBUG
261 elog(
DEBUG1,
"GEQO best is %.2f after %d generations",
262 pool->
data[0].
worth, number_generations);
263#endif
264
265
266
267
268
269
271
273
274 if (best_rel == NULL)
275 elog(
ERROR,
"geqo failed to make a valid plan");
276
277
278#ifdef NOT_USED
279 print_plan(best_plan,
root);
280#endif
281
282
285
286#if defined (ERX)
288#elif defined(PMX)
290#elif defined(CX)
293#elif defined(PX)
296#elif defined(OX1)
299#elif defined(OX2)
302#endif
303
305
306
307 root->join_search_private = NULL;
308
309 return best_rel;
310}
Edge * alloc_edge_table(PlannerInfo *root, int num_gene)
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)
Cost geqo_eval(PlannerInfo *root, Gene *tour, int num_gene)
RelOptInfo * gimme_tree(PlannerInfo *root, Gene *tour, int num_gene)
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)
Pool * alloc_pool(PlannerInfo *root, int pool_size, int string_length)
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)
void spread_chromo(PlannerInfo *root, Chromosome *chromo, Pool *pool)
Chromosome * alloc_chromo(PlannerInfo *root, 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)
City * alloc_city_table(PlannerInfo *root, 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)
void geqo_selection(PlannerInfo *root, Chromosome *momma, Chromosome *daddy, Pool *pool, double bias)