#include "postgres.h"#include "optimizer/geqo_recombination.h"#include "optimizer/geqo_random.h"
Go to the source code of this file.
Functions | |
| int | cx (PlannerInfo *root, Gene *tour1, Gene *tour2, Gene *offspring, int num_gene, City *city_table) |
| int cx | ( | PlannerInfo * | root, | |
| Gene * | tour1, | |||
| Gene * | tour2, | |||
| Gene * | offspring, | |||
| int | num_gene, | |||
| City * | city_table | |||
| ) |
Definition at line 47 of file geqo_cx.c.
References geqo_randint, i, City::tour1_position, City::tour2_position, and City::used.
Referenced by bf_decrypt(), bf_encrypt(), bf_init(), geqo(), intctx_free(), rj_decrypt(), rj_encrypt(), and rj_init().
{
int i,
start_pos,
curr_pos;
int count = 0;
int num_diffs = 0;
/* initialize city table */
for (i = 1; i <= num_gene; i++)
{
city_table[i].used = 0;
city_table[tour2[i - 1]].tour2_position = i - 1;
city_table[tour1[i - 1]].tour1_position = i - 1;
}
/* choose random cycle starting position */
start_pos = geqo_randint(root, num_gene - 1, 0);
/* child inherits first city */
offspring[start_pos] = tour1[start_pos];
/* begin cycle with tour1 */
curr_pos = start_pos;
city_table[(int) tour1[start_pos]].used = 1;
count++;
/* cx main part */
/* STEP 1 */
while (tour2[curr_pos] != tour1[start_pos])
{
city_table[(int) tour2[curr_pos]].used = 1;
curr_pos = city_table[(int) tour2[curr_pos]].tour1_position;
offspring[curr_pos] = tour1[curr_pos];
count++;
}
/* STEP 2 */
/* failed to create a complete tour */
if (count < num_gene)
{
for (i = 1; i <= num_gene; i++)
{
if (!city_table[i].used)
{
offspring[city_table[i].tour2_position] =
tour2[(int) city_table[i].tour2_position];
count++;
}
}
}
/* STEP 3 */
/* still failed to create a complete tour */
if (count < num_gene)
{
/* count the number of differences between mom and offspring */
for (i = 0; i < num_gene; i++)
if (tour1[i] != offspring[i])
num_diffs++;
}
return num_diffs;
}
1.7.1