PostgreSQL Source Code git master
All Data Structures Namespaces Files Functions Variables Typedefs Enumerations Enumerator Macros Pages
geqo_px.c
Go to the documentation of this file.
1/*------------------------------------------------------------------------
2*
3* geqo_px.c
4*
5* position crossover [PX] routines;
6* PX operator according to Syswerda
7* (The Genetic Algorithms Handbook, L Davis, ed)
8*
9* src/backend/optimizer/geqo/geqo_px.c
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/* the px algorithm is adopted from Genitor : */
23/*************************************************************/
24/* */
25/* Copyright (c) 1990 */
26/* Darrell L. Whitley */
27/* Computer Science Department */
28/* Colorado State University */
29/* */
30/* Permission is hereby granted to copy all or any part of */
31/* this program for free distribution. The author's name */
32/* and this copyright notice must be included in any copy. */
33/* */
34/*************************************************************/
35
36#include "postgres.h"
37#include "optimizer/geqo.h"
38
39#if defined(PX)
40
43
44/* px
45 *
46 * position crossover
47 */
48void
49px(PlannerInfo *root, Gene *tour1, Gene *tour2, Gene *offspring, int num_gene,
50 City * city_table)
51{
52 int num_positions;
53 int i,
54 pos,
55 tour2_index,
56 offspring_index;
57
58 /* initialize city table */
59 for (i = 1; i <= num_gene; i++)
60 city_table[i].used = 0;
61
62 /* choose random positions that will be inherited directly from parent */
63 num_positions = geqo_randint(root, 2 * num_gene / 3, num_gene / 3);
64
65 /* choose random position */
66 for (i = 0; i < num_positions; i++)
67 {
68 pos = geqo_randint(root, num_gene - 1, 0);
69
70 offspring[pos] = tour1[pos]; /* transfer cities to child */
71 city_table[(int) tour1[pos]].used = 1; /* mark city used */
72 }
73
74 tour2_index = 0;
75 offspring_index = 0;
76
77
78 /* px main part */
79
80 while (offspring_index < num_gene)
81 {
82
83 /* next position in offspring filled */
84 if (!city_table[(int) tour1[offspring_index]].used)
85 {
86
87 /* next city in tour1 not used */
88 if (!city_table[(int) tour2[tour2_index]].used)
89 {
90
91 /* inherit from tour1 */
92 offspring[offspring_index] = tour2[tour2_index];
93
94 tour2_index++;
95 offspring_index++;
96 }
97 else
98 { /* next city in tour2 has been used */
99 tour2_index++;
100 }
101 }
102 else
103 { /* next position in offspring is filled */
104 offspring_index++;
105 }
106 }
107}
108
109#endif /* defined(PX) */
int Gene
Definition: geqo_gene.h:30
int geqo_randint(PlannerInfo *root, int upper, int lower)
Definition: geqo_random.c:36
void px(PlannerInfo *root, Gene *tour1, Gene *tour2, Gene *offspring, int num_gene, City *city_table)
int i
Definition: isn.c:77
tree ctl root
Definition: radixtree.h:1857