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

数据库系统

开发平台:

Unix_Linux

  1. /*------------------------------------------------------------------------
  2. *
  3. * geqo_px.c
  4. *
  5. *  position crossover [PX] routines;
  6. *  PX operator according to Syswerda
  7. *  (The Genetic Algorithms Handbook, L Davis, ed)
  8. *
  9. * $Id: geqo_px.c,v 1.6.2.1 1999/08/02 05:57:06 scrappy Exp $
  10. *
  11. *-------------------------------------------------------------------------
  12. */
  13. /* contributed by:
  14.    =*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=
  15.    *  Martin Utesch  * Institute of Automatic Control    *
  16.    =  = University of Mining and Technology =
  17.    *  utesch@aut.tu-freiberg.de  * Freiberg, Germany    *
  18.    =*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=
  19.  */
  20. /* the px algorithm is adopted from Genitor : */
  21. /*************************************************************/
  22. /*  */
  23. /* Copyright (c) 1990  */
  24. /* Darrell L. Whitley  */
  25. /* Computer Science Department  */
  26. /* Colorado State University  */
  27. /*  */
  28. /* Permission is hereby granted to copy all or any part of  */
  29. /* this program for free distribution.   The author's name  */
  30. /* and this copyright notice must be included in any copy.  */
  31. /*  */
  32. /*************************************************************/
  33. #include "postgres.h"
  34. #include "optimizer/geqo_random.h"
  35. #include "optimizer/geqo_recombination.h"
  36. /* px
  37.  *
  38.  *  position crossover
  39.  */
  40. void
  41. px(Gene *tour1, Gene *tour2, Gene *offspring, int num_gene, City *city_table)
  42. {
  43. int num_positions;
  44. int i,
  45. pos,
  46. tour2_index,
  47. offspring_index;
  48. /* initialize city table */
  49. for (i = 1; i <= num_gene; i++)
  50. city_table[i].used = 0;
  51. /* choose random positions that will be inherited directly from parent */
  52. num_positions = geqo_randint(2 * num_gene / 3, num_gene / 3);
  53. /* choose random position */
  54. for (i = 0; i < num_positions; i++)
  55. {
  56. pos = geqo_randint(num_gene - 1, 0);
  57. offspring[pos] = tour1[pos]; /* transfer cities to child */
  58. city_table[(int) tour1[pos]].used = 1; /* mark city used */
  59. }
  60. tour2_index = 0;
  61. offspring_index = 0;
  62. /* px main part */
  63. while (offspring_index < num_gene)
  64. {
  65. /* next position in offspring filled */
  66. if (!city_table[(int) tour1[offspring_index]].used)
  67. {
  68. /* next city in tour1 not used */
  69. if (!city_table[(int) tour2[tour2_index]].used)
  70. {
  71. /* inherit from tour1 */
  72. offspring[offspring_index] = tour2[tour2_index];
  73. tour2_index++;
  74. offspring_index++;
  75. }
  76. else
  77. { /* next city in tour2 has been used */
  78. tour2_index++;
  79. }
  80. }
  81. else
  82. { /* next position in offspring is filled */
  83. offspring_index++;
  84. }
  85. }
  86. }