- ベストアンサー
C言語で遺伝的アルゴリズムの順序交叉を実装していますが、処理が遅いです。解決策を教えてください。
- C言語を使って遺伝的アルゴリズムの順序交叉(TSP)を実装していますが、処理が非常に遅いです。
- 循環交叉を取り入れたプログラムは5000ループでも1秒弱で処理されますが、順序交叉では20秒近くかかってしまいます。
- 無駄なループが多いように思えますが、改善策が思いつきません。ヒントを教えてください。
- みんなの回答 (1)
- 専門家の回答
質問者が選んだベストアンサー
パッと思いついたところだけ。 出現済みチェック(かな?)の二重ループ。jがインクリメントされなければ、次のiのループでもインクリメントされないので、ループしなくても良いかと。こんな感じ: while (k != a - target) { for (i = 0; i < target + k; i++) { int prev_j = j; // jを記憶。 for (l = 0; l < target + k; l++) { if (x2[l] == y[j]) j++; } printf( "j: %d->%d?n", prev_j, j ); //デバッグ用。 if ( prev_j == j ){break;} // jに変化無ければブレーク。 } 遺伝子が重複無く存在するような表現式なのだとしたら、以下のやり方でもいけるかも。 for (i = 0; i < target; i++) { // 交叉直前まで遺伝。 x2[i] = x[i]; } for (i = 0; i < a; i++) { // 片親を作業領域にコピー。 y2[i] = y[i]; } for ( j = 0; j < target; j++ ){ for ( i = 0; i < a; i++ ){ if ( x2[j] == y2[i] ){ y2[i] = 0; } // 既に遺伝済みのものは引き継がないよう片親側に0でマーク。 } } i = 0; for( k = target; k < a; k++ ){ // 片親から残りを遺伝。 while ( y2[i] == 0 ){ i++; } // マークされている部分をスキップ。 x2[k] = y2[i++]; } }
お礼
有難う御座いました。おかげで、循環交叉と同じ位のスピードで処理出来るようになりました。大変勉強になりました。また質問するようなことがあったら宜しく御願い致します。