75{
77 int generation;
82 int pool_size,
83 number_generations;
84
85#ifdef GEQO_DEBUG
86 int status_interval;
87#endif
90
91#if defined(ERX)
93 int edge_failures = 0;
94#endif
95#if defined(CX) || defined(PX) || defined(OX1) || defined(OX2)
97#endif
98#if defined(CX)
99 int cycle_diffs = 0;
100 int mutations = 0;
101#endif
102
105
106
108 private.initial_rels = initial_rels;
109
110
111 root->assumeReplanning =
true;
112
113
115
116
119#ifdef GEQO_DEBUG
120 status_interval = 10;
121#endif
122
123
125
126
128
129
131
132
133
134#ifdef GEQO_DEBUG
135 elog(
DEBUG1,
"GEQO selected %d pool entries, best %.2f, worst %.2f",
136 pool_size,
139#endif
140
141
144
145#if defined (ERX)
146#ifdef GEQO_DEBUG
147 elog(
DEBUG2,
"using edge recombination crossover [ERX]");
148#endif
149
151#elif defined(PMX)
152#ifdef GEQO_DEBUG
153 elog(
DEBUG2,
"using partially matched crossover [PMX]");
154#endif
155
157#elif defined(CX)
158#ifdef GEQO_DEBUG
160#endif
161
164#elif defined(PX)
165#ifdef GEQO_DEBUG
166 elog(
DEBUG2,
"using position crossover [PX]");
167#endif
168
171#elif defined(OX1)
172#ifdef GEQO_DEBUG
174#endif
175
178#elif defined(OX2)
179#ifdef GEQO_DEBUG
181#endif
182
185#endif
186
187
188
189
190
191 for (generation = 0; generation < number_generations; generation++)
192 {
193
195
196#if defined (ERX)
197
199
200 kid = momma;
201
202
204#elif defined(PMX)
205
207#elif defined(CX)
208
210
211 if (cycle_diffs == 0)
212 {
213 mutations++;
215 }
216#elif defined(PX)
217
219#elif defined(OX1)
220
222#elif defined(OX2)
223
225#endif
226
227
228
230
231
233
234
235#ifdef GEQO_DEBUG
236 if (status_interval && !(generation % status_interval))
237 print_gen(
stdout, pool, generation);
238#endif
239
240 }
241
242
243#if defined(ERX)
244#if defined(GEQO_DEBUG)
245 if (edge_failures != 0)
246 elog(
LOG,
"[GEQO] failures: %d, average: %d",
247 edge_failures, (int) number_generations / edge_failures);
248 else
249 elog(
LOG,
"[GEQO] no edge failures detected");
250#else
251
252 (void) edge_failures;
253#endif
254#endif
255
256#if defined(CX) && defined(GEQO_DEBUG)
257 if (mutations != 0)
258 elog(
LOG,
"[GEQO] mutations: %d, generations: %d",
259 mutations, number_generations);
260 else
261 elog(
LOG,
"[GEQO] no mutations processed");
262#endif
263
264#ifdef GEQO_DEBUG
265 print_pool(
stdout, pool, 0, pool_size - 1);
266#endif
267
268#ifdef GEQO_DEBUG
269 elog(
DEBUG1,
"GEQO best is %.2f after %d generations",
270 pool->
data[0].
worth, number_generations);
271#endif
272
273
274
275
276
277
279
281
282 if (best_rel == NULL)
283 elog(
ERROR,
"geqo failed to make a valid plan");
284
285
286#ifdef NOT_USED
287 print_plan(best_plan,
root);
288#endif
289
290
293
294#if defined (ERX)
296#elif defined(PMX)
298#elif defined(CX)
301#elif defined(PX)
304#elif defined(OX1)
307#elif defined(OX2)
310#endif
311
313
314
316
317 return best_rel;
318}
void SetPlannerInfoExtensionState(PlannerInfo *root, int extension_id, void *opaque)
int GetPlannerExtensionId(const char *extension_name)
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)
int Geqo_planner_extension_id
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)