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

📄 unit1.c

📁 一个bp算法
💻 C
字号:
//---------------------------------------------------------------------------
#include <stdio.h>
#include <math.h>
#include <conio.h>
#include <stdlib.h>
#pragma hdrstop
//---------------------------------------------------------------------------
#define nh 4
#define ni 9
#define nj 3
#define nk 30
#define nr 0.85/*学习效率*/
#define EPS 0.00001
#pragma argsused

float x[nk][nh],d[nk][nj],whi[nh][ni],wij[ni][nj],thi[ni],thj[nj];
int h,i,j,k;
float xmin[nh],xmax[nh],dmin[nj],dmax[nj];
FILE *fp1,*fp2;

void init(void);
void startleaning(void);
void testsample(void);
void readw(void);
void writew(void);
float sigmoid(float a);
double ranu(void); 

void init(void) 
{
        int min,max;

        if(fp1==0)
        {
                clrscr();
                printf("Can not find the learning sample file!\n");
                exit(0);
        }
        for(k=0;k<nk;k++)
        {
                for(h=0;h<nh;h++)
                        fscanf(fp1,"%f",&x[k][h]);
                for(j=0;j<nj;j++)
                        fscanf(fp1,"%f",&d[k][j]);
        }
        for(h=0;h<nh;h++)
        {
                min=1;max=1;
                for(k=0;k<nk;k++)
                {
                        if(x[k][h]<x[min][h]) min=k;
                        if(x[k][h]>x[max][h]) max=k;
                }
                xmin[h]=x[min][h];
                xmax[h]=x[max][h];
                for(k=0;k<nk;k++)/*归一化*/
                        x[k][h]=(x[k][h]-xmin[h])/(xmax[h]-xmin[h]);
        }
        for(j=0;j<nj;j++)
        {
                min=1;max=1;
                for(k=0;k<nk;k++)
                {
                        if(d[k][j]<d[min][j]) min=k;
                        if(d[k][j]>d[max][j]) max=k;
                }
                dmin[j]=d[min][j];
                dmax[j]=d[max][j];
                for(k=0;k<nk;k++)/*归一化*/
                        d[k][j]=(d[k][j]-dmin[j])/(dmax[j]-dmin[j]);
  

        }
} 
/*----------------------------------------------------*/ 
void startlearning(void) 
{
        long int nt,n;
        float t,error[nk],gerror,xj[nj],xi[ni],yj[nj],yi[ni],pxi[ni],pxj[nj];
        if(fp2==0)
        {
                for(i=0;i<ni;i++)
                {
                        for(h=0;h<nh;h++)
                        whi[h]=-0.1+0.2*ranu();
                        for(j=0;j<nj;j++)
                                wij[j]=-0.1+0.2*ranu();
                        thi[i]=-0.1+0.2*ranu();
                }
                for(j=0;j<nj;j++)
                        thj[j]=-0.1+0.2*ranu();
                fp2=fopen("w.txt","w+");
        }
        else
                readw();

        /*学习开始*/
        printf("\t\nPlease enter the learning times:\n");
        scanf("%ld",&nt);
        for(n=0;n<nt;n++)   /*学习次数*/
        {
                gerror=0;
                for(k=0;k<nk;k++)/*单样本循环*/
                {
                        for(i=0;i<ni;i++)
                        {
                                t=0;
                                for(h=0;h<nh;h++)
                                        t+=whi[h]*x[k][h];
                                xi[i]=t+thi[i];
                                yi[i]=sigmoid(xi[i]);
                        }
                        for(j=0;j<nj;j++)
                        {
                                t=0;
                                for(i=0;i<ni;i++)
                                        t+=wij[j]*yi;
                                xj[j]=t+thj[j];
                                yj[j]=sigmoid(xj[j]);
                        }

                        for(j=0;j<nj;j++)/*输出层单样本点误差变化率*/
                                pxj[j]=yj[j]*(1-yj[j])*(yj[j]-d[k][j]);
                        for(i=0;i<ni;i++)/*隐层单样本点误差变化率*/
                        {
                                t=0;
                                for(j=0;j<nj;j++)
                                        t+=pxj[j]*wij[j];
                                pxi=yi[i]*(1-yi[i])*t;
                        }
                        for(j=0;j<nj;j++)
                        {
                                thj[j]=thj[j]-nr*pxj[j];
                                for(i=0;i<ni;i++)
                                wij[j]=wij[j]-nr*pxj[j]*yi;
                        }
                        for(i=0;i<ni;i++)
                        {
                                thi=thi-nr*pxi;
                                for(h=0;h<nh;h++)
                                        whi[h]=whi[h]-nr*pxi*x[k][h];
                        }

                        t=0;
                        for(j=0;j<nj;j++)
                                t+=(yj[j]-d[k][j])*(yj[j]-d[k][j])/2.0;
                        error[k]=t;
                        gerror+=error[k];/*全局误差 g(lobal)error*/
                }/*单样本循环结束*/
                if(gerror<EPS) break;
        }/* 学习循环结束*/
        writew();
        printf("\t\nGlobal error=%f\n",gerror);
        printf("\t\nAre you satisfied with the global error?\n");
        printf("Press any key to choose a next task!\n");
        getch();

} 
/*-------------------------------------------------*/ 
void testsample(void)
{
        float tx[nh],t,xj[nj],xi[ni],yj[nj],yi[ni];
        if(fp2==0)
        {
                clrscr();
                printf("\t\ncan not find the weight file:w.txt\n");
                exit(0);
         }
        readw();
        printf("\t\nPlease enter the test data:\n");
        for(h=0;h<nh;h++)
                scanf("%f",&tx[h]);
        for(h=0;h<nh;h++)
                tx[h]=(tx[h]-xmin[h])/(xmax[h]-xmin[h]);
        for(i=0;i<ni;i++)
        {
                t=0;
                for(h=0;h<nh;h++)
                        t+=whi[h]*tx[h];
                xi=t+thi;
                yi=sigmoid(xi);
        }
        for(j=0;j<nj;j++)
        {
                t=0;
                for(i=0;i<ni;i++)
                        t+=wij[j]*yi;
                xj[j]=t+thj[j];
                yj[j]=sigmoid(xj[j]);
        }
        printf("\t\nNetwork output:\n");
    
        for(j=0;j<nj;j++)
        {
                yj[j]=yj[j]*(dmax[j]-dmin[j])+dmin[j];
                printf("%f ",yj[j]);
        }
        printf("\t\nAre you satisfied with the output?\n");
        printf("Press any key to choose a next task!\n");
        getch();
}
/*----------------------------------------------*/ 
void writew(void) 
{ 
        rewind(fp2);
        for(h=0;h<nh;h++)
        {
                for(i=0;i<ni;i++)
                        fprintf(fp2,"%8.3f ",whi[h]);
                fprintf(fp2,"\n");
        }
        fprintf(fp2,"\n");

        for(i=0;i<ni;i++)
                fprintf(fp2,"%8.3f ",thi);
        fprintf(fp2,"\n\n");

        for(j=0;j<nj;j++)
        {
                for(i=0;i<ni;i++)
                        fprintf(fp2,"%8.3f ",wij[j]);
                fprintf(fp2,"\n");
        }
        fprintf(fp2,"\n");
        for(j=0;j<nj;j++)
                fprintf(fp2,"%8.3f ",thj[j]);
}
/*------------------------------------------------*/
void readw(void) 
{ 
        for(h=0;h<nh;h++)
        for(i=0;i<ni;i++)
                fscanf(fp2,"%f",&whi[h]);
        for(i=0;i<ni;i++)
                fscanf(fp2,"%f",&thi);
        for(j=0;j<nj;j++)
                for(i=0;i<ni;i++)
                        fscanf(fp2,"%f",&wij[j]);
        for(j=0;j<nj;j++)
                fscanf(fp2,"%f",&thj[j]);
} 
/*--------------------------------*/
float sigmoid(float a) 
{
        return(1.0/(1+exp(-a)));
}

/*----------------------------------*/ 
double ranu(void)
{
        static double xrand=3.0;
        double m=8589934592.0,
        a=30517578125.0;
lp:     xrand=fmod(xrand*a,m);
        if(xrand>1.0)
                return(xrand/m);
        else
        {
                xrand=1.0;
                goto lp;
        }
}
/*----------------------------------*/

int main(int argc, char* argv[])
{
        fp1=fopen("sample.txt","r");
        fp2=fopen("w.txt","r+");
        init();
        while(1)
        {
                clrscr();
                printf("\t\n    Please choose a next task...\n\n");
                printf("\t\n     (S) to start learning.\n");
                printf("\t\n     (T) to test samples.\n");
                printf("\t\n     (R) to resume learning.\n");
                printf("\t\n     (Q)uit.\n");
                switch(getchar())
                {
                        case 's': startlearning();break;
                        case 't': testsample();break;
                        case 'r': startlearning();break;
                        case 'q': exit(0);break;
                }
        }
        fclose(fp1);
        fclose(fp2);
        return 0;
}
//---------------------------------------------------------------------------

⌨️ 快捷键说明

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