//-------------------------------------------------------------------------
// 移住
//-------------------------------------------------------------------------
void imigration(Individual* pop,int pop_size,int send_pop,int glength,int myid,int
island)
{
int i,j,l,k,m,n=0;
int send[send_pop*glength];
int recv[send_pop*glength];
MPI_Status stat;
//個体のシャッフル
random_shuffle(&pop[0], &pop[pop_size], genrand_int);
//送信する個体数分だけの遺伝子をsendに格納
for(i = 0; i < send_pop; i ++){
//printf("\n");
for(j = 0; j < glength; j ++){
send[j + (glength * i)] = pop[i].gene[j];
//printf("%d",send[j + (glength * i)]);
}
}
int island_num[island];
if(myid == 0){
//どのクラスタと通信を行うかをランダムに決定
for(k = 0; k < island; k ++){
island_num[k] = k;
}
random_shuffle(&island_num[0], &island_num[island], genrand_int);
}
//送信番号を全ノードに送る
if(myid == 0){
MPI_Bcast(&island_num, island, MPI_INT, 0, MPI_COMM_WORLD);
}
//受け取る
else {MPI_Bcast(&island_num, island, MPI_INT, 0, MPI_COMM_WORLD);}
//受け取る島を検索
for(m = 0; m < island; m++){
if(island_num[m] == myid){
n = m;
}
}
//個体の交換
MPI_Sendrecv(send,send_pop*glength,MPI_INT,island_num[myid],1000,recv,send_pop*glength,MPI_INT,n,1000,MPI_COMM_WORLD,&\
stat);
//受信した遺伝子を個体に格納
random_shuffle(&pop[0], &pop[pop_size], genrand_int);
for(i = 0; i < send_pop; i ++){
for(j = 0; j < glength; j ++){
//printf("%d",recv[j + (glength * i)]);
pop[i].gene[j] = recv[j + (glength * i)];
}
}
}