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

📄 verfahren.cc

📁 模糊聚类的算法实现程序
💻 CC
字号:
/********************************************************//*   filename: verfahren.cc                             *//*                                                      *//********************************************************//* programmed by: Oliver Wagner                         *//* last change: 22-03-95                                *//********************************************************/#include "verfahren.h"void Verfahren1 (Datensatz & DieDaten, Regelbasis & ResultRegeln,	    Clustering & ResultCluster){  int i;  ResultRegeln. ~ Regelbasis ();  printf ("\nVerfahren1\n");/**********************************//**** Cluster im Output finden ****//**********************************/  {    BVektor DieseClustern (DieDaten.Lese_InputDim () + DieDaten.Lese_OutputDim (), NULL);    for (i = DieDaten.Lese_InputDim ();	 i < DieDaten.Lese_InputDim () + DieDaten.Lese_OutputDim ();	 i++)      DieseClustern.Setze_i (i, TRUE);    ResultCluster.Setze_relevant (DieseClustern);    ResultCluster.Clustere (DieDaten.Lese_Daten ());  }/**** Cluster im Output finden ****//****************************************//********** Regeln finden ***************//****************************************/  {    BVektor DieseInputs, DieseOutputs;/*********************************************/    /*          PARAMETER IDENTIFIKATION         *//*********************************************/    DieseInputs = Parameter_Identifikation (ResultCluster.Lese_Zugehoerigkeit (),					    DieDaten.Lese_InputDim (),					    DieDaten.Lese_OutputDim (),					    DieDaten.Lese_Daten ());    DieseOutputs.BVektor (DieDaten.Lese_OutputDim (), NULL);    for (i = 0; i < DieDaten.Lese_OutputDim (); i++)      DieseOutputs.Setze_i (i, TRUE);    DieDaten.Setze_Relevant (DieseInputs.concat (DieseOutputs));/*****************************************/    /* jetzt Regeln fuer relevante Parameter *//*****************************************/    ResultRegeln = Finde_Regeln (ResultCluster,				 CLUSTER_KONVEXGRENZE,				 DieDaten,				 DieDaten.Lese_InputDim (),				 DieseInputs.concat (DieseOutputs),				 Trapez);  }/****      Regeln finden       ****//*    double Test,das;   for(Test=-9 ; Test <= 9 ; Test++)   {   ResultRegeln.Berechne(&Test,&das);   printf("%f:%f\n",Test,das);   } */  printf ("\nO.K.\n");  ResultRegeln.print ();};/********************************************************************//********************************************************************/BVektor Parameter_Identifikation (DMatrix & Zugehoerigkeit,			  int InputDim, int OutputDim,			  DVektorArray & Daten)  return Result (InputDim, NULL);{  int VektorNr, i, j, k, GroesseA, GroesseB, DimNr, guter_Index, aktuelleDim;  DVektorArray VektorenA, VektorenB, OutputA, OutputB;  DVektor VektorBuffer;  BVektor ProjBool (InputDim, NULL), Output (OutputDim, NULL);  double Fehler = MAXDOUBLE, FehlerBuffer = MAXDOUBLE;  char Fertig;  Regelbasis RegelnA, RegelnB;  DMatrix A, B;			/* Y-Werte der Kurven *//************TEST***************//**/ for(i=0;i<InputDim;i++) /**//**/ Result.Setze_i(i,TRUE); /**//**/ return(Result);	     /**//*******************************//********************************************//* Zunaechst einige Elemente initialisieren *//********************************************/  for (i = 0; i < OutputDim; i++)    Output.Setze_i (i, TRUE);  /* Die Zugehoerigkeiten als Zwei Matrizen */  GroesseA = Daten.Lese_Groesse () / 2;  GroesseB = Daten.Lese_Groesse () - GroesseA;  A.DMatrix (Zugehoerigkeit.Lese_Dim_m (), GroesseA, NULL);  B.DMatrix (Zugehoerigkeit.Lese_Dim_m (), GroesseB, NULL);  for (i = 0; i < Zugehoerigkeit.Lese_Dim_m (); i++) {    for (j = 0, k = 0; k < GroesseA; j += 2)      A.Setze_i_j (i, k++, Zugehoerigkeit.Lese_i_j (i, j));    for (j = 1, k = 0; k < GroesseB; j += 2)      B.Setze_i_j (i, k++, Zugehoerigkeit.Lese_i_j (i, j));  }  /* Ausgaben fuer die Modelle */  OutputA.DVektorArray (OutputDim, GroesseA, NULL);  OutputB.DVektorArray (OutputDim, GroesseB, NULL);  for (DimNr = 0; DimNr < OutputDim; DimNr++) {    for (VektorNr = 0, i = 0; i < GroesseA; VektorNr += 2)      OutputA.Setze_Vektor (i++, DimNr, Daten[VektorNr][DimNr + InputDim]);    for (VektorNr = 1, i = 0; i < GroesseB; VektorNr += 2)      OutputB.Setze_Vektor (i++, DimNr, Daten[VektorNr][DimNr + InputDim]);  }  /* Zwei Gruppen von Daten */  VektorenA.DVektorArray (Daten.Lese_Dim (), GroesseA, NULL);  VektorenB.DVektorArray (Daten.Lese_Dim (), GroesseB, NULL);  for (VektorNr = 0, i = 0; i < GroesseA; VektorNr += 2)    VektorenA.Setze_Vektor (i++, Daten[VektorNr]);  for (VektorNr = 1, i = 0; i < GroesseB; VektorNr += 2)    VektorenB.Setze_Vektor (i++, Daten[VektorNr]);/**************************//* Jetzt geht es aber los *//**************************/  aktuelleDim = 0;  do {    aktuelleDim++;    Fertig = TRUE;    VektorBuffer.DVektor (aktuelleDim, 0, NULL);    for (DimNr = 0; DimNr < InputDim; DimNr++) {      if (Result.Lese_i (DimNr) == FALSE) {	/* Dimension soll ja um 1 hoeher werden */	ProjBool.Setze_i (DimNr, TRUE);/* erst einmal auslassen *//*        RegelnA=Finde_Regeln(A,CLUSTER_KONVEXGRENZE,VektorenA,aktuelleDim,   ProjBool.concat(Output),Trapez);   RegelnB=Finde_Regeln(B,CLUSTER_KONVEXGRENZE,VektorenB,aktuelleDim,   ProjBool.concat(Output),Trapez);   FehlerBuffer=Berechne_RC(VektorenA,VektorenB,   OutputA,OutputB,   RegelnA,RegelnB); */	RegelnA. ~ Regelbasis ();	RegelnB. ~ Regelbasis ();	if (FehlerBuffer < Fehler) {	  Fertig = FALSE;	/* Verbesserung war moeglich */	  guter_Index = DimNr;	  Fehler = FehlerBuffer;	}	ProjBool.Setze_i (DimNr, FALSE);	/*wieder zurueck */      }				/* if(Result->Lese_i(DimNr) == FALSE) */    }				/* for(DimNr=0 ; DimNr < InputDim ; DimNr++) */    if (Fertig == FALSE)      Result.Setze_i (guter_Index, TRUE);    VektorenA. ~ DVektorArray ();    VektorenB. ~ DVektorArray ();    VektorBuffer. ~ DVektor ();  } while ((!(Fertig)) && (aktuelleDim < InputDim));	/* wieder groesserer Fehler ?? */};/*****************************************************************/void Verfahren2 (Datensatz & DieDaten, Regelbasis & ResultRegeln,	    Clustering & ResultCluster){  int i;  printf ("\nVerfahren2\n");  ResultRegeln. ~ Regelbasis ();/************************//**** Cluster finden ****//************************/  {    BVektor DieseClustern (DieDaten.Lese_InputDim () + DieDaten.Lese_OutputDim (), NULL);    for (i = 0; i < DieDaten.Lese_InputDim () + DieDaten.Lese_OutputDim (); i++)      DieseClustern.Setze_i (i, TRUE);    ResultCluster.Setze_relevant (DieseClustern);    ResultCluster.Clustere (DieDaten.Lese_Daten ());  }/**** Cluster im Output finden ****//*********************************/  /*    relevante Input setzen     *//*********************************/  {    BVektor DieseInputs (DieDaten.Lese_InputDim ()), DieseOutputs (DieDaten.Lese_OutputDim ());    for (i = 0; i < DieDaten.Lese_InputDim (); i++)      DieseInputs.Setze_i (i, TRUE);    for (i = 0; i < DieDaten.Lese_OutputDim (); i++)      DieseOutputs.Setze_i (i, TRUE);    DieDaten.Setze_Relevant (DieseInputs.concat (DieseOutputs));/*********************************/    /*  Regeln berechnen lassen      *//*********************************/    ResultRegeln = Ermittle_Regeln (ResultCluster,				    CLUSTER_KONVEXGRENZE,				    DieDaten,				    DieDaten.Lese_InputDim (),				 DieseInputs.concat (DieseOutputs), Trapez);/*    double Test,das;   for(Test=-9 ; Test <= 9 ; Test++)   {   ResultRegeln.Berechne(&Test,&das);   printf("%f:%f\n",Test,das);   } */  }};

⌨️ 快捷键说明

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