geqo_pool.c
上传用户:blenddy
上传日期:2007-01-07
资源大小:6495k
文件大小:5k
源码类别:

数据库系统

开发平台:

Unix_Linux

  1. /*------------------------------------------------------------------------
  2.  *
  3.  * geqo_pool.c
  4.  *   Genetic Algorithm (GA) pool stuff
  5.  *
  6.  * Copyright (c) 1994, Regents of the University of California
  7.  *
  8.  * $Id: geqo_pool.c,v 1.12.2.1 1999/08/02 05:57:06 scrappy Exp $
  9.  *
  10.  *-------------------------------------------------------------------------
  11.  */
  12. /* contributed by:
  13.    =*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=
  14.    *  Martin Utesch  * Institute of Automatic Control    *
  15.    =  = University of Mining and Technology =
  16.    *  utesch@aut.tu-freiberg.de  * Freiberg, Germany    *
  17.    =*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=
  18.  */
  19. /* -- parts of this are adapted from D. Whitley's Genitor algorithm -- */
  20. #include "postgres.h"
  21. #include "optimizer/geqo.h"
  22. #include "optimizer/geqo_copy.h"
  23. #include "optimizer/geqo_pool.h"
  24. #include "optimizer/geqo_recombination.h"
  25. static int compare(const void *arg1, const void *arg2);
  26. /*
  27.  * alloc_pool
  28.  * allocates memory for GA pool
  29.  */
  30. Pool *
  31. alloc_pool(int pool_size, int string_length)
  32. {
  33. Pool    *new_pool;
  34. Chromosome *chromo;
  35. int i;
  36. /* pool */
  37. new_pool = (Pool *) palloc(sizeof(Pool));
  38. new_pool->size = (int) pool_size;
  39. new_pool->string_length = (int) string_length;
  40. /* all chromosome */
  41. new_pool->data = (Chromosome *) palloc(pool_size * sizeof(Chromosome));
  42. /* all gene */
  43. chromo = (Chromosome *) new_pool->data; /* vector of all chromos */
  44. for (i = 0; i < pool_size; i++)
  45. chromo[i].string = palloc((string_length + 1) * sizeof(Gene));
  46. return new_pool;
  47. }
  48. /*
  49.  * free_pool
  50.  * deallocates memory for GA pool
  51.  */
  52. void
  53. free_pool(Pool *pool)
  54. {
  55. Chromosome *chromo;
  56. int i;
  57. /* all gene */
  58. chromo = (Chromosome *) pool->data; /* vector of all chromos */
  59. for (i = 0; i < pool->size; i++)
  60. pfree(chromo[i].string);
  61. /* all chromosome */
  62. pfree(pool->data);
  63. /* pool */
  64. pfree(pool);
  65. }
  66. /*
  67.  * random_init_pool
  68.  * initialize genetic pool
  69.  */
  70. void
  71. random_init_pool(Query *root, Pool *pool, int strt, int stp)
  72. {
  73. Chromosome *chromo = (Chromosome *) pool->data;
  74. int i;
  75. for (i = strt; i < stp; i++)
  76. {
  77. init_tour(chromo[i].string, pool->string_length); /* from
  78.  * "geqo_recombination.c"
  79.  * */
  80. pool->data[i].worth = geqo_eval(root, chromo[i].string, pool->string_length); /* "from geqo_eval.c" */
  81. }
  82. }
  83. /*
  84.  * sort_pool
  85.  *  sorts input pool according to worth, from smallest to largest
  86.  *
  87.  *  maybe you have to change compare() for different ordering ...
  88.  */
  89. void
  90. sort_pool(Pool *pool)
  91. {
  92. qsort(pool->data, pool->size, sizeof(Chromosome), compare);
  93. }
  94. /*
  95.  * compare
  96.  *  static input function for pg_sort
  97.  *
  98.  *  return values for sort from smallest to largest are prooved!
  99.  *  don't change them!
  100.  */
  101. static int
  102. compare(const void *arg1, const void *arg2)
  103. {
  104. Chromosome chromo1 = *(Chromosome *) arg1;
  105. Chromosome chromo2 = *(Chromosome *) arg2;
  106. if (chromo1.worth == chromo2.worth)
  107. return 0;
  108. else if (chromo1.worth > chromo2.worth)
  109. return 1;
  110. else
  111. return -1;
  112. }
  113. /* alloc_chromo
  114.  *   allocates a chromosome and string space
  115.  */
  116. Chromosome *
  117. alloc_chromo(int string_length)
  118. {
  119. Chromosome *chromo;
  120. chromo = (Chromosome *) palloc(sizeof(Chromosome));
  121. chromo->string = (Gene *) palloc((string_length + 1) * sizeof(Gene));
  122. return chromo;
  123. }
  124. /* free_chromo
  125.  *   deallocates a chromosome and string space
  126.  */
  127. void
  128. free_chromo(Chromosome *chromo)
  129. {
  130. pfree(chromo->string);
  131. pfree(chromo);
  132. }
  133. /* spread_chromo
  134.  *  inserts a new chromosome into the pool, displacing worst gene in pool
  135.  *  assumes best->worst = smallest->largest
  136.  */
  137. void
  138. spread_chromo(Chromosome *chromo, Pool *pool)
  139. {
  140. int top,
  141. mid,
  142. bot;
  143. int i,
  144. index;
  145. Chromosome swap_chromo,
  146. tmp_chromo;
  147. /* new chromo is so bad we can't use it */
  148. if (chromo->worth > pool->data[pool->size - 1].worth)
  149. return;
  150. /* do a binary search to find the index of the new chromo */
  151. top = 0;
  152. mid = pool->size / 2;
  153. bot = pool->size - 1;
  154. index = -1;
  155. while (index == -1)
  156. {
  157. /* these 4 cases find a new location */
  158. if (chromo->worth <= pool->data[top].worth)
  159. index = top;
  160. else if (chromo->worth == pool->data[mid].worth)
  161. index = mid;
  162. else if (chromo->worth == pool->data[bot].worth)
  163. index = bot;
  164. else if (bot - top <= 1)
  165. index = bot;
  166. /*
  167.  * these 2 cases move the search indices since a new location has
  168.  * not yet been found.
  169.  */
  170. else if (chromo->worth < pool->data[mid].worth)
  171. {
  172. bot = mid;
  173. mid = top + ((bot - top) / 2);
  174. }
  175. else
  176. { /* (chromo->worth > pool->data[mid].worth) */
  177. top = mid;
  178. mid = top + ((bot - top) / 2);
  179. }
  180. } /* ... while */
  181. /* now we have index for chromo */
  182. /*
  183.  * move every gene from index on down one position to make room for
  184.  * chromo
  185.  */
  186. /*
  187.  * copy new gene into pool storage; always replace worst gene in pool
  188.  */
  189. geqo_copy(&pool->data[pool->size - 1], chromo, pool->string_length);
  190. swap_chromo.string = pool->data[pool->size - 1].string;
  191. swap_chromo.worth = pool->data[pool->size - 1].worth;
  192. for (i = index; i < pool->size; i++)
  193. {
  194. tmp_chromo.string = pool->data[i].string;
  195. tmp_chromo.worth = pool->data[i].worth;
  196. pool->data[i].string = swap_chromo.string;
  197. pool->data[i].worth = swap_chromo.worth;
  198. swap_chromo.string = tmp_chromo.string;
  199. swap_chromo.worth = tmp_chromo.worth;
  200. }
  201. }