diff --git a/src/backend/optimizer/geqo/Makefile b/src/backend/optimizer/geqo/Makefile index d90b8176a5..fac006c6db 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 ae05b33884..4b45000288 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 0000000000..329554f9aa --- /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 0000000000..2afcece01f --- /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