/************* 相手集団を更新 *************/ void Update_Opponent(Indiv child) { int i,j,k; int obj_count; int min_indiv; double min_dis; double tmp_dis; /*いらない相手を残すと有害。勝ち数で残す個体判断しているので、余計な勝ち数がカウントされる。*/ /*距離が最小のニッチの重心を見つけて、ニッチ番号を取得*/ child.nitch = 1; min_dis = cal_coord_distance(&child,&Gra_Nitch[1]); for(i=1;i<count_nitch;i++){ if(cal_coord_distance(&child,&Gra_Nitch[i]) < min_dis){ min_dis = cal_coord_distance(&child,&Gra_Nitch[i]); child.nitch = i; } } /*戦闘データ初期化*/ for(i=0;i<No;i++){ if(Opponent[i].nitch == child.nitch){ Opponent[i].win = 0; Opponent[i].flag = 0; } } child.win = 0; child.flag = 0; /*該当するニッチの個体と子個体でリーグ戦*/ for(i=0;i<No;i++){ if(Opponent[i].nitch == child.nitch && Opponent[i].flag == 0){ for(j=i+1;j<No;j++){ if(Opponent[i].nitch == child.nitch){ Numbers(&Opponent[i],&Opponent[j]); } } Numbers(&Opponent[i],&child); /*ナンバーズ*/ Opponent[i].flag = 1; /*フラグ立て*/ Opponent[i].comp_flag = 1; /*生存競争したフラグ*/ } } /*評価値の最小個体を求める*/ int min_win = No; for(i=0;i<No;i++){ if(Opponent[i].nitch == child.nitch && Opponent[i].win < min_win){ min_win = Opponent[i].win; min_indiv = i; } } /*削除予定の個体の枠へ子個体を入れる、または相手集団の中で子個体より弱い相手のところに入れる*/ if(Opponent[min_indiv].win < child.win){ Opponent[min_indiv] = child; Opponent[min_indiv].comp_flag = 1; Opponent[min_indiv].delete_flag = 0; } /*対戦データおよびニッチ番号初期化*/ Init_Opponent_BattleData(); NeighList_Opponent(); }
int main(int argc, char* argv[], char* envp[]) { int i; const char *name; printf("Enum Days elements:\n"); for (i = 0; i < 7; i++) { name = ENUM_NAME_AT(Days, i); if (name) printf("\t%d) %-10s\n", i, name); } printf("\nEnum Number elements:\n"); for (i = 0; i < 11; i++) { int pos = ENUM_POS(Numbers, Numbers(i)); if (pos >= 0) { name = ENUM_NAME(Numbers, Numbers(i)); printf("\t%-10s:\t%d\n", name, i); } else { printf(" %d is not a valid item of Enum Numbers\n", i); } } printf("\nEnum Fruits elements:\n"); Fruits value; for (i = 0; i < NUMBER_OF(Fruits); i++) { value = ENUM_VALUE_AT(Fruits, i); name = ENUM_NAME_AT(Fruits, i); // printf("\t%d) %-10s:\t%d\n", i, name, value); name = ENUM_NAME(Fruits, value); if (name) { value = ENUM_VALUE(Fruits, name); if (value != INVALID_ENUM_ITEM(Fruits)) printf("\t%-10s:\t%d\n", name, value); } } return 0; }
/********* ナンバーズ *********/ void Child_Opponent_Numbers(Indiv child[],Indiv Opponent[]) { int i,j; /*絶対値が一番小さいパラメータを求める*/ for(i=0;i<Nc;i++){ for(j=0;j<No;j++){ Numbers(&child[i],&Opponent[j]); } } }
/************ 親のナンバーズ.rexstarで利用 ************/ void Pare_Numbers(Indiv pare[]) { int i,j; /*絶対値が一番小さいパラメータを求める*/ for(i=0;i<Np*2;i++){ for(j=i+1;j<Np*2;j++){ Numbers(&pare[i],&pare[j]); } } }
/*********** メインルーチンmain ***********/ main(){ /*個体を格納する配列定義*/ Indiv pop[Ns]; /*解集団配列*/ Indiv pare[Np]; /*親集団配列*/ Indiv child[Nc]; /*子集団配列*/ Indiv pare_child[Np+Nc];/*子個体と親個体を合わせる*/ Indiv MainPare; int i,j,k; /*for文用*/ char name[10]; init_genrand((unsigned)time(NULL)); /*乱数初期化*/ Init_Indiv(pop,Ns); /*解集団構造体初期化*/ Init_Indiv(pare,Np); /*親集団構造体初期化*/ Init_Indiv(child,Nc); /*子集団構造体初期化*/ Init_Opponent(); /*相手集団構造体初期化*/ Init_Optimal(); clock_t start,end; double time_count[END_STEP]; double battle_count[END_STEP]; /*SDL初期化*/ SDL_Surface *window; // ウィンドウ(画像)データ、及び、文字列(画像)へのポインタ /*SDLの全ての機能を初期化*/ if ( SDL_Init(SDL_INIT_VIDEO) < 0 ){ printf("failed to initialize SDL.\n"); fprintf(stderr,"%s\n",SDL_GetError()); SDL_GetError(); exit(-1); } /* ウィンドウ生成(800*600、1677万色)*/ if((window = SDL_SetVideoMode(WINDOW_X, WINDOW_Y, 32, SDL_SWSURFACE)) == NULL) { printf("failed to initialize videomode.\n"); exit(-1); } SDL_Thread *thr_keyboad,*thr_window; thr_keyboad = SDL_CreateThread(thread_keyboad,NULL); /*初期解生成*/ for(i=0;i<Ns;i++){ for(j=0;j<DEM;j++){ pop[i].n[j] = GetRand_Real(INIT); /*実数値乱数*/ } } /*初期集団からランダムに親を選ぶ*/ int while_flag = 1; int pare_count; /*親の数をカウント*/ int tmp_rand; int tmp_n; int MainPare_n; while(end_flag){ SDL_FillRect(window, NULL, 0x00ffffff); /*近傍リスト3生成*/ AnsList3(pop); /*主親を選ぶ*/ while_flag = 1; pare_count = 0; while(while_flag){ MainPare_n = genrand_int32() % Ns; /*主親の番号取得*/ for(i=0;pop[MainPare_n].Neigh_List2[i] != -1 && i<Kp;i++){} pare_count = i; /*近傍リストに個体があれば主親にして、ループを抜ける*/ if(pare_count >= Np){ MainPare = pop[MainPare_n]; /*主親へ*/ MainPare.win = 0; while_flag = 0; } } /*副親を選ぶ*/ if(pare_count < Np){ /*規定の親個体数より近傍リストの個体が少なければリストの個体全てを副親に*/ int SubPare_n[pare_count]; Indiv SubPare[pare_count]; for(i=0;i<pare_count;i++){ SubPare_n[i] = MainPare.Neigh_List2[i]; SubPare[i] = pop[SubPare_n[i]]; SubPare[i].win = 0; } /*主親と副親で拡張XLM*/ ExtensionXLM(MainPare,SubPare,pare_count,child); }else { /*規定以上の個体数あったらランダムに選ぶ*/ pare_count = Np; Indiv SubPare[Np]; int SubPare_n[Np] = {0}; for(i=0;i<Np;i++){ while_flag = 1; while(while_flag){ tmp_rand = genrand_int32() % pare_count; /*リストが空でなければ追加*/ if(MainPare.Neigh_List2[tmp_rand] != -1){ SubPare_n[i] = MainPare.Neigh_List2[tmp_rand]; SubPare[i] = pop[SubPare_n[i]]; SubPare[i].win = 0; /*個体と取り出して空にする*/ MainPare.Neigh_List2[tmp_rand] = -1; while_flag = 0; } } } /*主親と副親で拡張XLM*/ ExtensionXLM(MainPare,SubPare,pare_count,child); } start = clock(); for(i=0;i<Nc;i++){ for(j=i+1;j<Nc;j++){ Numbers(&child[i],&child[j]); } Numbers(&child[i],&MainPare); } end = clock(); battle_count[end_count] = battle_n; time_count[end_count] = (double)(end - start); /*評価の良い順にソート*/ sort_win(child,Nc); //printf("child[0].win = %d\n",child[0].win); //printf("MainPare.win = %d\n",MainPare.win); /*主親より評価値のいい子個体がいたら入れ替える*/ if(MainPare.win < child[0].win){ MainPare = child[0]; /*削除予定の個体があれば*/ for(k=0;Opponent[k].delete_flag == 0 && k<No;k++){} if(k != No){ Opponent[k] = child[0]; Opponent[k].comp_flag = 1; Opponent[k].delete_flag = 0; }if(k == No){ Update_Opponent(child[0]); } } /*生存競争を1世代に1回でも行っていればカウント初期化。行っていなければカウント。*/ for(i=0;i<No;i++){ if(Opponent[i].delete_flag != 1){ if(Opponent[i].comp_flag == 0){ Opponent[i].gene_count++; }else if(Opponent[i].comp_flag == 1){ Opponent[i].gene_count = 0; } Opponent[i].comp_flag = 0; if(DELETE <= Opponent[i].gene_count){ Opponent[i].delete_flag = 1; Opponent[i].nitch = 0; } } } /*主親を集団に戻す*/ pop[MainPare_n] = MainPare; Unit_Optimal(window); Opponent_Prot(window); Pop_Prot(pop,window); Prot_Frame(window); SDL_Flip(window); if(end_count % 20 == 0){ sprintf(name,"./picture/coans/optimal1/pop_oppo0%d.bmp",end_count); SDL_SaveBMP(window,name); } //SDL_Delay(500); /*構造体初期化*/ Init_Indiv(child,Nc); /*試行回数を数える*/ end_count++; if(end_count > END_STEP){ end_flag = 0; } } /*最適解の座標表示*/ for(i=0;i<Optimal_N;i++){ printf("Optimal[%d] = (",i); for(j=0;j<DEM;j++){ printf("%.2f, ",Optimal[i].n[j]); } printf("\n"); } printf("end_count = %d\n",end_count); /*集団の最適な個体を表示*/ for(i=0;i<Ns;i++){ for(j=0;j<Ns;j++){ Numbers(&pop[i],&pop[j]); } } sort_win(pop,Ns); for(i=0;i<Ns;i++){ printf("pop[%d].n = (",i); for(j=0;j<DEM;j++){ printf("%.2f, ",pop[i].n[j]); } printf("\n"); } for(i=0;i<Ns;i++){ printf("pop[%d].eval = %.2f\n",i,pop[i].eval); } SDL_Quit(); return 0; }
/*********** メインルーチンmain ***********/ main(){ /*個体を格納する配列定義*/ Indiv pare[Np]; /*親集団配列*/ Indiv child[Nc]; /*子集団配列*/ Indiv pare_child[Np+Nc];/*子個体と親個体を合わせる*/ Indiv MainPare; int i,j,k; /*for文用*/ char name[10]; init_genrand((unsigned)time(NULL)); /*乱数初期化*/ Init_Indiv(pop,Ns); /*解集団構造体初期化*/ Init_Indiv(pare,Np); /*親集団構造体初期化*/ Init_Indiv(child,Nc); /*子集団構造体初期化*/ Init_Optimal(); clock_t start,end; double time_count; double battle_count; /*SDL初期化*/ SDL_Surface *window; // ウィンドウ(画像)データ、及び、文字列(画像)へのポインタ /*SDLの全ての機能を初期化*/ if ( SDL_Init(SDL_INIT_VIDEO) < 0 ){ printf("failed to initialize SDL.\n"); fprintf(stderr,"%s\n",SDL_GetError()); SDL_GetError(); exit(-1); } /* ウィンドウ生成(800*600、1677万色)*/ if((window = SDL_SetVideoMode(WINDOW_X, WINDOW_Y, 32, SDL_SWSURFACE)) == NULL) { printf("failed to initialize videomode.\n"); exit(-1); } SDL_Thread *thr_keyboad,*thr_window; thr_keyboad = SDL_CreateThread(thread_keyboad,NULL); /*初期解生成*/ for(i=0;i<Ns;i++){ for(j=0;j<DEM;j++){ pop[i].n[j] = GetRand_Real(INIT); /*実数値乱数*/ } } /*初期集団からランダムに親を選ぶ*/ int while_flag = 1; int pare_count; /*親の数をカウント*/ int tmp_rand; int tmp_n; int MainPare_n; while(end_flag){ SDL_FillRect(window, NULL, 0x00ffffff); /*近傍リスト1生成*/ AnsList1(); AnsList2(); count_nitch = 0; for(i=0;i<Ns;i++){ pop[i].nitch = -1; } for(i=0;i<Ns;i++){ if(Set_Nitch(i) == 1) count_nitch++; } while_flag = 1; pare_count = 0; while(while_flag){ MainPare_n = genrand_int32() % Ns; /*主親の番号取得*/ for(i=0;pop[MainPare_n].Neigh_List1[i] != -1 && i<Kp;i++){} pare_count = i; /*近傍リストに個体があれば主親にして、ループを抜ける*/ if(pare_count >= Np){ MainPare = pop[MainPare_n]; /*主親へ*/ MainPare.win = 0; while_flag = 0; } } /*副親を選ぶ*/ if(pare_count < Np){ /*規定の親個体数より近傍リストの個体が少なければリストの個体全てを副親に*/ int SubPare_n[pare_count]; Indiv SubPare[pare_count]; for(i=0;i<pare_count;i++){ SubPare_n[i] = MainPare.Neigh_List1[i]; SubPare[i] = pop[SubPare_n[i]]; SubPare[i].win = 0; } /*主親と副親で拡張XLM*/ ExtensionXLM(MainPare,SubPare,pare_count,child); }else { /*規定以上の個体数あったらランダムに選ぶ*/ pare_count = Np; Indiv SubPare[Np]; int SubPare_n[Np] = {0}; for(i=0;i<Np;i++){ while_flag = 1; while(while_flag){ tmp_rand = genrand_int32() % Kp; /*リストが空でなければ追加*/ if(MainPare.Neigh_List1[tmp_rand] != -1){ SubPare_n[i] = MainPare.Neigh_List1[tmp_rand]; SubPare[i] = pop[SubPare_n[i]]; SubPare[i].win = 0; /*個体と取り出して空にする*/ MainPare.Neigh_List1[tmp_rand] = -1; while_flag = 0; } } } /*主親と副親で拡張XLM*/ ExtensionXLM(MainPare,SubPare,pare_count,child); } /*子個体作れたから自分の集団と対戦させる*/ /*対戦?*/ start = clock(); for(i=0;i<Ns;i++){ for(j=0;j<Nc;j++){ Numbers(&pop[i],&child[j]); } Numbers(&pop[i],&MainPare); } end = clock(); time_count += (double)(end - start); /*デバッグ用*/ /*評価の良い順にソート*/ sort_win(child,Nc); /*子個体の最良個体が主親より良ければ入れ替える*/ if(MainPare.win < child[0].win){ MainPare = child[0]; } /*主親を集団に戻す*/ pop[MainPare_n] = MainPare; Unit_Optimal(window); //Pop_Prot(pop,window); Opponent_Prot(pop,window); Prot_Frame(window); SDL_Flip(window); if(end_count % 20 == 0){ sprintf(name,"./picture/pop_oppo0%d.bmp",end_count); SDL_SaveBMP(window,name); } //SDL_Delay(500); /*構造体初期化*/ Init_Indiv(child,Nc); /*試行回数を数える*/ end_count++; if(end_count > END_STEP){ end_flag = 0; } } /*最適解の座標表示*/ /* for(i=0;i<Optimal_N;i++){ printf("Optimal[%d] = (",i); for(j=0;j<DEM;j++){ printf("%.2f, ",Optimal[i].n[j]); } printf("\n"); } */ //printf("end_count = %d\n",end_count); /*集団の最適な個体を表示*/ /* for(i=0;i<Ns;i++){ for(j=0;j<Ns;j++){ Numbers(&pop[i],&pop[j]); } } sort_win(pop,Ns); for(i=0;i<Ns;i++){ printf("pop[%d].n = (",i); for(j=0;j<DEM;j++){ printf("%.2f, ",pop[i].n[j]); } printf("\n"); } for(i=0;i<Ns;i++){ printf("pop[%d].eval = %.2f\n",i,pop[i].eval); } */ /*対戦回数と秒数*/ int eval_n=0; for(i=0;i<Ns;i++){ if(pop[i].eval < 1){ eval_n++; } } printf("ave:%d battle:%d time:%f\n",eval_n,battle_n/END_STEP,time_count/END_STEP); SDL_Quit(); return 0; }