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

数据库系统

开发平台:

Unix_Linux

  1. /*-------------------------------------------------------------------------
  2.  *
  3.  * geqo_selection.c
  4.  *   linear selection scheme for the genetic query optimizer
  5.  *
  6.  * Copyright (c) 1994, Regents of the University of California
  7.  *
  8.  * $Id: geqo_selection.c,v 1.7.2.1 1999/08/02 05:57:07 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. /* this is adopted from D. Whitley's Genitor algorithm */
  20. /*************************************************************/
  21. /*  */
  22. /* Copyright (c) 1990  */
  23. /* Darrell L. Whitley  */
  24. /* Computer Science Department  */
  25. /* Colorado State University  */
  26. /*  */
  27. /* Permission is hereby granted to copy all or any part of  */
  28. /* this program for free distribution.   The author's name  */
  29. /* and this copyright notice must be included in any copy.  */
  30. /*  */
  31. /*************************************************************/
  32. #include <math.h>
  33. #include "postgres.h"
  34. #include "optimizer/geqo_copy.h"
  35. #include "optimizer/geqo_random.h"
  36. #include "optimizer/geqo_selection.h"
  37. static int linear(int max, double bias);
  38. /* geqo_selection
  39.  *
  40.  *  according to bias described by input parameters,
  41.  *  second genes are selected from the pool
  42.  */
  43. void
  44. geqo_selection(Chromosome *momma, Chromosome *daddy, Pool *pool, double bias)
  45. {
  46. int first,
  47. second;
  48. first = (int) linear(pool->size, bias);
  49. second = (int) linear(pool->size, bias);
  50. if (pool->size > 1)
  51. {
  52. while (first == second)
  53. second = (int) linear(pool->size, bias);
  54. }
  55. geqo_copy(momma, &pool->data[first], pool->string_length);
  56. geqo_copy(daddy, &pool->data[second], pool->string_length);
  57. }
  58. /* linear
  59.  *   generates random integer between 0 and input max number
  60.  *   using input linear bias
  61.  *
  62.  *   probability distribution function is: f(x) = bias - 2(bias - 1)x
  63.  *  bias = (prob of first rule) / (prob of middle rule)
  64.  *
  65.  */
  66. static int
  67. linear(int pool_size, double bias) /* bias is y-intercept of linear
  68.  * distribution */
  69. {
  70. double index; /* index between 0 and pop_size */
  71. double max = (double) pool_size;
  72. index = max * (bias - sqrt((bias * bias) - 4.0 * (bias - 1.0) * geqo_rand()))
  73. / 2.0 / (bias - 1.0);
  74. return (int) index;
  75. }