1 | /*------------------------------------------------------------------------- |
2 | * |
3 | * geqo_recombination.h |
4 | * prototypes for recombination in the genetic query optimizer |
5 | * |
6 | * Portions Copyright (c) 1996-2019, PostgreSQL Global Development Group |
7 | * Portions Copyright (c) 1994, Regents of the University of California |
8 | * |
9 | * src/include/optimizer/geqo_recombination.h |
10 | * |
11 | *------------------------------------------------------------------------- |
12 | */ |
13 | |
14 | /* contributed by: |
15 | =*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*= |
16 | * Martin Utesch * Institute of Automatic Control * |
17 | = = University of Mining and Technology = |
18 | * utesch@aut.tu-freiberg.de * Freiberg, Germany * |
19 | =*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*= |
20 | */ |
21 | |
22 | /* -- parts of this are adapted from D. Whitley's Genitor algorithm -- */ |
23 | |
24 | #ifndef GEQO_RECOMBINATION_H |
25 | #define GEQO_RECOMBINATION_H |
26 | |
27 | #include "optimizer/geqo.h" |
28 | |
29 | |
30 | extern void init_tour(PlannerInfo *root, Gene *tour, int num_gene); |
31 | |
32 | |
33 | /* edge recombination crossover [ERX] */ |
34 | |
35 | typedef struct Edge |
36 | { |
37 | Gene edge_list[4]; /* list of edges */ |
38 | int total_edges; |
39 | int unused_edges; |
40 | } Edge; |
41 | |
42 | extern Edge *alloc_edge_table(PlannerInfo *root, int num_gene); |
43 | extern void free_edge_table(PlannerInfo *root, Edge *edge_table); |
44 | |
45 | extern float gimme_edge_table(PlannerInfo *root, Gene *tour1, Gene *tour2, |
46 | int num_gene, Edge *edge_table); |
47 | |
48 | extern int gimme_tour(PlannerInfo *root, Edge *edge_table, Gene *new_gene, |
49 | int num_gene); |
50 | |
51 | |
52 | /* partially matched crossover [PMX] */ |
53 | |
54 | #define DAD 1 /* indicator for gene from dad */ |
55 | #define MOM 0 /* indicator for gene from mom */ |
56 | |
57 | extern void pmx(PlannerInfo *root, |
58 | Gene *tour1, Gene *tour2, |
59 | Gene *offspring, int num_gene); |
60 | |
61 | |
62 | typedef struct City |
63 | { |
64 | int tour2_position; |
65 | int tour1_position; |
66 | int used; |
67 | int select_list; |
68 | } City; |
69 | |
70 | extern City * alloc_city_table(PlannerInfo *root, int num_gene); |
71 | extern void free_city_table(PlannerInfo *root, City * city_table); |
72 | |
73 | /* cycle crossover [CX] */ |
74 | extern int cx(PlannerInfo *root, Gene *tour1, Gene *tour2, |
75 | Gene *offspring, int num_gene, City * city_table); |
76 | |
77 | /* position crossover [PX] */ |
78 | extern void px(PlannerInfo *root, Gene *tour1, Gene *tour2, Gene *offspring, |
79 | int num_gene, City * city_table); |
80 | |
81 | /* order crossover [OX1] according to Davis */ |
82 | extern void ox1(PlannerInfo *root, Gene *mom, Gene *dad, Gene *offspring, |
83 | int num_gene, City * city_table); |
84 | |
85 | /* order crossover [OX2] according to Syswerda */ |
86 | extern void ox2(PlannerInfo *root, Gene *mom, Gene *dad, Gene *offspring, |
87 | int num_gene, City * city_table); |
88 | |
89 | #endif /* GEQO_RECOMBINATION_H */ |
90 | |