NTSTATUS SrvElementsInit( VOID ) { NTSTATUS ntStatus = STATUS_SUCCESS; int iIter = 0; pthread_mutex_init(&gSrvElements.mutex, NULL); gSrvElements.pMutex = &gSrvElements.mutex; mt_init_genrand(&gSrvElements.randGen, time(NULL)); ntStatus = SrvElementsConfigSetupInitial(); BAIL_ON_NT_STATUS(ntStatus); gSrvElements.ulGlobalCreditLimit = SrvElementsConfigGetGlobalCreditLimit(); ntStatus = SrvElementsResourcesInit(); BAIL_ON_NT_STATUS(ntStatus); ntStatus = WireGetCurrentNTTime(&gSrvElements.llBootTime); BAIL_ON_NT_STATUS(ntStatus); while (!RAND_status() && (iIter++ < 10)) { uuid_t uuid; CHAR szUUID[37]; memset(szUUID, 0, sizeof(szUUID)); uuid_generate(uuid); uuid_unparse(uuid, szUUID); RAND_seed(szUUID, sizeof(szUUID)); } ntStatus = SrvTimerInit(&gSrvElements.timer); BAIL_ON_NT_STATUS(ntStatus); pthread_rwlock_init(&gSrvElements.statsLock, NULL); gSrvElements.pStatsLock = &gSrvElements.statsLock; ntStatus = SrvAsyncCloseFileTrackerCreate(&gSrvElements.pAsyncCloseFileTracker); BAIL_ON_NT_STATUS(ntStatus); error: return ntStatus; }
//Setup game: resources, variables and data structure void Initialize() { int i; //Initialize random numbers mt_init_genrand(13); //Text mode 80x50 textmode(C4350); //Hide cursor _setcursortype(_NOCURSOR); // Player initial position at screen = (80/2=40,42) // // - 1st line // o 2nd -> c[0] // o // ... // o 42th -> c[40] // ... // o 49th // - 50th line x = 40; x_prev = x; road[40] = 40; meters = 0; speed = 1; lifes = 3; //Setup road for(i=39;i>=0;i--) { road[i] = road[i+1] + Random(); if(road[i]<MIN) road[i] = MIN; else if(road[i]>MAX) road[i] = MAX; } //-- TODO:BOTTOM PART OF the road for(i=49;i>40;i--) { road[i] = road[i+1]+ Random(); if(road[i]<MIN) road[i] = MIN; else if(road[i]>MAX) road[i] = MAX; } //-- begin = true; }
void fiAddNoise(float *u, float *v, float std, long int randinit, int size) { //srand48( (long int) time (NULL) + (long int) getpid() + (long int) randinit); mt_init_genrand((unsigned long int) time (NULL) + (unsigned long int) getpid() + (unsigned long int) randinit); for (int i=0; i< size; i++) { //double a = drand48(); //double b = drand48(); double a=mt_genrand_res53(); double b=mt_genrand_res53(); double z = (double)(std)*sqrt(-2.0*log(a))*cos(2.0*M_PI*b); v[i] = u[i] + (float) z; } }
int main(int argc, char *argv[]){ // Options char *in_filename = NULL; // 問題ファイル名 char *out_filename = NULL; // 出力解答ファイル名 char *fix_filename = NULL; // 固定セル情報ファイル名 int outer_loops = O_LOOP; // 外ループ回数 bool fixed = false; // 固定フラグ // Options 取得 struct option longopts[] = { {"loop", required_argument, NULL, 'l'}, {"fixfile", required_argument, NULL, 'x'}, {"output", required_argument, NULL, 'o'}, {"fix-flag", no_argument, NULL, 'f'}, {"version", no_argument, NULL, 'v'}, {"help", no_argument, NULL, 'h'}, {0, 0, 0, 0} }; int opt, optidx; while ((opt = getopt_long(argc, argv, "l:o:fvh", longopts, &optidx)) != -1) { switch (opt) { case 'l': outer_loops = atoi(optarg); break; case 'x': fix_filename = optarg; break; case 'o': out_filename = optarg; break; case 'f': fixed = true; break; case 'v': version(); case 'h': case ':': case '?': default: usage(); } } if (argc <= optind) { usage(); } in_filename = argv[optind]; assert(in_filename != NULL); clock_t start_time, finish_time; start_time = clock(); initialize(in_filename); // 問題盤の生成 printBoard(); // 問題盤の表示 // 固定セルの生成 (機械学習の結果に基づく) if (fix_filename != NULL) { setFixFlagFromFile(fix_filename); printFixFlag(); } // 固定フラグの生成 else if (fixed) { generateFixFlag(); printFixFlag(); } // 乱数の初期化 mt_init_genrand((unsigned long)time(NULL)); // ペナルティの初期化 penalty_T = 0; penalty_C = 0; // 初期ルーティング for(int i=1;i<=board->getLineNum();i++){ // 数字が隣接する場合スキップ if(board->line(i)->getHasLine() == false) continue; if(!routing(i)){ cerr << "Cannot solve!! (error: 1)" << endl; exit(1); } } for(int i=1;i<=board->getLineNum();i++){ // 数字が隣接する場合スキップ if(board->line(i)->getHasLine() == false) continue; recording(i); } // 中間ポートを利用するか? // 利用している間,ライン不通過回数をカウントしない bool use_intermediate_port = false; // 中間ポートに設定するマスとそれを利用する数字 int inter_x, inter_y, inter_line = -1; // 探索スタート!! for (int m = 2; m <= outer_loops + 1; m++) { // 外ループ if(!use_intermediate_port){ // 中間ポートを利用しない場合 if ((m - 1) % 100 == 0) { cout << "loop " << (m-1) << endl; } if(m>INIT){ resetCandidate(); } } else{ // 中間ポートを利用する場合 if ((m - 1) % 100 == 0) { cout << "loop " << (m-1) << "+" << endl; } } // 解導出フラグ bool complete = false; for (int n = 1; n <= I_LOOP; n++) { // 内ループ if (INIT < m && !use_intermediate_port){ checkLineNonPassed(); } // 問題のおいて数字が隣接していないラインを選択する int id; do { id = (int)mt_genrand_int32(1, board->getLineNum()); } while (board->line(id)->getHasLine() == false); //cout << "(" << m << "," << n << ")Re-route Line" << id << endl; // 経路の削除 deleting(id); // ペナルティの設定 penalty_T = (int)(NT * (mt_genrand_int32(0, m - 1))); penalty_C = (int)(NC * (mt_genrand_int32(0, m - 1))); // 中間ポートを利用しない場合 if ( !((board->line(id))->isIntermediateUsed()) ) { // 経路の探索 if ( !routing(id) ) { cerr << "Cannot solve!! (error: 2)" << endl; // 失敗したらプログラム終了 exit(2); } // 経路の記録 recording(id); } // 中間ポートを利用する場合 else { // 経路の探索 (INTTRY 回) bool success = false; for (int count = 0; count < INTTRY; count++) { if (routingSourceToI(id)) { success = routingIToSink(id); break; } } // 中間ポート利用に失敗した場合,通常経路探索した後に内ループ脱出 if ( !success ) { if ( !routing(id) ) { cerr << "Cannot solve!! (error: 3)" << endl; // 失敗したらプログラム終了 exit(3); } recording(id); break; } // 経路の記録 recording(id); } // 終了判定(解導出できた場合,正解を出力) if(isFinished()){ finish_time = clock(); printSolution(); if (out_filename != NULL) { printSolutionToFile(out_filename); cout << "--> Saved to " << out_filename << endl << endl; } cout << "SUMMARY" << endl; cout << "-------" << endl; cout << " - filename: " << in_filename << endl; cout << " - size: " << board->getSizeX() << " x " << board->getSizeY() << endl; cout << " - iterations: " << (m - 1) << endl; cout << " - CPU time: " << ((double)(finish_time - start_time) / (double)CLOCKS_PER_SEC) << " sec" << endl; complete = true; break; } } if(complete) break; // 正解出力後は外ループも脱出 // 中間ポートを使用した次のループでは,中間ポートを利用しない if(use_intermediate_port){ use_intermediate_port = false; board->line(inter_line)->setIntermediateUnuse(); continue; } // 不通過マスの調査->中間ポートを利用するか? int candidate_count = 0; // 候補数 inter_x = -1; inter_y = -1; for(int y=0;y<board->getSizeY();y++){ for(int x=0;x<board->getSizeX();x++){ Box* trgt_box = board->box(x,y); if(trgt_box->isCandidate()){ candidate_count++; //cout << "(" << x << "," << y << ")"; // 不通過マス } } } //cout << endl; if(candidate_count==0) continue; // 候補数0なら利用しない // 候補の中から中間ポートに設定するマスをランダムに選択 int c_d = (int)mt_genrand_int32(0, candidate_count - 1); // 選択は候補の中で何番目か? int n_d = 0; // 何番目なのかをカウントする用の変数 bool flag = false; // 二重ループのためフラグが必要 for(int y=0;y<board->getSizeY();y++){ for(int x=0;x<board->getSizeX();x++){ Box* trgt_box = board->box(x,y); if(!trgt_box->isCandidate()){ continue; } if(n_d==c_d){ flag = true; inter_x = x; inter_y = y; break; } n_d++; } if(flag) break; } // 中間ポートの四方を見て,中間ポートを利用する数字をランダムに選択 checkCandidateLine(inter_x,inter_y); // 候補となるラインを調査 candidate_count = 0; // 候補数 inter_line = -1; for(int i=1;i<=board->getLineNum();i++){ Line* trgt_line = board->line(i); if(trgt_line->isCandidate()){ candidate_count++; //if(candidate_count>1) cout << ", "; //cout << i; } } //cout << endl; if(candidate_count==0) continue; // 候補数0なら利用しない c_d = (int)mt_genrand_int32(0, candidate_count - 1); // 選択は候補の中で何番目か? n_d = 0; // 何番目なのかをカウントする用の変数 for(int i=1;i<=board->getLineNum();i++){ Line* trgt_line = board->line(i); if(!trgt_line->isCandidate()) continue; if(n_d==c_d){ inter_line = i; break; } n_d++; } //cout << "Set (" << inter_x << "," << inter_y << ") InterPort of Line " << inter_line << endl; Line* line_i = board->line(inter_line); line_i->setIntermediateUse(); line_i->setIntermediatePort(inter_x,inter_y); use_intermediate_port = true; // m--; // 使うかどうか思案中・・・ // ペナルティ更新(旧) //penalty_T = (int)(NT * m); //penalty_C = (int)(NC * m); } // 解導出できなかった場合 if(!isFinished()){ for(int i=1;i<=board->getLineNum();i++){ printLine(i); } cerr << "Cannot solve!! (error: 4)" << endl; exit(4); } //デバッグ用 //for(int y=0;y<board->getSizeY();y++){ //for(int x=0;x<board->getSizeX();x++){ //cout << "(" << x << "," << y << ") "; //Box* trgt_box = board->box(x,y); //cout << " N:" << trgt_box->getNorthNum(); //cout << " E:" << trgt_box->getEastNum(); //cout << " S:" << trgt_box->getSouthNum(); //cout << " W:" << trgt_box->getWestNum(); //cout << endl; //} //} //for(int i=1;i<=board->getLineNum();i++){ // calcCost(i); //} delete board; return 0; }
// Sets up a premutation table using the given seed. void snoise_setup_perm(snoise_permtable* p, unsigned long seed) { mt_init_genrand(seed); snoise_setup_perm_noseed(p); }