掲示板システム
ホーム
アクセス解析
カテゴリ
ログアウト
アクセス違反を解決するには? (ID:69546)
名前
ホームページ(ブログ、Twitterなど)のURL (省略可)
本文
シーケンスペアにおける一様交叉をつくっており、デバッグするとFloorplan.exe の 0x00418efe で初回の例外が発生しました: 0xC0000005: 場所 0x00000000 に書き込み中にアクセス違反が発生しました。 Floorplan.exe の 0x00418efe でハンドルされていない例外が発生しました: 0xC0000005: 場所 0x00000000 に書き込み中にアクセス違反が発生しました。 'Floorplan.exe': 'C:\WINDOWS\system32\kavo0.dll' を読み込みました。バイナリはデバッグ情報と一緒にビルドされませんでした。 Floorplan.exe の 0x029feee4 で初回の例外が発生しました: 0xC0000005: 場所 0x77010000 を読み込み中にアクセス違反が発生しました。 1回目のroopはうまくいって結果がでてるのですが2周目に入ったとたんこれらがたくさんでてきます。 以下プログラムです。 #include <stdio.h> #include <stdlib.h> #include <time.h> #include "ga.h" #include "data.h" void Crossover(GeneticPool *gp, Data *data, Individual *child, Individual **selpool, int crossNum) { int *flag; int *mask; int *cross_data1; int *cross_data2; int *cross_data3; int *cross_data4; float cross_rate; double d_ret; int i,j,k,l; int z; int rando (int); srand((unsigned) time(NULL)); flag = (int *)calloc(data->blockNum, sizeof(int)); for (i=0; i<data->blockNum; i++){ flag[i] = 0; } mask = (int *)calloc(data->blockNum, sizeof(int)); for (i=0; i<data->blockNum; i++){ mask[i] = 0; } cross_data1 = (int *)calloc(data->blockNum, sizeof(int)); for (i=0; i<data->blockNum; i++){ cross_data1[i] = -1; } cross_data2 = (int *)calloc(data->blockNum, sizeof(int)); for (i=0; i<data->blockNum; i++){ cross_data2[i] = -1; } cross_data3 = (int *)calloc(data->blockNum, sizeof(int)); for (i=0; i<data->blockNum; i++){ cross_data3[i] = -1; } cross_data4 = (int *)calloc(data->blockNum, sizeof(int)); for (i=0; i<data->blockNum; i++){ cross_data4[i] = -1; } cross_rate = 0.5; for(i=0; i<data->blockNum;i++){ d_ret=(double)rando(101)/100; if(d_ret< cross_rate) mask[i] = 1; else mask[i] = 0; } for(i=0; i<crossNum*2; i++){ for(j=0; j<data->blockNum; j++){ child[i].Gp[j]=-1; child[i].Gm[j]=-1; child[i].TH[j]=-1; child[i].L[j]=-1; } } for(i=0; i<data->blockNum; i++){ printf("%d",mask[i]); } printf("\n"); /*Γ+においてマスクが1のとき親1、親2の遺伝子を子1、子2に受け継ぐ*/ for(i=0; i<crossNum*2; i+=2){ for (j=0; j<data->blockNum; j++){ if(mask[j]==1){ child[i].Gp[j]=selpool[i]->Gp[j]; cross_data1[j]=selpool[i]->Gp[j]; } } } for(i=0; i<crossNum*2; i+=2){ for (j=0; j<data->blockNum; j++){ if(mask[j]==1){ child[i+1].Gp[j]=selpool[i+1]->Gp[j]; cross_data2[j]=selpool[i+1]->Gp[j]; } } } for(i=0; i<data->blockNum; i++){ printf("%d",flag[i]); } printf("\n"); /*Γ+においてマスクが0のとき親2の遺伝子を子1に受け継ぐ*/ for(i=0; i<crossNum*2; i+=2){ for (k=0; k<data->blockNum; k++){ for (j=0; j<data->blockNum; j++){ if(child[i].Gp[j]==selpool[i+1]->Gp[k]){ flag[k]=1;←ここのフラグで0と1が入っているにもかかわらず表示させるとすべて1になっているのもなぜかわかりません。 break; } } } } for(i=0; i<data->blockNum; i++){ printf("%d",flag[i]); } printf("\n"); for(i=0; i<crossNum*2; i+=2){ for(k=0; k<data->blockNum; k++){ if(mask[k] == 0){ for(j=0; j<data->blockNum; j++){ if(flag[j]==0){ child[i].Gp[k]=selpool[i+1]->Gp[j]; cross_data3[k]=selpool[i+1]->Gp[j]; flag[j]=1; break; } } } } } /*flag初期化*/ for (i=0; i<data->blockNum; i++){ flag[i] = 0; } /*Γ+においてマスクが0のとき親1の遺伝子を子2に受け継ぐ*/ for(i=0; i<crossNum*2; i+=2){ for (k=0; k<data->blockNum; k++){ for (j=0; j<data->blockNum; j++){ if(selpool[i]->Gp[k]==child[i+1].Gp[j]){ flag[k]=1; break; } } } } for(i=0; i<crossNum*2; i+=2){ for(k=0; k<data->blockNum; k++){ if(mask[k] == 0){ for(j=0; j<data->blockNum; j++){ if(flag[j]==0){ child[i+1].Gp[k]=selpool[i]->Gp[j]; cross_data4[k]=selpool[i]->Gp[j]; flag[j]=1; break; } } } } } /*flag初期化*/ for (i=0; i<data->blockNum; i++){ flag[i] = 0; } /*Γ-においてΓ+に対応した親1、親2の遺伝子を子1、子2に受け継ぐ*/ for(i=0; i<crossNum*2; i+=2){ for (k=0; k<data->blockNum; k++){ for (j=0; j<data->blockNum; j++){ if(selpool[i]->Gm[k]==cross_data1[j]){ child[i].Gm[k]=selpool[i]->Gm[k]; } if(selpool[i+1]->Gm[k]==cross_data2[j]){ child[i+1].Gm[k]=selpool[i+1]->Gm[k]; } } } } /*Γ-においてΓ+に対応した親2の遺伝子を子1に受け継ぐ*/ for(i=0; i<crossNum*2; i+=2){ for (k=0; k<data->blockNum; k++){ for (j=0; j<data->blockNum; j++){ if(selpool[i+1]->Gm[k]==child[i].Gm[j]){ flag[k]=1; break; } } } } for(i=0; i<crossNum*2; i+=2){ for(k=0; k<data->blockNum; k++){ if(child[i].Gm[k]==-1){ for(j=0; j<data->blockNum; j++){ if(flag[j]==0){ child[i].Gm[k]=selpool[i+1]->Gm[j]; flag[j]=1; break; } } } } } /*flag初期化*/ for (i=0; i<data->blockNum; i++){ flag[i] = 0; } /*Γ-においてΓ+に対応した親1の遺伝子を子2に受け継ぐ*/ for(i=0; i<crossNum*2; i+=2){ for (k=0; k<data->blockNum; k++){ for (j=0; j<data->blockNum; j++){ if(selpool[i]->Gm[k]==child[i+1].Gm[j]){ flag[k]=1; break; } } } } for(i=0; i<crossNum*2; i+=2){ for(k=0; k<data->blockNum; k++){ if(child[i+1].Gm[j]==-1){ for(j=0; j<data->blockNum; j++){ if(flag[j]==0){ child[i+1].Gm[k]=selpool[i]->Gm[j]; flag[j]=1; break; } } } } } /*flag初期化*/ for (i=0; i<data->blockNum; i++){ flag[i] = 0; } /*親1、親2のθ成分を子1、子2へ受け継ぐ*/ for(i=0; i<crossNum*2; i+=2){ for (k=0; k<data->blockNum; k++){ for (j=0; j<data->blockNum; j++){ if(k==cross_data1[j]){ child[i].TH[k]=selpool[i]->TH[k]; } if(k==cross_data2[j]){ child[i+1].TH[k]=selpool[i+1]->TH[k]; } } } } /*親2のθ成分を子1に*/ z=0; z=z-1; for(i=0; i<crossNum*2; i+=2){ for(k=0; k<data->blockNum; k++){ if( child[i].TH[k]==-1){ for(l=z+1; l<data->blockNum; l++){ for(j=0; j<data->blockNum; j++){ if(l==cross_data3[j]){ child[i].TH[k]=selpool[i+1]->TH[j]; break; } } if(l==cross_data3[j]){ break; } } z=l; } } } /*親1のθ成分を子2に*/ z=0; z=z-1; for(i=0; i<crossNum*2; i+=2){ for(k=0; k<data->blockNum; k++){ if(child[i+1].TH[k]==-1){ for(l=0; l<data->blockNum; l++){ for(j=0; j<data->blockNum; j++){ if(l==cross_data3[j]){ child[i+1].TH[k]=selpool[i]->TH[j]; break; } } if(l==cross_data4[j]){ break; } } z=1; } } } /*親1、親2のアスペクト比を子1、子2へ受け継ぐ*/ for(i=0; i<crossNum*2; i+=2){ for (k=0; k<data->blockNum; k++){ for (j=0; j<data->blockNum; j++){ if(k==cross_data1[j]){ child[i].L[k]=selpool[i]->L[k]; } if(k==cross_data2[j]){ child[i+1].L[k]=selpool[i+1]->L[k]; } } } } /*親2のアスペクト比を子1に*/ z=0; z=z-1; for(i=0; i<crossNum*2; i+=2){ for(k=0; k<data->blockNum; k++){ if( child[i].L[k]==-1){ for(l=z+1; l<data->blockNum; l++){ for(j=0; j<data->blockNum; j++){ if(l==cross_data3[j]){ child[i].L[k]=selpool[i+1]->L[j]; break; } } if(l==cross_data3[j]){ break; } } z=1; } } } /*親1のアスペクト比を子2に*/ z=0; z=z-1; for(i=0; i<crossNum*2; i+=2){ for(k=0; k<data->blockNum; k++){ if(child[i+1].L[k]==-1){ for(l=0; l<data->blockNum; l++){ for(j=0; j<data->blockNum; j++){ if(l==cross_data3[j]){ child[i+1].L[k]=selpool[i]->L[j]; break; } } if(l==cross_data4[j]){ break; } } z=1; } } } free(mask); free(flag); free(cross_data1); free(cross_data2); free(cross_data3); free(cross_data4); } int rando (int num) { int ret; ret = rand (); ret = ret % num; return ret; } ループは for(・・・) Crossover(・・・) という感じで違うプログラムで行っています。 アクセス違反とできればフラグについてもよろしくおねがいします。
←解決時は質問者本人がここをチェックしてください。
戻る
掲示板システム
Copyright 2020 Takeshi Okamoto All Rights Reserved.