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

📄 bpnet.cpp

📁 bp神经网络源程序
💻 CPP
字号:
#include "BPNet.h"
#include <cstdlib>
#include <iomanip.h>

CBPNet::CBPNet(char* InFileName,int n,int m):n(n),m(m),InputObj(InFileName,n,m)
{
}

CBPNet::~CBPNet()
{
 
}

 
void CBPNet::BPModel()
{
	InputObj.Initialize();
//生成中间测试数据,并存入文件TestData.dat中
	InputObj.BuildData(".\\TestData.dat");		
}
 

void CBPNet::BPModel(char* WeightFileName)
{
	int i,j,k,l,sum;
	double tempIn=0,tempOut=0,result;	
 	double TestData[5];
//WeightIn[][] :输入层到隐层节点的权重
//WeightOut[][]:隐层与输出层节点的权重
	double WeightIn[6][10],WeightOut[11][3];
	double DataMax=103.6,DataMin=37.5;

	char* TestFileName=".\\TestData.dat";	//测试数据文件
	char* DeTestFileName=".\\DeTestData.dat";	//测试数据反归一化后文件
	char* OutputFileName=".\\Result.dat";	//输出结果文件

 	ofstream OutFile(OutputFileName);
	ifstream WeightFile(WeightFileName);
	if(WeightFile.is_open()==0){
		cerr<<"Can't open the file--Weight.dat";
		exit(2);
	}
 	sum=(int)pow((double)n,4.0)*m;
 
	InputObj.Initialize();
//生成中间测试数据,并存入文件TestData.dat中
	InputObj.BuildData(TestFileName);

//从文件WeightFile中读入权重值
	for(i=0;i<6;i++){
		for(j=0;j<10;j++){
			WeightFile>>WeightIn[i][j];
		}
	}
	for(i=0;i<11;i++){
		for(j=0;j<3;j++){
			WeightFile>>WeightOut[i][j];
		}
	}
 //从TestFile文件中读取测试数据
 	ifstream TestFile(TestFileName);

//根据公式计算对应测试数据的输出,结果存入OutFile所指文件中
//函数:out(k)=f[∑ωjk·f(∑υij·χi)]
//函数:f(x)=1/(1+exp(-x))
	for(l=0;l<sum;l++){
		for(i=0;i<5;i++){
			if(!TestFile.eof()) TestFile>>TestData[i];
		}
		for(k=0;k<3;k++){
			tempOut=WeightOut[0][k];//注意此处+-(阈值)输出阈值存在WeightOut[0][i](i=0,1,3)
			for(j=1;j<11;j++){
				tempIn=WeightIn[0][j-1];//注意此处+-(阈值)输入阈值存在WeightIn[0][i](i=0,1,2,....,9)
				for(i=0;i<5;i++){
  					tempIn+=WeightIn[i+1][j-1]*TestData[i];
				}
				tempOut+=WeightOut[j][k]*BPFunction(tempIn);
			}
			result=BPFunction(tempOut);
			result=result*(DataMax-DataMin)+DataMin;	//输出结果反归一化
  			OutFile<<result<<"\t\t";					//结果存放在文件OutFile中
		}
 		OutFile<<"\n";
	}
	//输入数据的反归一化
	InputObj.DeInitialize(TestFileName,DeTestFileName);

  	OutFile.close();
	WeightFile.close();
 	TestFile.close();
}

inline double CBPNet::BPFunction(double x)
{
	return (double)1.0/(1.0+exp(-x));
}
 
void CBPNet::Optimize(char* OptimizeFileName,double target)
{
	int i,j,k=0,sum;
  	double temp,tempIn[5],tempOut[3];
	char* InFileName1=".\\DeTestData.dat";
	char* InFileName2=".\\Result.dat";
  	ifstream InFile1(InFileName1);
	ifstream InFile2(InFileName2);
	ofstream OptimizeFile(OptimizeFileName);
 	sum=(int)pow((double)n,4.0)*m;
 	OptimizeFile<<"The result of Standard Back Prop. method"<<endl<<"target is "<<target<<"%"<<endl<<endl;
	OptimizeFile<<"A/Cu\t Zn/Cu\t B/Cu\t C/Cu\t Mn/Cu\t TR%\t Y_OH1%\t S_OH1%"<<endl;
	for(i=0;i<sum;i++){
		for(j=0;j<5;j++){
			InFile1>>tempIn[j];
		}
		temp=1.0;
		for(j=0;j<3;j++){
			InFile2>>tempOut[j];
			temp*=tempOut[j];
		}
		if(temp>pow(target,3.0)){
			for(j=0;j<5;j++){
				OptimizeFile<<setprecision(4)<<tempIn[j]<<"\t ";
			}
			for(j=0;j<3;j++){
				OptimizeFile<<tempOut[j]<<"\t ";
			}
			OptimizeFile<<endl;
			k++;
		}
	}
	OptimizeFile<<"\nThe amount of all the items which corresponds to Target="
		<<target<<"% is "<<k;
	InFile1.close();
	InFile2.close();
	OptimizeFile.close();
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -