You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
plogjtkff 6f8acdf13b
Update README.md
2 years ago
README.md Update README.md 2 years ago

README.md

BPnetwork11

#include <stdio.h> #include <math.h> #include <stdlib.h> #include <time.h>

#define INNODE 2 // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ԫ<EFBFBD><D4AA><EFBFBD><EFBFBD> #define HIDENODE 12// <20><><EFBFBD>ز<EFBFBD><D8B2><EFBFBD>Ԫ<EFBFBD><D4AA><EFBFBD><EFBFBD> #define OUTNODE 1 // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ԫ<EFBFBD><D4AA><EFBFBD><EFBFBD>

/**

  • <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ѧϰ<EFBFBD>ʣ<EFBFBD> */ double StudyRate = 1.2;

/**

  • <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> */ double threshold = 1e-4;

/**

  • <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> */ int mostTimes = 1e6;

/**

  • ѵ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>С */ int trainSize = 0;

/**

  • <EFBFBD><EFBFBD><EFBFBD>Լ<EFBFBD><EFBFBD><EFBFBD>С */ int testSize = 0;

/**

  • <EFBFBD><EFBFBD><EFBFBD><EFBFBD> */ typedef struct Sample{ double out[30][OUTNODE]; // <20><><EFBFBD> double in[30][INNODE]; // <20><><EFBFBD><EFBFBD> }Sample;

/**

  • <EFBFBD><EFBFBD>Ԫ<EFBFBD><EFBFBD><EFBFBD> */ typedef struct Node{ double value; // <20><>ǰ<EFBFBD><C7B0>Ԫ<EFBFBD><D4AA><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ֵ double bias; // <20><>ǰ<EFBFBD><C7B0>Ԫ<EFBFBD><D4AA><EFBFBD>ƫƫ<C6AB><C6AB>ֵ double bias_delta; // <20><>ǰ<EFBFBD><C7B0>Ԫ<EFBFBD><D4AA><EFBFBD>ƫ<EFBFBD><C6AB>ֵ<EFBFBD><D6B5><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ֵ double *weight; // <20><>ǰ<EFBFBD><C7B0>Ԫ<EFBFBD><D4AA><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>һ<EFBFBD><D2BB><EFBFBD><EFBFBD><E3B4AB><EFBFBD><EFBFBD>Ȩֵ double *weight_delta; // <20><>ǰ<EFBFBD><C7B0>Ԫ<EFBFBD><D4AA><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>һ<EFBFBD><D2BB><EFBFBD><EFBFBD><E3B4AB><EFBFBD><EFBFBD>Ȩֵ<C8A8><D6B5><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ֵ }Node;

/**

  • <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> / Node inputLayer[INNODE]; /*
  • <EFBFBD><EFBFBD><EFBFBD>ز<EFBFBD> / Node hideLayer[HIDENODE]; /*
  • <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> */ Node outLayer[OUTNODE];

double Max(double a, double b){ return a > b ? a : b; }

//<2F><><EFBFBD> double sigmoid(double x){ double y,z; y=exp(x); z=y/(1+y); return z;

}

/**

  • <EFBFBD><EFBFBD>ȡѵ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>
  • @param filename <20>ļ<EFBFBD><C4BC><EFBFBD>
  • @return ѵ<><D1B5><EFBFBD><EFBFBD> / Sample * getTrainData(const char * filename){ Sample * result = (Sample)malloc(sizeof (Sample)); FILE * file = fopen(filename, "r"); if(file != NULL){ int count = 0; while (fscanf(file, "%lf %lf %lf", &result->in[count][0], &result->in[count][1], &result->out[count][0]) != EOF){ ++count; } trainSize = count; printf("%s The file has been successfully read!\n", filename); fclose(file); return result; } else{ fclose(file); printf("%s Encountered an error while opening the file!\n\a", filename); return NULL; } }

/**

  • <EFBFBD><EFBFBD>ȡ<EFBFBD><EFBFBD><EFBFBD>Լ<EFBFBD>

  • @param filename <20>ļ<EFBFBD><C4BC><EFBFBD>

  • @return <20><><EFBFBD>Լ<EFBFBD> / Sample * getTestData(const char * filename){ /<EFBFBD><EFBFBD><EFBFBD>ڴ<EFBFBD><EFBFBD>з<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ŀռ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>һ<EFBFBD><EFBFBD>Sample<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ָ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ڴ<EFBFBD><EFBFBD><EFBFBD>ָ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>result<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>/ Sample * result=(Sample)malloc(sizeof(Sample)); FILE * file = fopen(filename, "r");//<2F><><EFBFBD>ļ<EFBFBD> if(file!= NULL){ // <20><>ʼ<EFBFBD><CABC>һ<EFBFBD><D2BB><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>count<6E><74><EFBFBD><EFBFBD><EFBFBD>ڸ<EFBFBD><DAB8>ٶ<EFBFBD>ȡ<EFBFBD><C8A1><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> int count=0; /<EFBFBD><EFBFBD><EFBFBD><EFBFBD>whileѭ<EFBFBD><EFBFBD><EFBFBD>Ӳ<EFBFBD><EFBFBD>Լ<EFBFBD><EFBFBD>ļ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ж<EFBFBD>ȡ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ֱ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ȡ<EFBFBD><EFBFBD><EFBFBD>ļ<EFBFBD>ĩβ<EFBFBD><EFBFBD> ÿ<>γɹ<CEB3><C9B9><EFBFBD>ȡһ<C8A1><D2BB><EFBFBD><EFBFBD><EFBFBD>ݺ󣬵<DDBA><F3A3ACB5><EFBFBD>count<6E><74>/ while (fscanf(file, "%lf %lf", &result->in[count][0], &result->in[count][1])!=EOF){ ++count; } //<2F><><EFBFBD><EFBFBD><EFBFBD>յ<EFBFBD>count<6E><74>ֵ<EFBFBD><EFBFBD><E6B4A2><EFBFBD><EFBFBD>ΪtestSize<7A><65>ȫ<EFBFBD>ֱ<EFBFBD><D6B1><EFBFBD><EFBFBD>У<EFBFBD><D0A3>Ա<EFBFBD><D4B1><EFBFBD><EFBFBD>ʹ<EFBFBD><CAB9> testSize=count; printf("%s The file has been successfully read!\n", filename); fclose(file); //<2F><><EFBFBD><EFBFBD>result return result;

    }else{ fclose(file); printf("%s Encountered an error while opening the file!\n\a", filename); return NULL; } }

/**

  • <EFBFBD><EFBFBD>ӡ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>
  • @param data Ҫ<><D2AA>ӡ<EFBFBD><D3A1><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
  • @param size <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>С */ void printData(Sample * data, int size){ int i; if(data==NULL){ printf("Sample is empty!"); return; } else{ for(i=0;i<testSize;i++) { printf("%f %f ",data->in[i][0],data->in[i][1]); printf("%f",data->out[i][0]); printf("\n"); } } }

/**

  • <EFBFBD><EFBFBD>ʼ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> */ void init(){ // <20><><EFBFBD><EFBFBD>ʱ<EFBFBD><CAB1><EFBFBD>Ϊ<EFBFBD><CEAA><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>е<EFBFBD><D0B5><EFBFBD><EFBFBD><EFBFBD> srand(time(NULL));

    // <20><><EFBFBD><EFBFBD><EFBFBD>ij<EFBFBD>ʼ<EFBFBD><CABC> for (int i = 0; i < INNODE; ++i) { inputLayer[i].weight = (double *)malloc(sizeof (double ) * HIDENODE); inputLayer[i].weight_delta = (double *) malloc(sizeof (double ) * HIDENODE); inputLayer[i].bias = 0.0; inputLayer[i].bias_delta = 0.0; }

    // <20><><EFBFBD><EFBFBD><EFBFBD>Ȩֵ<C8A8><D6B5>ʼ<EFBFBD><CABC> for (int i = 0; i < INNODE; ++i) { for (int j = 0; j < HIDENODE; ++j) { inputLayer[i].weight[j] = rand() % 10000 / (double )10000 * 2 - 1.0; inputLayer[i].weight_delta[j] = 0.0; } }

    // <20><>ʼ<EFBFBD><CABC><EFBFBD><EFBFBD><EFBFBD>ز<EFBFBD><D8B2><EFBFBD> for (int i = 0; i < HIDENODE; ++i) { /*Ϊ<><CEAA><EFBFBD>ز<EFBFBD>ڵ<EFBFBD> i <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>һ<EFBFBD><D2BB> double <20><><EFBFBD>͵<EFBFBD><CDB5><EFBFBD><EFBFBD><EFBFBD><E9A3AC><EFBFBD>ڴ洢<DAB4>ýڵ<C3BD><DAB5><EFBFBD><EFBFBD><EFBFBD>һ<EFBFBD><D2BB>ڵ㴫<DAB5><E3B4AB><EFBFBD><EFBFBD>Ȩ<EFBFBD>ء<EFBFBD> ʹ<><CAB9>malloc <20><><EFBFBD><EFBFBD><EFBFBD>ڶ<EFBFBD><DAB6>ڴ<EFBFBD><DAB4>з<EFBFBD><D0B7><EFBFBD><EFBFBD><EFBFBD>Ŀռ<D5BC>Դ洢 OUTNODE <20><> double <20><><EFBFBD>͵<EFBFBD>Ȩ<EFBFBD><C8A8>ֵ<EFBFBD><D6B5> */

     hideLayer[i].weight = (double *)malloc(sizeof(double)*OUTNODE);
     /*Ϊ<><CEAA><EFBFBD>ز<EFBFBD>ڵ<EFBFBD> i <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>һ<EFBFBD><D2BB><EFBFBD><EFBFBD><EFBFBD>ڴ洢Ȩ<E6B4A2><C8A8><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ֵ<EFBFBD><D6B5><EFBFBD><EFBFBD><EFBFBD><EFBFBD><E9A1A3><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><E9BDAB><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ѵ<EFBFBD><D1B5><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ڴ洢Ȩ<E6B4A2>صĸ<D8B5><C4B8><EFBFBD>ֵ<EFBFBD><D6B5>
     ʹ<><CAB9>malloc <20><><EFBFBD><EFBFBD><EFBFBD>ڶ<EFBFBD><DAB6>ڴ<EFBFBD><DAB4>з<EFBFBD><D0B7><EFBFBD><EFBFBD><EFBFBD>Ŀռ<D5BC>Դ洢 OUTNODE <20><> double <20><><EFBFBD>͵<EFBFBD>Ȩ<EFBFBD><C8A8>ֵ<EFBFBD><D6B5>
     */
     hideLayer[i].weight_delta =(double*)malloc(sizeof(double)*OUTNODE);
     /*Ϊ<><CEAA><EFBFBD>ز<EFBFBD>ڵ<EFBFBD> i <20><>ʼ<EFBFBD><CABC><EFBFBD><EFBFBD>һ<EFBFBD><D2BB><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ƫ<EFBFBD><C6AB>ֵ<EFBFBD><D6B5>
     <20><><EFBFBD>ֵͨ<D6B5><CDA8><EFBFBD><EFBFBD>һ<EFBFBD><D2BB><EFBFBD><EFBFBD> -1.0 <20><> 1.0 ֮<><D6AE><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ڵ<EFBFBD><DAB5><EFBFBD><EFBFBD>ýڵ<C3BD>ļ<EFBFBD><C4BC><EFBFBD><EEBAAF><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ֵ<EFBFBD><D6B5>
     */
     hideLayer[i].bias =  rand() % 10000 / (double )10000 * 2 - 1.0;
     /*<2A><>ʼ<EFBFBD><CABC><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ز<EFBFBD>ڵ<EFBFBD> i <20><>ƫ<EFBFBD><C6AB>ֵ<EFBFBD><D6B5><EFBFBD><EFBFBD>ֵ<EFBFBD><D6B5><EFBFBD><EFBFBD>ʼֵΪ0.0<EFBFBD><EFBFBD>*/
     hideLayer[i].bias_delta = 0.0;
    

    }

    // <20><>ʼ<EFBFBD><CABC><EFBFBD><EFBFBD><EFBFBD>ز<EFBFBD>Ȩֵ for (int i = 0; i < HIDENODE; ++i) { for (int j = 0; j < OUTNODE; ++j) { hideLayer[i].weight[j] = rand() % 10000 / (double )10000 * 2 - 1.0; hideLayer[i].weight_delta[j] = 0.0; } }

    for (int i = 0; i < OUTNODE; ++i) { outLayer[i].bias = rand() % 10000 / (double )10000 * 2 - 1.0; outLayer[i].bias_delta = 0.0; }

}

