Я работаю над генетически развитыми нейронными сетями. Я написал программу с использованием Visual Studio 2005 в 2008 году. Сейчас я преобразовал программу в проекты Eclipse (Linux) и VS 2013 (Win) с поддержкой С++ 11. После запуска оба проекта выдали одну и ту же ошибку:
получение адреса временного [-fpermissive]
После долгих поисков я обнаружил, что эта ошибка возникает, поскольку новые стандарты C++ не позволяют брать адрес временного объекта. Поскольку все объекты создаются с использованием «новых» (поэтому я думаю, они должны оставаться доступными все время). Частично разобрался с проблемой, но не знаю как решить. Если вы запустите проект 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