Работя върху генетично развити невронни мрежи. Написах програма с помощта на Visual Studio 2005 през 2008 г. Сега преобразувах програмата в Eclipse (Linux) и VS 2013 (Win) проекти с поддръжка на c++11. След стартиране и двата проекта дадоха същата грешка:
вземане на адрес на временен [-fpermissive]
След много търсене открих, че тази грешка възниква, тъй като новите стандарти на C++ не позволяват да се вземе адрес на временен обект. Тъй като всички обекти се създават с помощта на "new" (така че предполагам, че те трябва да останат достъпни през цялото време). Разбрах частично проблема, но не знам как да го реша. Ако стартирате проекта eclipse, той ще подчертае само две грешки в проекта.
Тъй като е трудно да се обясни с думи, тъй като се нуждае от пълен код за изследване, така че хоствах eclipse проект на git на https://bitbucket.org/a-akram/geans.git, който направих достъпен за всички.
Основният проблем е с променливите wp1
& wp2
. m_vPopulatin
е вектор, съдържащ адреси на невронни мрежи.
CNeuralNetwork* CGeneticEngine::Evolve()
{
CLearningEngine *l;
double totalError = 0.0;
for (int iter = 0;iter < CGN_MAXITER; iter++)
{
for (int i = 0;i < CGN_POPULATION; i++)
{
l = new CLearningEngine(m_vPopulation[i]);
l->Run(m_vTrainingDataset);
for(unsigned int p = 0; p < m_vTrainingDataset->size(); p++)
{
totalError = totalError + m_vPopulation[i]->getm_dTotalNetworkError();
totalError = totalError/m_vTrainingDataset->size();
}
if (totalError < CGN_THRESHOLD)
return m_vPopulation[i];
m_dErrors[i] = totalError;
}
SortFitnesses();
NewPopulation();
}
return NULL;
}
void CGeneticEngine::NewPopulation()
{
int id1, id2;
double temp;
std::vector <CSynapticConnection *> *wp1;
std::vector <CSynapticConnection *> *wp2;
for (int i=0;i<CGN_POPULATION / 2;i++)
{
id1 = rand() % CGN_POPULATION / 2;
id2 = rand() % CGN_POPULATION / 2 + CGN_POPULATION / 2;
wp1 = &m_vPopulation[id1]->getm_vListofSynaptics();
wp2 = &m_vPopulation[id2]->getm_vListofSynaptics();
// Cross over the weights.
for (int j = 0; j < 2; j++)
{
temp = (*wp1)[j+6]->getWeight();
(*wp1)[j+6]->setWeight((*wp2)[j+6]->getWeight() );
(*wp2)[j+6]->setWeight(temp);
}
// adding slight genetic change due to crossover randomly.
if (rand() % 10 < 2)
{
for(unsigned int j = 0; j < wp1->size();j++)
(*wp1)[j]->changeWeight((double)(rand())/(32767/2) - 1);
for(unsigned int j = 0; j < wp2->size();j++)
(*wp2)[j]->changeWeight((double)(rand())/(32767/2) - 1);
}
}
}
Тъй като това е първият ми въпрос във форума, може да не съм формулирал добре, затова моля модераторите да не го затварят в момента. Ще го направя по-ясно, ако е необходимо. Но с файловете на проекта в ръка ще бъде много лесно за вас, момчета, да разберете проблема и решението.
Ще оценя високо вашата помощ за разрешаване на проблема... моля, уведомете ме, ако имате нужда от допълнителна информация.
l
? Използвайте интелигентни указатели. - person Neil Kirk   schedule 09.03.2015