aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/backend/optimizer/geqo/Makefile5
-rw-r--r--src/backend/optimizer/geqo/geqo_main.c10
-rw-r--r--src/backend/optimizer/geqo/geqo_ox1.c103
-rw-r--r--src/backend/optimizer/geqo/geqo_ox2.c113
4 files changed, 223 insertions, 8 deletions
diff --git a/src/backend/optimizer/geqo/Makefile b/src/backend/optimizer/geqo/Makefile
index d90b8176a50..fac006c6db3 100644
--- a/src/backend/optimizer/geqo/Makefile
+++ b/src/backend/optimizer/geqo/Makefile
@@ -5,7 +5,7 @@
#
# Copyright (c) 1994, Regents of the University of California
#
-# $Id: Makefile,v 1.2 1997/02/19 14:51:55 scrappy Exp $
+# $Id: Makefile,v 1.3 1997/03/14 16:02:40 scrappy Exp $
#
#-------------------------------------------------------------------------
@@ -21,9 +21,8 @@ CFLAGS+=$(INCLUDE_OPT) -Wno-error
OBJS = geqo_copy.o geqo_eval.o geqo_main.o geqo_misc.o \
geqo_params.o geqo_paths.o geqo_pool.o geqo_recombination.o \
geqo_selection.o \
- geqo_erx.o geqo_pmx.o geqo_cx.o geqo_px.o
+ geqo_erx.o geqo_pmx.o geqo_cx.o geqo_px.o geqo_ox1.o geqo_ox2.o
-# not ready yet: geqo_ox1.o geqo_ox2.o
# deprecated: minspantree.o
all: SUBSYS.o
diff --git a/src/backend/optimizer/geqo/geqo_main.c b/src/backend/optimizer/geqo/geqo_main.c
index ae05b33884e..4b450002885 100644
--- a/src/backend/optimizer/geqo/geqo_main.c
+++ b/src/backend/optimizer/geqo/geqo_main.c
@@ -6,7 +6,7 @@
*
* Copyright (c) 1994, Regents of the University of California
*
- * $Id: geqo_main.c,v 1.2 1997/02/19 14:51:59 scrappy Exp $
+ * $Id: geqo_main.c,v 1.3 1997/03/14 16:02:51 scrappy Exp $
*
*-------------------------------------------------------------------------
*/
@@ -71,22 +71,22 @@ geqo(Query *root)
Chromosome *daddy;
Chromosome *kid;
+#if defined(ERX)
Edge *edge_table; /* list of edges */
int edge_failures=0;
float difference;
+#endif
-#if defined(CX) || defined(PX) || defined(QX1) || defined(QX2)
+#if defined(CX) || defined(PX) || defined(OX1) || defined(OX2)
City *city_table; /* list of cities */
#endif
#if defined(CX)
int cycle_diffs=0;
-#endif
-
-#if defined(CX) && defined(GEQO_DEBUG)
int mutations=0;
#endif
+
int number_of_rels;
Pool *pool;
diff --git a/src/backend/optimizer/geqo/geqo_ox1.c b/src/backend/optimizer/geqo/geqo_ox1.c
new file mode 100644
index 00000000000..329554f9aae
--- /dev/null
+++ b/src/backend/optimizer/geqo/geqo_ox1.c
@@ -0,0 +1,103 @@
+/*------------------------------------------------------------------------
+*
+* geqo_ox1.c--
+*
+* order crossover [OX] routines;
+* OX1 operator according to Davis
+* (Proc Int'l Joint Conf on AI)
+*
+* $Id: geqo_ox1.c,v 1.1 1997/03/14 16:02:58 scrappy Exp $
+*
+*-------------------------------------------------------------------------
+*/
+
+/* contributed by:
+ =*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=
+ * Martin Utesch * Institute of Automatic Control *
+ = = University of Mining and Technology =
+ * utesch@aut.tu-freiberg.de * Freiberg, Germany *
+ =*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=
+ */
+
+/* the ox algorithm is adopted from Genitor : */
+/*************************************************************/
+/* */
+/* Copyright (c) 1990 */
+/* Darrell L. Whitley */
+/* Computer Science Department */
+/* Colorado State University */
+/* */
+/* Permission is hereby granted to copy all or any part of */
+/* this program for free distribution. The author's name */
+/* and this copyright notice must be included in any copy. */
+/* */
+/*************************************************************/
+
+#include "postgres.h"
+
+#include "nodes/pg_list.h"
+#include "nodes/relation.h"
+#include "nodes/primnodes.h"
+
+#include "utils/palloc.h"
+#include "utils/elog.h"
+
+#include "optimizer/internal.h"
+#include "optimizer/paths.h"
+#include "optimizer/pathnode.h"
+#include "optimizer/clauses.h"
+#include "optimizer/cost.h"
+
+#include "optimizer/geqo_gene.h"
+#include "optimizer/geqo.h"
+#include "optimizer/geqo_recombination.h"
+#include "optimizer/geqo_random.h"
+
+
+/* ox1--
+ *
+ * position crossover
+ */
+void
+ox1(Gene *tour1, Gene *tour2, Gene *offspring, int num_gene, City *city_table)
+{
+ int left, right, k, p, temp;
+
+ /* initialize city table */
+ for (k = 1; k <= num_gene; k++)
+ city_table[k].used = 0;
+
+ /* select portion to copy from tour1 */
+ left = geqo_randint (num_gene - 1, 0);
+ right = geqo_randint (num_gene - 1, 0);
+
+ if (left > right)
+ {
+ temp = left;
+ left = right;
+ right = temp;
+ }
+
+ /* copy portion from tour1 to offspring */
+ for (k = left; k <= right; k++)
+ {
+ offspring[k] = tour1[k];
+ city_table[(int) tour1[k]].used = 1;
+ }
+
+ k = (right + 1) % num_gene; /* index into offspring */
+ p = k; /* index into tour2 */
+
+ /* copy stuff from tour2 to offspring */
+ while (k != left)
+ {
+ if (!city_table[(int) tour2[p]].used)
+ {
+ offspring[k] = tour2[p];
+ k = (k + 1) % num_gene;
+ city_table[(int) tour2[p]].used = 1;
+ }
+ p = (p + 1) % num_gene; /* increment tour2-index */
+ }
+
+ }
diff --git a/src/backend/optimizer/geqo/geqo_ox2.c b/src/backend/optimizer/geqo/geqo_ox2.c
new file mode 100644
index 00000000000..2afcece01ff
--- /dev/null
+++ b/src/backend/optimizer/geqo/geqo_ox2.c
@@ -0,0 +1,113 @@
+/*------------------------------------------------------------------------
+*
+* geqo_ox2.c--
+*
+* order crossover [OX] routines;
+* OX2 operator according to Syswerda
+* (The Genetic Algorithms Handbook, ed L Davis)
+*
+* $Id: geqo_ox2.c,v 1.1 1997/03/14 16:03:02 scrappy Exp $
+*
+*-------------------------------------------------------------------------
+*/
+
+/* contributed by:
+ =*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=
+ * Martin Utesch * Institute of Automatic Control *
+ = = University of Mining and Technology =
+ * utesch@aut.tu-freiberg.de * Freiberg, Germany *
+ =*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=
+ */
+
+/* the ox algorithm is adopted from Genitor : */
+/*************************************************************/
+/* */
+/* Copyright (c) 1990 */
+/* Darrell L. Whitley */
+/* Computer Science Department */
+/* Colorado State University */
+/* */
+/* Permission is hereby granted to copy all or any part of */
+/* this program for free distribution. The author's name */
+/* and this copyright notice must be included in any copy. */
+/* */
+/*************************************************************/
+
+#include "postgres.h"
+
+#include "nodes/pg_list.h"
+#include "nodes/relation.h"
+#include "nodes/primnodes.h"
+
+#include "utils/palloc.h"
+#include "utils/elog.h"
+
+#include "optimizer/internal.h"
+#include "optimizer/paths.h"
+#include "optimizer/pathnode.h"
+#include "optimizer/clauses.h"
+#include "optimizer/cost.h"
+
+#include "optimizer/geqo_gene.h"
+#include "optimizer/geqo.h"
+#include "optimizer/geqo_recombination.h"
+#include "optimizer/geqo_random.h"
+
+
+/* ox2--
+ *
+ * position crossover
+ */
+void
+ox2(Gene *tour1, Gene *tour2, Gene *offspring, int num_gene, City *city_table)
+{
+ int k, j, count, pos, select, num_positions;
+
+ /* initialize city table */
+ for (k = 1; k <= num_gene; k++) {
+ city_table[k].used = 0;
+ city_table[k-1].select_list = -1;
+ }
+
+ /* determine the number of positions to be inherited from tour1 */
+ num_positions = geqo_randint (2*num_gene/3, num_gene/3);
+
+ /* make a list of selected cities */
+ for (k=0; k<num_positions; k++) {
+ pos = geqo_randint (num_gene - 1, 0);
+ city_table[pos].select_list = (int) tour1[pos];
+ city_table[(int) tour1[pos]].used = 1; /* mark used */
+ }
+
+
+ count = 0;
+ k = 0;
+
+ /* consolidate the select list to adjacent positions */
+ while (count < num_positions) {
+ if (city_table[k].select_list == -1) {
+ j = k + 1;
+ while ((city_table[j].select_list == -1) && (j < num_gene))
+ j++;
+
+ city_table[k].select_list = city_table[j].select_list;
+ city_table[j].select_list = -1;
+ count ++;
+ }
+ else
+ count ++;
+ k++;
+ }
+
+ select = 0;
+
+ for (k=0; k<num_gene; k++) {
+ if (city_table[(int) tour2[k]].used) {
+ offspring[k] = (Gene) city_table[select].select_list;
+ select ++; /* next city in the select list */
+ }
+ else /* city isn't used yet, so inherit from tour2 */
+ offspring[k] = tour2[k];
+ }
+
+}