C ++で遺伝的アルゴリズムを実装しようとしていました。それを以前の BP ネットワーク プロジェクトと組み合わせたところ、問題が発生しました。複雑なデータを入力しようとすると、ASSERTE(_BLOCK_TYPE_IS_VALID(pHead->nBlockUse)) エラーが表示されます。
以下は、この部分の私の本体です
float NeuralNetwork::Optimize()
{
TotalFitness = 0;
std::list<SPopulation>::iterator Data;
if( Population.size() == 0)
Population = InitializePopulation();
for( Data = Population.begin(); Data!=Population.end(); ++Data )
{
Clean((*Data).Data.y);
(*Data).Data.y = Predict( (*Data).Data.x );
SVector Expected = GetTruth( (*Data).Data.x );
float Temp = 0;
for( int i=0; i<Expected.Size; i++ )
{
Temp += powf( Expected.Data[i] - (*Data).Data.y.Data[i], 2 );
}
Clean( Expected );
(*Data).Fitness = Temp/2;
TotalFitness += (*Data).Fitness;
(*Data).Fitness = 1 / (1+(*Data).Fitness);
}
TotalFitness /= Population.size();
TotalFitness = 1 / (1+TotalFitness);
Select();
Cross();
Mutate();
return TotalFitness;
}
std::list Population は、私の Network クラスのプライベート メンバーです。通常、4 ~ 5 回トレーニングした後、最初の Clean 関数でクラッシュします。
void NeuralNetwork::Clean( SVector& x )
{
if( (x.Size != 0) && (x.Data != NULL) )
{
//cout<<"Delete pointer at address :"<<hex<<x.Data<<endl;
delete[] x.Data;
x.Size = 0;
x.Data = NULL;
}
}
void NeuralNetwork::Clean( SData& x )
{
Clean( x.x );
Clean( x.y );
}
そして、本当に奇妙なことが起こります。 Mutate() 関数を削除すると、すべてが機能します。しかし、Mutate 関数には、この問題を引き起こす可能性のあるものは何もありません。
void NeuralNetwork::Mutate( )
{
srand((unsigned)time(NULL));
double x;
double PMutation = 0.20;
if( Population.size() == 0 )
return;
std::list<SPopulation>::iterator It;
for( It = Population.begin(); It!=Population.end(); ++It )
{
for( int i=0; i<mCreateInfo.InputNodes; i++ )
{
x = rand()%1000/1000.0;
if (x < PMutation)
{
SVector S = (*It).Data.x;
float NewValue = (((float)(rand()%1000)/1000.0)*(mBoundHigh - mBoundLow) + mBoundLow);
S.Data[0] = NewValue;
}
}
}
}
私のテストでは、mCreateInfo.InputNodes は常に 0 です。何が問題を引き起こしているのか考え始めます。次に、Select() 関数でのみ、Population リストからいくつかのエンティティを消去していることに気付きました。しかし、それも問題にはなりません。Select 関数と Cross() 関数を削除しても、Mutate() だけが残っているため、クラッシュします。
何がエラーの原因になっているのか、今のところわかりません。
PS:
ここでも時々クラッシュします。これは信じられない。期待されるオブジェクトを取得した後、それを直接消去してもエラーが表示されます。ポインターを 2 回削除しようとすることはできません。
SVector Expected = GetTruth( (*Data).Data.x );
float Temp = 0;
for( int i=0; i<Expected.Size; i++ )
{
Temp += powf( Expected.Data[i] - (*Data).Data.y.Data[i], 2 );
}
Clean( Expected );