📄 geneticnet.cpp
字号:
#include <stdlib.h>
#include <time.h>
#include "geneticnet.h"
CGeneticNet::CGeneticNet() {
srand((unsigned)(time(NULL)));
for (int i=0;i<CGN_POPULATION;i++) {
// Weights automatically initialized
// in neural network constructor.
m_pcPopulation[i] = new CSimpleNet;
}
}
CGeneticNet::~CGeneticNet() {
for (int i=0;i<CGN_POPULATION;i++) {
delete m_pcPopulation[i];
}
}
CSimpleNet *CGeneticNet::Run() {
float error = 0.0f;
for (int iter=0;iter<CGN_MAXITER;iter++) {
for (int i=0;i<CGN_POPULATION;i++) {
error = ((m_pcPopulation[i]->Train(0,0,0) +
m_pcPopulation[i]->Train(0,1,1) +
m_pcPopulation[i]->Train(1,0,1) +
m_pcPopulation[i]->Train(1,1,0)) / 4.0f);
if (error < CGN_THRESHOLD) return m_pcPopulation[i];
m_fErrors[i] = error;
}
SortFitnesses();
NewPopulation();
}
return NULL;
}
void CGeneticNet::SortFitnesses() {
int n = CGN_POPULATION;
int disorder = n;
while (disorder) {
disorder = 0;
for(int i=1;i<n;i++) {
if (m_fErrors[i] < m_fErrors[i-1]) {
float m_fTemp = m_fErrors[i-1];
m_fErrors[i-1] = m_fErrors[i];
m_fErrors[i] = m_fTemp;
CSimpleNet *tempnn = m_pcPopulation[i-1];
m_pcPopulation[i-1] = m_pcPopulation[i];
m_pcPopulation[i] = tempnn;
disorder++;
}
}
n--;
}
}
void CGeneticNet::NewPopulation() {
int id1, id2;
float *wp1 = new float[9];
float *wp2 = new float[9];
for (int i=0;i<CGN_POPULATION / 2;i++) {
id1 = rand() % CGN_POPULATION / 2;
id2 = rand() % CGN_POPULATION / 2 + CGN_POPULATION / 2;
m_pcPopulation[id1]->GetWeights(wp1);
m_pcPopulation[id2]->GetWeights(wp2);
for (int j=0;j<2;j++) {
float temp;
temp = wp1[j+6];
wp1[j+6] = wp2[j+6];
wp2[j+6] = temp;
}
if (rand() % 10 < 2) {
for (int i=0;i<3;i++) {
for (int j=0;j<3;j++) {
m_pcPopulation[id1]->AlterWeights((float)(rand())/(32767/2) - 1);
m_pcPopulation[id2]->AlterWeights((float)(rand())/(32767/2) - 1);
}
}
}
m_pcPopulation[id2]->SetWeights(wp1);
}
delete [] wp1;
delete [] wp2;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -