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

数据库系统

开发平台:

Unix_Linux

  1. /*------------------------------------------------------------------------
  2. *
  3. * geqo_recombination.c
  4. *  misc recombination procedures
  5. *
  6. * $Id: geqo_recombination.c,v 1.7.2.1 1999/08/02 05:57:06 scrappy Exp $
  7. *
  8. *-------------------------------------------------------------------------
  9. */
  10. /* contributed by:
  11.    =*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=
  12.    *  Martin Utesch  * Institute of Automatic Control    *
  13.    =  = University of Mining and Technology =
  14.    *  utesch@aut.tu-freiberg.de  * Freiberg, Germany    *
  15.    =*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=
  16.  */
  17. /* -- parts of this are adapted from D. Whitley's Genitor algorithm -- */
  18. #include "postgres.h"
  19. #include "optimizer/geqo_random.h"
  20. #include "optimizer/geqo_recombination.h"
  21. /*
  22.  * init_tour
  23.  *
  24.  *  Randomly generates a legal "traveling salesman" tour
  25.  *  (i.e. where each point is visited only once.)
  26.  *  Essentially, this routine fills an array with all possible
  27.  *  points on the tour and randomly chooses the 'next' city from
  28.  *  this array.  When a city is chosen, the array is shortened
  29.  *  and the procedure repeated.
  30.  *
  31.  */
  32. void
  33. init_tour(Gene *tour, int num_gene)
  34. {
  35. Gene    *tmp;
  36. int remainder;
  37. int next,
  38. i;
  39. tmp = (Gene *) palloc(num_gene * sizeof(Gene));
  40. for (i = 0; i < num_gene; i++)
  41. {
  42. tmp[i] = (Gene) i + 1; /* builds tours "1 - 2 - 3" etc. */
  43. }
  44. remainder = num_gene - 1;
  45. for (i = 0; i < num_gene; i++)
  46. {
  47. next = (int) geqo_randint(remainder, 0); /* choose city between 0
  48.  * and remainder */
  49. tour[i] = tmp[next];
  50. tmp[next] = tmp[remainder];
  51. remainder--;
  52. }
  53. pfree(tmp);
  54. }
  55. /* alloc_city_table
  56.  *
  57.  *  allocate memory for city table
  58.  *
  59.  */
  60. City *
  61. alloc_city_table(int num_gene)
  62. {
  63. City    *city_table;
  64. /*
  65.  * palloc one extra location so that nodes numbered 1..n can be
  66.  * indexed directly; 0 will not be used
  67.  */
  68. city_table = (City *) palloc((num_gene + 1) * sizeof(City));
  69. return city_table;
  70. }
  71. /* free_city_table
  72.  *
  73.  *   deallocate memory of city table
  74.  *
  75.  */
  76. void
  77. free_city_table(City *city_table)
  78. {
  79. pfree(city_table);
  80. }