From 71fd8d4a4ba7f1b050a026dfcba1fcdde32bb078 Mon Sep 17 00:00:00 2001 From: "Marc G. Fournier" <scrappy@hub.org> Date: Fri, 14 Mar 1997 16:03:02 +0000 Subject: [PATCH] > There are some minor fixes to the GEQO. > Please apply them to the direcory "backend/optimizer/geqo". > Two new files with different crossover techniques are included. > Standard procedure is optimization by means of "geqo_erx.c" > (Edge Recombination Crossover). From: "Martin S. Utesch" <utesch@aut.tu-freiberg.de> --- src/backend/optimizer/geqo/Makefile | 5 +- src/backend/optimizer/geqo/geqo_main.c | 10 +-- src/backend/optimizer/geqo/geqo_ox1.c | 103 ++++++++++++++++++++++ src/backend/optimizer/geqo/geqo_ox2.c | 113 +++++++++++++++++++++++++ 4 files changed, 223 insertions(+), 8 deletions(-) create mode 100644 src/backend/optimizer/geqo/geqo_ox1.c create mode 100644 src/backend/optimizer/geqo/geqo_ox2.c 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]; + } + +} -- GitLab