⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 geneticnet.cpp

📁 遗传算法优化神经网络的C源程序
💻 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 + -