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

数据库系统

开发平台:

Unix_Linux

  1. /*------------------------------------------------------------------------
  2. *
  3. * geqo_ox1.c
  4. *
  5. *  order crossover [OX] routines;
  6. *  OX1 operator according to Davis
  7. *  (Proc Int'l Joint Conf on AI)
  8. *
  9. * $Id: geqo_ox1.c,v 1.5.2.1 1999/08/02 05:57:05 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 ox 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. /* ox1
  37.  *
  38.  *  position crossover
  39.  */
  40. void
  41. ox1(Gene *tour1, Gene *tour2, Gene *offspring, int num_gene, City *city_table)
  42. {
  43. int left,
  44. right,
  45. k,
  46. p,
  47. temp;
  48. /* initialize city table */
  49. for (k = 1; k <= num_gene; k++)
  50. city_table[k].used = 0;
  51. /* select portion to copy from tour1 */
  52. left = geqo_randint(num_gene - 1, 0);
  53. right = geqo_randint(num_gene - 1, 0);
  54. if (left > right)
  55. {
  56. temp = left;
  57. left = right;
  58. right = temp;
  59. }
  60. /* copy portion from tour1 to offspring */
  61. for (k = left; k <= right; k++)
  62. {
  63. offspring[k] = tour1[k];
  64. city_table[(int) tour1[k]].used = 1;
  65. }
  66. k = (right + 1) % num_gene; /* index into offspring */
  67. p = k; /* index into tour2 */
  68. /* copy stuff from tour2 to offspring */
  69. while (k != left)
  70. {
  71. if (!city_table[(int) tour2[p]].used)
  72. {
  73. offspring[k] = tour2[p];
  74. k = (k + 1) % num_gene;
  75. city_table[(int) tour2[p]].used = 1;
  76. }
  77. p = (p + 1) % num_gene; /* increment tour2-index */
  78. }
  79. }