/**

  • <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ֵ */ void resetDelta(){ for (int i = 0; i < INNODE; ++i) { for (int j = 0; j < HIDENODE; ++j) { inputLayer[i].weight_delta[j] = 0.0; } }

    for (int i = 0; i < HIDENODE; ++i) { hideLayer[i].bias_delta = 0.0; for (int j = 0; j < OUTNODE; ++j) { hideLayer[i].weight_delta[j] = 0.0; } }

    for (int i = 0; i < OUTNODE; ++i) { outLayer[i].bias_delta = 0.0; } }

int main() { // <20><>ʼ<EFBFBD><CABC> init(); // <20><>ȡѵ<C8A1><D1B5><EFBFBD><EFBFBD> Sample * trainSample = getTrainData("TrainData.txt"); // printData(trainSample, trainSize);

for (int trainTime = 0; trainTime < mostTimes; ++trainTime) {
    // <20><><EFBFBD><EFBFBD><EFBFBD>ݶ<EFBFBD><DDB6><EFBFBD>Ϣ
    resetDelta();

    // <20><>ǰѵ<C7B0><D1B5><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
    double error_max = 0.0;

    // <20><>ʼѵ<CABC><D1B5><EFBFBD><EFBFBD><EFBFBD>ۼ<EFBFBD>bp<62><70>
    for (int currentTrainSample_Pos = 0; currentTrainSample_Pos < trainSize; ++currentTrainSample_Pos) {

        // <20><><EFBFBD><EFBFBD><EFBFBD>Ա<EFBFBD><D4B1><EFBFBD>
        for (int inputLayer_Pos = 0; inputLayer_Pos < INNODE; ++inputLayer_Pos) {
            inputLayer[inputLayer_Pos].value = trainSample->in[currentTrainSample_Pos][inputLayer_Pos];
        }

        /** ----- <20><>ʼ<EFBFBD><CABC><EFBFBD>򴫲<EFBFBD> ----- */
        for (int hideLayer_Pos = 0; hideLayer_Pos < HIDENODE; ++hideLayer_Pos) {
            double sum = 0.0;
            for (int inputLayer_Pos = 0; inputLayer_Pos < INNODE; ++inputLayer_Pos) {
                sum += inputLayer[inputLayer_Pos].value * inputLayer[inputLayer_Pos].weight[hideLayer_Pos];
            }

            sum -= hideLayer[hideLayer_Pos].bias;
            hideLayer[hideLayer_Pos].value = sigmoid(sum);
        }
        /**       <20><><EFBFBD><EFBFBD><EFBFBD>ز<EFBFBD><D8B2><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><E3B4AB>  */ 
        for (int outLayer_Pos = 0;  outLayer_Pos < OUTNODE ; ++outLayer_Pos) {
            double sum = 0.0;
            for (int hideLayer_Pos = 0; hideLayer_Pos < HIDENODE; ++hideLayer_Pos) {
                /*<2A><><EFBFBD><EFBFBD>ÿһ<C3BF><D2BB><EFBFBD><EFBFBD><EFBFBD>ز<EFBFBD>ڵ<EFBFBD><DAB5>value<75><65>Ȩֵ<C8A8>ij˻<C4B3><CBBB><EFBFBD><EFBFBD><EFBFBD>ӵõ<D3B5>sum*/
                sum+=hideLayer[hideLayer_Pos].value * hideLayer[hideLayer_Pos].weight[outLayer_Pos];
                
            }
            /*<2A><><EFBFBD><EFBFBD>sum<75><6D>ʹsum<75><6D>ȥƫ<C8A5><C6AB>ֵ;

            */sum-=outLayer[outLayer_Pos].bias;
            outLayer[outLayer_Pos].value=sigmoid(sum);
            /*<2A><><EFBFBD><EFBFBD>sigmod<6F><64><EFBFBD><EFBFBD><EFBFBD>Եõ<D4B5><C3B5><EFBFBD>sum<75><6D><EFBFBD>м<EFBFBD><D0BC><EFBFBD>Ѽ<EFBFBD><D1BC><EFBFBD><EFBFBD>Ľ<EFBFBD><C4BD><EFBFBD><EFBFBD>ֵ<EFBFBD><D6B5><EFBFBD><EFBFBD>Ӧ<EFBFBD><D3A6><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ڵ<EFBFBD>value(outLayer[outLayer_Pos].value)<29><>
            
            */
        }


        /** ----- <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> ----- */
        double error = 0.0;
        for (int outLayer_Pos = 0; outLayer_Pos < OUTNODE; ++outLayer_Pos) {
            double temp = fabs(outLayer[outLayer_Pos].value - trainSample->out[currentTrainSample_Pos][outLayer_Pos]);
            // <20><>ʧ<EFBFBD><CAA7><EFBFBD><EFBFBD>
            error += temp * temp / 2.0;
        }
        
        error_max = Max(error_max, error);
        
        
        /** ----- <20><><EFBFBD>򴫲<EFBFBD> ----- */
        for (int outLayer_Pos = 0; outLayer_Pos < OUTNODE; ++outLayer_Pos) {
            double bias_delta = -(trainSample->out[currentTrainSample_Pos][outLayer_Pos] - outLayer[outLayer_Pos].value)
                    * outLayer[outLayer_Pos].value * (1.0 - outLayer[outLayer_Pos].value);
            outLayer[outLayer_Pos].bias_delta += bias_delta;
        }

        for (int hideLayer_Pos = 0; hideLayer_Pos < HIDENODE; ++hideLayer_Pos) {
            for (int outLayer_Pos = 0; outLayer_Pos < OUTNODE; ++outLayer_Pos) {
                double weight_delta = (trainSample->out[currentTrainSample_Pos][outLayer_Pos] - outLayer[outLayer_Pos].value)
                                      * outLayer[outLayer_Pos].value * (1.0 - outLayer[outLayer_Pos].value)
                                      * hideLayer[hideLayer_Pos].value;
                hideLayer[hideLayer_Pos].weight_delta[outLayer_Pos] += weight_delta;
            }
        }

        //
        for (int hideLayer_Pos = 0; hideLayer_Pos < HIDENODE; ++hideLayer_Pos) {
            double sum = 0.0;
            for (int outLayer_Pos = 0; outLayer_Pos < OUTNODE; ++outLayer_Pos) {
                sum += -(trainSample->out[currentTrainSample_Pos][outLayer_Pos] - outLayer[outLayer_Pos].value)
                       * outLayer[outLayer_Pos].value * (1.0 - outLayer[outLayer_Pos].value)
                       * hideLayer[hideLayer_Pos].weight[outLayer_Pos];
            }
            hideLayer[hideLayer_Pos].bias_delta += sum * hideLayer[hideLayer_Pos].value * (1.0 - hideLayer[hideLayer_Pos].value);
        }


        for (int inputLayer_Pos = 0; inputLayer_Pos < INNODE; ++inputLayer_Pos) {
            for (int hideLayer_Pos = 0; hideLayer_Pos < HIDENODE; ++hideLayer_Pos) {
                double sum  = 0.0;
                for (int outLayer_Pos = 0; outLayer_Pos < OUTNODE; ++outLayer_Pos) {
                    sum += (trainSample->out[currentTrainSample_Pos][outLayer_Pos] - outLayer[outLayer_Pos].value)
                           * outLayer[outLayer_Pos].value * (1.0 - outLayer[outLayer_Pos].value)
                           * hideLayer[hideLayer_Pos].weight[outLayer_Pos];
                }
                inputLayer[inputLayer_Pos].weight_delta[hideLayer_Pos] += sum * hideLayer[hideLayer_Pos].value * (1.0 - hideLayer[hideLayer_Pos].value)
                                                                          * inputLayer[inputLayer_Pos].value;
            }
        }

    }


    // <20>ж<EFBFBD><D0B6><EFBFBD><EFBFBD><EFBFBD>Ƿ<EFBFBD><EFBFBD><EFB5BD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Χ
    if(error_max < threshold){
        printf("\a Training completed!Total training count:%d,  maximum error is:%f\n", trainTime + 1, error_max);
        break;
    }

    // <20><><EFBFBD><EFBFBD>޷<EFBFBD><DEB7><EFBFBD><EFBFBD>ܣ<EFBFBD><DCA3><EFBFBD>ʼ<EFBFBD><CABC><EFBFBD><EFBFBD>

    for (int inputLayer_Pos = 0; inputLayer_Pos < INNODE; ++inputLayer_Pos) {
        for (int hideLayer_Pos = 0; hideLayer_Pos < HIDENODE; ++hideLayer_Pos) {
            inputLayer[inputLayer_Pos].weight[hideLayer_Pos] += StudyRate
                                                                * inputLayer[inputLayer_Pos].weight_delta[hideLayer_Pos] /
                                                                (double) trainSize;
        }
    }

    for (int hideLayer_Pos = 0; hideLayer_Pos < HIDENODE; ++hideLayer_Pos) {
        hideLayer[hideLayer_Pos].bias += StudyRate
                * hideLayer[hideLayer_Pos].bias_delta / (double )trainSize;
        for (int outLayer_Pos = 0; outLayer_Pos < OUTNODE; ++outLayer_Pos) {
            hideLayer[hideLayer_Pos].weight[outLayer_Pos] += StudyRate
                    * hideLayer[hideLayer_Pos].weight_delta[outLayer_Pos] / (double )trainSize;
        }
    }

    for (int outLayer_Pos = 0; outLayer_Pos < OUTNODE; ++outLayer_Pos) {
        outLayer[outLayer_Pos].bias += StudyRate
                * outLayer[outLayer_Pos].bias_delta / (double )trainSize;
    }
}

// ѵ<><D1B5><EFBFBD><EFBFBD>ɣ<EFBFBD><C9A3><EFBFBD>ȡ<EFBFBD><C8A1><EFBFBD>Լ<EFBFBD>
Sample * testSample = getTestData("TestData.txt");
printf("The predicted results are as follows:\n");
for (int currentTestSample_Pos = 0; currentTestSample_Pos < testSize; ++currentTestSample_Pos) {
    for (int inputLayer_Pos = 0; inputLayer_Pos < INNODE; ++inputLayer_Pos) {
        inputLayer[inputLayer_Pos].value = testSample->in[currentTestSample_Pos][inputLayer_Pos];
    }

    for (int hideLayer_Pos = 0; hideLayer_Pos < HIDENODE; ++hideLayer_Pos) {
        double sum = 0.0;
        for (int inputLayer_Pos = 0; inputLayer_Pos < INNODE; ++inputLayer_Pos) {
            sum += inputLayer[inputLayer_Pos].value * inputLayer[inputLayer_Pos].weight[hideLayer_Pos];
    }
        sum -= hideLayer[hideLayer_Pos].bias;
        hideLayer[hideLayer_Pos].value = sigmoid(sum);
    }

    for (int outLayer_Pos = 0; outLayer_Pos < OUTNODE; ++outLayer_Pos) {
        double sum = 0.0;
        for (int hideLayer_Pos = 0; hideLayer_Pos < HIDENODE; ++hideLayer_Pos) {
            sum += hideLayer[hideLayer_Pos].value * hideLayer[hideLayer_Pos].weight[outLayer_Pos];
        }
        sum -= outLayer[outLayer_Pos].bias;
        outLayer[outLayer_Pos].value = sigmoid(sum);
    }

    for (int outLayer_Pos = 0; outLayer_Pos < OUTNODE; ++outLayer_Pos) {
        testSample->out[currentTestSample_Pos][outLayer_Pos] = outLayer[outLayer_Pos].value;
    }
}
printData(testSample, testSize);
return 0;

}