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

数据库系统

开发平台:

Unix_Linux

  1. /*------------------------------------------------------------------------
  2. *
  3. * geqo_pmx.c
  4. *
  5. *  partially matched crossover [PMX] routines;
  6. *  PMX operator according to Goldberg & Lingle
  7. *  (Proc Int'l Conf on GA's)
  8. *
  9. * $Id: geqo_pmx.c,v 1.5.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 pmx 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. /* pmx
  37.  *
  38.  *  partially matched crossover
  39.  */
  40. void
  41. pmx(Gene *tour1, Gene *tour2, Gene *offspring, int num_gene)
  42. {
  43. int    *failed = (int *) palloc((num_gene + 1) * sizeof(int));
  44. int    *from = (int *) palloc((num_gene + 1) * sizeof(int));
  45. int    *indx = (int *) palloc((num_gene + 1) * sizeof(int));
  46. int    *check_list = (int *) palloc((num_gene + 1) * sizeof(int));
  47. int left,
  48. right,
  49. temp,
  50. i,
  51. j,
  52. k;
  53. int mx_fail,
  54. found,
  55. mx_hold;
  56. /* no mutation so start up the pmx replacement algorithm */
  57. /* initialize failed[], from[], check_list[] */
  58. for (k = 0; k < num_gene; k++)
  59. {
  60. failed[k] = -1;
  61. from[k] = -1;
  62. check_list[k + 1] = 0;
  63. }
  64. /* locate crossover points */
  65. left = geqo_randint(num_gene - 1, 0);
  66. right = geqo_randint(num_gene - 1, 0);
  67. if (left > right)
  68. {
  69. temp = left;
  70. left = right;
  71. right = temp;
  72. }
  73. /* copy tour2 into offspring */
  74. for (k = 0; k < num_gene; k++)
  75. {
  76. offspring[k] = tour2[k];
  77. from[k] = DAD;
  78. check_list[tour2[k]]++;
  79. }
  80. /* copy tour1 into offspring */
  81. for (k = left; k <= right; k++)
  82. {
  83. check_list[offspring[k]]--;
  84. offspring[k] = tour1[k];
  85. from[k] = MOM;
  86. check_list[tour1[k]]++;
  87. }
  88. /* pmx main part */
  89. mx_fail = 0;
  90. /* STEP 1 */
  91. for (k = left; k <= right; k++)
  92. { /* for all elements in the tour1-2 */
  93. if (tour1[k] == tour2[k])
  94. found = 1; /* find match in tour2 */
  95. else
  96. {
  97. found = 0; /* substitute elements */
  98. j = 0;
  99. while (!(found) && (j < num_gene))
  100. {
  101. if ((offspring[j] == tour1[k]) && (from[j] == DAD))
  102. {
  103. check_list[offspring[j]]--;
  104. offspring[j] = tour2[k];
  105. found = 1;
  106. check_list[tour2[k]]++;
  107. }
  108. j++;
  109. }
  110. }
  111. if (!(found))
  112. { /* failed to replace gene */
  113. failed[mx_fail] = (int) tour1[k];
  114. indx[mx_fail] = k;
  115. mx_fail++;
  116. }
  117. } /* ... for */
  118. /* STEP 2 */
  119. /* see if any genes could not be replaced */
  120. if (mx_fail > 0)
  121. {
  122. mx_hold = mx_fail;
  123. for (k = 0; k < mx_hold; k++)
  124. {
  125. found = 0;
  126. j = 0;
  127. while (!(found) && (j < num_gene))
  128. {
  129. if ((failed[k] == (int) offspring[j]) && (from[j] == DAD))
  130. {
  131. check_list[offspring[j]]--;
  132. offspring[j] = tour2[indx[k]];
  133. check_list[tour2[indx[k]]]++;
  134. found = 1;
  135. failed[k] = -1;
  136. mx_fail--;
  137. }
  138. j++;
  139. }
  140. } /* ... for  */
  141. } /* ... if  */
  142. /* STEP 3 */
  143. for (k = 1; k <= num_gene; k++)
  144. {
  145. if (check_list[k] > 1)
  146. {
  147. i = 0;
  148. while (i < num_gene)
  149. {
  150. if ((offspring[i] == (Gene) k) && (from[i] == DAD))
  151. {
  152. j = 1;
  153. while (j <= num_gene)
  154. {
  155. if (check_list[j] == 0)
  156. {
  157. offspring[i] = (Gene) j;
  158. check_list[k]--;
  159. check_list[j]++;
  160. i = num_gene + 1;
  161. j = i;
  162. }
  163. j++;
  164. }
  165. } /* ... if  */
  166. i++;
  167. } /* end while */
  168. }
  169. } /* ... for  */
  170. pfree(failed);
  171. pfree(from);
  172. pfree(indx);
  173. pfree(check_list);
  174. }