📄 bpnet.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 + -