📄 operators.c
字号:
//主要操作:交叉,变异
/*----------------------------------------------------------------------------*/
/* operators.c - Genetic Operators: Crossover and Mutation */
/*----------------------------------------------------------------------------*/
#include "external.h"
mutation(child) /* Mutate an allele w/ pmutation, count # of mutations */
unsigned *child;
{
int j, k, stop;
unsigned mask, temp = 1;
for(k = 0; k < chromsize; k++)
{
mask = 0;
if(k == (chromsize-1))
stop = lchrom - (k*UINTSIZE);
else
stop = UINTSIZE;
for(j = 0; j < stop; j++)
{
if(flip(pmutation))
{
mask = mask|(temp<<j);
nmutation++;
}
}
child[k] = child[k]^mask;
}
}
int crossover (parent1, parent2, child1, child2) /* Cross 2 parent strings, place in 2 child strings */
unsigned *parent1, *parent2, *child1, *child2;
{
int j, jcross, k;
unsigned mask, temp;
/* Do crossover with probability pcross */
if(flip(pcross))
{
jcross = rnd(1 ,(lchrom - 1));/* Cross between 1 and l-1 */
ncross++;
for(k = 1; k <= chromsize; k++)
{
if(jcross >= (k*UINTSIZE))
{
child1[k-1] = parent1[k-1];
child2[k-1] = parent2[k-1];
}
else if((jcross < (k*UINTSIZE)) && (jcross > ((k-1)*UINTSIZE)))
{
mask = 1;
for(j = 1; j <= (jcross-1-((k-1)*UINTSIZE)); j++)
{
temp = 1;
mask = mask<<1;
mask = mask|temp;
}
child1[k-1] = (parent1[k-1]&mask)|(parent2[k-1]&(~mask));
child2[k-1] = (parent1[k-1]&(~mask))|(parent2[k-1]&mask);
}
else
{
child1[k-1] = parent2[k-1];
child2[k-1] = parent1[k-1];
}
}
}
else
{
for(k = 0; k < chromsize; k++)
{
child1[k] = parent1[k];
child2[k] = parent2[k];
}
jcross = 0;
}
return(jcross);
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -