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

数据库系统

开发平台:

Unix_Linux

  1. /*------------------------------------------------------------------------
  2. *
  3. * geqo_cx.c
  4. *
  5. *  cycle crossover [CX] routines;
  6. *  CX operator according to Oliver et al
  7. *  (Proc 2nd Int'l Conf on GA's)
  8. *
  9. * $Id: geqo_cx.c,v 1.6.2.1 1999/08/02 05:57:04 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 cx 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_recombination.h"
  35. #include "optimizer/geqo_random.h"
  36. /* cx
  37.  *
  38.  *  cycle crossover
  39.  */
  40. int
  41. cx(Gene *tour1, Gene *tour2, Gene *offspring, int num_gene, City *city_table)
  42. {
  43. int i,
  44. start_pos,
  45. curr_pos;
  46. int count = 0;
  47. int num_diffs = 0;
  48. /* initialize city table */
  49. for (i = 1; i <= num_gene; i++)
  50. {
  51. city_table[i].used = 0;
  52. city_table[tour2[i - 1]].tour2_position = i - 1;
  53. city_table[tour1[i - 1]].tour1_position = i - 1;
  54. }
  55. /* choose random cycle starting position */
  56. start_pos = geqo_randint(num_gene - 1, 0);
  57. /* child inherits first city  */
  58. offspring[start_pos] = tour1[start_pos];
  59. /* begin cycle with tour1 */
  60. curr_pos = start_pos;
  61. city_table[(int) tour1[start_pos]].used = 1;
  62. count++;
  63. /* cx main part */
  64. /* STEP 1 */
  65. while (tour2[curr_pos] != tour1[start_pos])
  66. {
  67. city_table[(int) tour2[curr_pos]].used = 1;
  68. curr_pos = city_table[(int) tour2[curr_pos]].tour1_position;
  69. offspring[curr_pos] = tour1[curr_pos];
  70. count++;
  71. }
  72. /* STEP 2 */
  73. /* failed to create a complete tour */
  74. if (count < num_gene)
  75. {
  76. for (i = 1; i <= num_gene; i++)
  77. {
  78. if (!city_table[i].used)
  79. {
  80. offspring[city_table[i].tour2_position] =
  81. tour2[(int) city_table[i].tour2_position];
  82. count++;
  83. }
  84. }
  85. }
  86. /* STEP 3 */
  87. /* still failed to create a complete tour */
  88. if (count < num_gene)
  89. {
  90. /* count the number of differences between mom and offspring */
  91. for (i = 0; i < num_gene; i++)
  92. if (tour1[i] != offspring[i])
  93. num_diffs++;
  94. }
  95. return num_diffs;
  96. }