PostgreSQL Source Code git master
Loading...
Searching...
No Matches
geqo_recombination.h File Reference
#include "optimizer/geqo.h"
Include dependency graph for geqo_recombination.h:
This graph shows which files directly or indirectly include this file:

Go to the source code of this file.

Data Structures

struct  Edge
 
struct  City
 

Macros

#define DAD   1 /* indicator for gene from dad */
 
#define MOM   0 /* indicator for gene from mom */
 

Typedefs

typedef struct Edge Edge
 
typedef struct City City
 

Functions

void init_tour (PlannerInfo *root, Gene *tour, int num_gene)
 
Edgealloc_edge_table (PlannerInfo *root, int num_gene)
 
void free_edge_table (PlannerInfo *root, Edge *edge_table)
 
float gimme_edge_table (PlannerInfo *root, Gene *tour1, Gene *tour2, int num_gene, Edge *edge_table)
 
int gimme_tour (PlannerInfo *root, Edge *edge_table, Gene *new_gene, int num_gene)
 
void pmx (PlannerInfo *root, Gene *tour1, Gene *tour2, Gene *offspring, int num_gene)
 
Cityalloc_city_table (PlannerInfo *root, int num_gene)
 
void free_city_table (PlannerInfo *root, City *city_table)
 
int cx (PlannerInfo *root, Gene *tour1, Gene *tour2, 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 ox1 (PlannerInfo *root, Gene *tour1, Gene *tour2, Gene *offspring, int num_gene, City *city_table)
 
void ox2 (PlannerInfo *root, Gene *tour1, Gene *tour2, Gene *offspring, int num_gene, City *city_table)
 

Macro Definition Documentation

◆ DAD

#define DAD   1 /* indicator for gene from dad */

Definition at line 55 of file geqo_recombination.h.

◆ MOM

#define MOM   0 /* indicator for gene from mom */

Definition at line 56 of file geqo_recombination.h.

Typedef Documentation

◆ City

typedef struct City City

◆ Edge

typedef struct Edge Edge

Function Documentation

◆ alloc_city_table()

City * alloc_city_table ( PlannerInfo root,
int  num_gene 
)
extern

Referenced by geqo().

◆ alloc_edge_table()

Edge * alloc_edge_table ( PlannerInfo root,
int  num_gene 
)
extern

Definition at line 58 of file geqo_erx.c.

59{
61
62 /*
63 * palloc one extra location so that nodes numbered 1..n can be indexed
64 * directly; 0 will not be used
65 */
66
68
69 return edge_table;
70}
#define palloc_array(type, count)
Definition fe_memutils.h:91
static int fb(int x)

References fb(), and palloc_array.

Referenced by geqo().

◆ cx()

int cx ( PlannerInfo root,
Gene tour1,
Gene tour2,
Gene offspring,
int  num_gene,
City city_table 
)
extern

◆ free_city_table()

void free_city_table ( PlannerInfo root,
City city_table 
)
extern

Referenced by geqo().

◆ free_edge_table()

void free_edge_table ( PlannerInfo root,
Edge edge_table 
)
extern

Definition at line 79 of file geqo_erx.c.

80{
82}
void pfree(void *pointer)
Definition mcxt.c:1619

References fb(), and pfree().

Referenced by geqo().

◆ gimme_edge_table()

float gimme_edge_table ( PlannerInfo root,
Gene tour1,
Gene tour2,
int  num_gene,
Edge edge_table 
)
extern

Definition at line 99 of file geqo_erx.c.

101{
102 int i,
103 index1,
104 index2;
105 int edge_total; /* total number of unique edges in two genes */
106
107 /* at first clear the edge table's old data */
108 for (i = 1; i <= num_gene; i++)
109 {
110 edge_table[i].total_edges = 0;
111 edge_table[i].unused_edges = 0;
112 }
113
114 /* fill edge table with new data */
115
116 edge_total = 0;
117
118 for (index1 = 0; index1 < num_gene; index1++)
119 {
120 /*
121 * presume the tour is circular, i.e. 1->2, 2->3, 3->1 this operation
122 * maps n back to 1
123 */
124
125 index2 = (index1 + 1) % num_gene;
126
127 /*
128 * edges are bidirectional, i.e. 1->2 is same as 2->1 call gimme_edge
129 * twice per edge
130 */
131
132 edge_total += gimme_edge(root, tour1[index1], tour1[index2], edge_table);
133 gimme_edge(root, tour1[index2], tour1[index1], edge_table);
134
135 edge_total += gimme_edge(root, tour2[index1], tour2[index2], edge_table);
136 gimme_edge(root, tour2[index2], tour2[index1], edge_table);
137 }
138
139 /* return average number of edges per index */
140 return ((float) (edge_total * 2) / (float) num_gene);
141}
static int gimme_edge(PlannerInfo *root, Gene gene1, Gene gene2, Edge *edge_table)
Definition geqo_erx.c:159
int i
Definition isn.c:77
tree ctl root
Definition radixtree.h:1857

References fb(), gimme_edge(), i, and root.

Referenced by geqo().

◆ gimme_tour()

int gimme_tour ( PlannerInfo root,
Edge edge_table,
Gene new_gene,
int  num_gene 
)
extern

Definition at line 202 of file geqo_erx.c.

203{
204 int i;
205 int edge_failures = 0;
206
207 /* choose int between 1 and num_gene */
209
210 for (i = 1; i < num_gene; i++)
211 {
212 /*
213 * as each point is entered into the tour, remove it from the edge
214 * table
215 */
216
218
219 /* find destination for the newly entered point */
220
221 if (edge_table[new_gene[i - 1]].unused_edges > 0)
223
224 else
225 { /* cope with fault */
227
229 }
230
231 /* mark this node as incorporated */
232 edge_table[(int) new_gene[i - 1]].unused_edges = -1;
233 } /* for (i=1; i<num_gene; i++) */
234
235 return edge_failures;
236}
static Gene gimme_gene(PlannerInfo *root, Edge edge, Edge *edge_table)
Definition geqo_erx.c:290
static Gene edge_failure(PlannerInfo *root, Gene *gene, int index, Edge *edge_table, int num_gene)
Definition geqo_erx.c:381
static void remove_gene(PlannerInfo *root, Gene gene, Edge edge, Edge *edge_table)
Definition geqo_erx.c:247
int Gene
Definition geqo_gene.h:33
int geqo_randint(PlannerInfo *root, int upper, int lower)
Definition geqo_random.c:35

References edge_failure(), fb(), geqo_randint(), gimme_gene(), i, remove_gene(), and root.

Referenced by geqo().

◆ init_tour()

void init_tour ( PlannerInfo root,
Gene tour,
int  num_gene 
)
extern

Definition at line 35 of file geqo_recombination.c.

36{
37 int i,
38 j;
39
40 /*
41 * We must fill the tour[] array with a random permutation of the numbers
42 * 1 .. num_gene. We can do that in one pass using the "inside-out"
43 * variant of the Fisher-Yates shuffle algorithm. Notionally, we append
44 * each new value to the array and then swap it with a randomly-chosen
45 * array element (possibly including itself, else we fail to generate
46 * permutations with the last city last). The swap step can be optimized
47 * by combining it with the insertion.
48 */
49 if (num_gene > 0)
50 tour[0] = (Gene) 1;
51
52 for (i = 1; i < num_gene; i++)
53 {
54 j = geqo_randint(root, i, 0);
55 /* i != j check avoids fetching uninitialized array element */
56 if (i != j)
57 tour[i] = tour[j];
58 tour[j] = (Gene) (i + 1);
59 }
60}
int j
Definition isn.c:78

References fb(), geqo_randint(), i, j, and root.

Referenced by random_init_pool().

◆ ox1()

void ox1 ( PlannerInfo root,
Gene tour1,
Gene tour2,
Gene offspring,
int  num_gene,
City city_table 
)
extern

Referenced by geqo().

◆ ox2()

void ox2 ( PlannerInfo root,
Gene tour1,
Gene tour2,
Gene offspring,
int  num_gene,
City city_table 
)
extern

Referenced by geqo().

◆ pmx()

void pmx ( PlannerInfo root,
Gene tour1,
Gene tour2,
Gene offspring,
int  num_gene 
)
extern

Referenced by geqo().

◆ px()

void px ( PlannerInfo root,
Gene tour1,
Gene tour2,
Gene offspring,
int  num_gene,
City city_table 
)
extern