📄 tournament_selection.c
字号:
# include <stdio.h>
# include <math.h>
# include "malloc.h"
# include "global.h"
// # include "rand.c"
# include "crossover.c"
// # include "check_dominance.c"
// 选择
void selection (population *old_pop, population *new_pop)
{
int *a1, *a2;
int temp;
int i;
int rand;
individual *parent1, *parent2;
a1 = (int *)malloc(POPSIZE*sizeof(int));
a2 = (int *)malloc(POPSIZE*sizeof(int));
for (i=0; i<POPSIZE; i++)
{
a1[i] = a2[i] = i;
}
for (i=0; i<POPSIZE; i++)
{
rand = rand_integer (i, POPSIZE-1);
temp = a1[rand];
a1[rand] = a1[i];
a1[i] = temp;
rand = rand_integer (i, POPSIZE-1);
temp = a2[rand];
a2[rand] = a2[i];
a2[i] = temp;
}
for (i=0; i<POPSIZE-3; i+=4)
{
parent1 = tournament (&old_pop->ind[a1[i]], &old_pop->ind[a1[i+1]]);
parent2 = tournament (&old_pop->ind[a1[i+2]], &old_pop->ind[a1[i+3]]);
crossover (parent1, parent2, &new_pop->ind[i], &new_pop->ind[i+1]);
parent1 = tournament (&old_pop->ind[a2[i]], &old_pop->ind[a2[i+1]]);
parent2 = tournament (&old_pop->ind[a2[i+2]], &old_pop->ind[a2[i+3]]);
crossover (parent1, parent2, &new_pop->ind[i+2], &new_pop->ind[i+3]);
}
free (a1);
free (a2);
return;
}
// 二进制联赛
individual* tournament (individual *ind1, individual *ind2)
{
int flag;
flag = check_dominance (ind1, ind2);
if (flag==1)
{
return (ind1);
}
if (flag==-1)
{
return (ind2);
}
if (ind1->crowd_dist > ind2->crowd_dist)
{
return(ind1);
}
if (ind2->crowd_dist > ind1->crowd_dist)
{
return(ind2);
}
if ((randomperc()) <= 0.5)
{
return(ind1);
}
else
{
return(ind2);
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -