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

📄 umain.cpp

📁 本程序采用感知器算法进行分类设计
💻 CPP
字号:
//---------------------------------------------------------------------------

#include <vcl.h>
#pragma hdrstop

#include "uMain.h"
#include <comctrls.hpp>
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm1 *Form1;


//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
        : TForm(Owner)
{
  TListItem  *ListItem;
}
//---------------------------------------------------------------------------
float TForm1::Dist(float* w, float* x)
{
  float d = 0;
  for(int i = 0; i < 5; i++)
    d+=w[i]*x[i];
  return d;
}

//-------------------------------------------------------------------------

void __fastcall TForm1::btn1Click(TObject *Sender)
{
  lv1->Items->Clear();
  lv2->Items->Clear();
  lv3->Items->Clear();

  int SampleSN=0;//模式样本序号
  int iFileHandle,iFileLength,iBytesRead;
  char *PatternBuffer;
  if(dlgOpen1->Execute())
  {
    try
    {
      iFileHandle=FileOpen(dlgOpen1->FileName,fmOpenRead);
      iFileLength=FileSeek(iFileHandle,0,2);
      FileSeek(iFileHandle,0,0);
      PatternBuffer=new char[iFileLength+1];
      iBytesRead=FileRead(iFileHandle,PatternBuffer,iFileLength);
      FileClose(iFileHandle);
      bool ReadFlag=false;  //数据加入与否标志
      AnsiString EData="";  //读入有效数据
      TListItem *p;
      int DataDim=0;  //样本的维
      for(int i=0;i<iBytesRead;i++)
      {
         if((PatternBuffer[i]>='0'&&PatternBuffer[i]<='9')||PatternBuffer[i]=='.')
            {ReadFlag=true;EData+=PatternBuffer[i];}
         else
            {
              if(ReadFlag)
                 {
                   if(DataDim==0)
                   {
                     if(SampleSN<50)
                     {
                       p=lv1->Items->Add();
                       p->Caption=EData;
                     }
                     if(SampleSN>=50&&SampleSN<100)
                     {
                       p=lv2->Items->Add();
                       p->Caption=EData;
                     }
                     if(SampleSN>=100&&SampleSN<150)
                     {
                       p=lv3->Items->Add();
                       p->Caption=EData;
                     }
                   }
                   else{
                        p->SubItems->Add(EData);
                        Pattern[SampleSN][DataDim-1]=atof(EData.c_str());
                        PatternExpand[SampleSN][DataDim-1]=Pattern[SampleSN][DataDim-1];
                        }
                   //edt5->Text=FloatToStr(PatternExpand[1][4]);
                   EData="";
                   ReadFlag=false;
                   DataDim++;
                   if(DataDim==5)
                   {
                     PatternExpand[SampleSN][4]=1;
                     DataDim=0;
                     SampleSN++;

                   }
                   
                 }
            }
      }

  delete[] PatternBuffer;
    }
    catch(...)
    {
      Application->MessageBox("不能进行以下文件操作:打开、寻找、读取和关闭。", "File Error", IDOK);
    }
  }

 //用迭代法计算权向量
 float d1=0,d2=0,d3=0;
  //int t=&n;
  float w1[5]={0,0,0,0,0};
  float w2[5]={0,0,0,0,0};
  float w3[5]={0,0,0,0,0};
  float Buffw1[5]={0,0,0,0,0};
  float Buffw2[5]={0,0,0,0,0};
  float Buffw3[5]={0,0,0,0,0};
  for(int j=0;j<100000;j++)
  {

    int n=0;
    while(n<50)
    {
      //前50个样本
      d1=Dist(w1,PatternExpand[n]);
      d2=Dist(w2,PatternExpand[n]);
      d3=Dist(w3,PatternExpand[n]);
      if(d1<=d2||d1<=d3)
      {
        for(int i=0;i<5;i++)
          w1[i]+=PatternExpand[n][i];
        if(d1<=d2)
        {
          for(int i=0;i<5;i++)
            w2[i]-=PatternExpand[n][i];
        }
        if(d1<=d3)
        {
          for(int i=0;i<5;i++)
            w3[i]-=PatternExpand[n][i];
        }
      }

       //51--100的样本
      d1=Dist(w1,PatternExpand[n+50]);
      d2=Dist(w2,PatternExpand[n+50]);
      d3=Dist(w3,PatternExpand[n+50]);
      if(d2<=d1||d2<=d3)
      {
        for(int i=0;i<5;i++)
          w2[i]+=PatternExpand[n+50][i];
        if(d1<=d2)
        {
          for(int i=0;i<5;i++)
            w1[i]-=PatternExpand[n+50][i];
        }
        if(d1<=d3)
        {
          for(int i=0;i<5;i++)
            w3[i]-=PatternExpand[n+50][i];
        }
      }

      //101--150的样本
      if (n == 33)
      n = 34;
      if (n == 38)
      n = 39;
      /*if (n == 150)
      n = 0; */
      d1=Dist(w1,PatternExpand[n+100]);
      d2=Dist(w2,PatternExpand[n+100]);
      d3=Dist(w3,PatternExpand[n+100]);
      if(d3<=d1||d3<=d2)
      {
        for(int i=0;i<5;i++)
          w3[i]+=PatternExpand[n+100][i];
        if(d1<=d2)
        {
          for(int i=0;i<5;i++)
            w1[i]-=PatternExpand[n+100][i];
        }
        if(d1<=d3)
        {
          for(int i=0;i<5;i++)
            w2[i]-=PatternExpand[n+100][i];
        }
      }

      n++;

    }
    if(Buffw1[0]==w1[0]&&Buffw1[1]==w1[1]&&Buffw1[2]==w1[2]&&Buffw1[3]==w1[3]&&Buffw1[4]==w1[4]&&Buffw2[0]==w2[0]&&Buffw2[1]==w2[1]&&Buffw2[2]==w2[2]&&Buffw2[3]==w2[3]&&Buffw2[4]==w2[4]&&Buffw3[0]==w3[0]&&Buffw3[1]==w3[1]&&Buffw3[2]==w3[2]&&Buffw3[3]==w3[3]&&Buffw3[4]==w3[4])
      break;
    for(int i=0;i<5;i++)
      {
        Buffw1[i]=w1[i];
        Buffw2[i]=w2[i];
        Buffw3[i]=w3[i];
      }
  }
 //权向量计算完毕

 lv1->Visible=true;
 //float w11[5],w22[5],w33[5];
 btn2->Enabled=true;

 //显示权向量
 edt5->Text=FloatToStr(w1[0]);
 edt6->Text=FloatToStr(w1[1]);
 edt7->Text=FloatToStr(w1[2]);
 edt8->Text=FloatToStr(w1[3]);
 edt17->Text=FloatToStr(w1[4]);

 edt9->Text=FloatToStr(w2[0]);
 edt10->Text=FloatToStr(w2[1]);
 edt11->Text=FloatToStr(w2[2]);
 edt12->Text=FloatToStr(w2[3]);
 edt18->Text=FloatToStr(w2[4]);

 edt13->Text=FloatToStr(w3[0]);
 edt14->Text=FloatToStr(w3[1]);
 edt15->Text=FloatToStr(w3[2]);
 edt16->Text=FloatToStr(w3[3]);
 edt19->Text=FloatToStr(w3[4]);

   //w1[5]={0,0,0,0,0};
   //w2[5]={0,0,0,0,0};
   //w3[5]={0,0,0,0,0};

  w1[0]= StrToFloat(edt5->Text);
  w1[1]= StrToFloat(edt6->Text);
  w1[2]= StrToFloat(edt7->Text);
  w1[3]= StrToFloat(edt8->Text);
  w1[4]= StrToFloat(edt17->Text);

  w2[0]= StrToFloat(edt9->Text);
  w2[1]= StrToFloat(edt10->Text);
  w2[2]= StrToFloat(edt11->Text);
  w2[3]= StrToFloat(edt12->Text);
  w2[4]= StrToFloat(edt18->Text);

  w3[0]= StrToFloat(edt13->Text);
  w3[1]= StrToFloat(edt14->Text);
  w3[2]= StrToFloat(edt15->Text);
  w3[3]= StrToFloat(edt16->Text);
  w3[4]= StrToFloat(edt19->Text);
  ///////////////////////////////////////////////////////////////////
  //错误率
  int flag1=0,flag2=0,flag3=0;
  for(int n=0;n<50;n++)
  {
    float d1 = Dist(w1, PatternExpand[n]);
    float d2 = Dist(w2, PatternExpand[n]);
    float d3 = Dist(w3, PatternExpand[n]);
    //if(d1>d2&&d1>d3)
     // flag1++;
    if(d2>d1&&d2>d3)
      flag1++;
    if(d3>d1&&d3>d2)
      flag1++;

    d1 = Dist(w1, PatternExpand[n+50]);
    d2 = Dist(w2, PatternExpand[n+50]);
    d3 = Dist(w3, PatternExpand[n+50]);
    if(d1>d2&&d1>d3)
      flag2++;
    //if(d2>d1&&d2>d3)
      //flag1++;
    if(d3>d1&&d3>d2)
      flag2++;

    d1 = Dist(w1, PatternExpand[n+100]);
    d2 = Dist(w2, PatternExpand[n+100]);
    d3 = Dist(w3, PatternExpand[n+100]);
    if(d1>d2&&d1>d3)
      flag3++;
    if(d2>d1&&d2>d3)
      flag3++;
    //if(d3>d1&&d3>d2)
      //flag3++;
   }
  edt20->Text=IntToStr(50-flag1);
  edt21->Text=IntToStr(50-flag2);
  edt22->Text=IntToStr(50-flag3);
  edt23->Text=IntToStr(flag1+flag2+flag3);
  /////////////////////////////////////////////////////////////////
}
//---------------------------------------------------------------------------

void __fastcall TForm1::FormCreate(TObject *Sender)
{
  btn2->Enabled=false;
  for(int i=0;i<150;i++)
      for(int j=0;j<4;j++)
         Pattern[i][j]=0;
  for(int i=0;i<150;i++)
      for(int j=0;j<5;j++)
         PatternExpand[i][j]=0;
  //设置载入文件初始目录
  String InitDir=GetCurrentDir();
  dlgOpen1->InitialDir=InitDir;
}
//---------------------------------------------------------------------------

void __fastcall TForm1::btn3Click(TObject *Sender)
{
  this->Close();
}
//---------------------------------------------------------------------------

void __fastcall TForm1::btn2Click(TObject *Sender)
{
  //float dMax;
  float Userx1,Userx2,Userx3,Userx4;
  Userx1=StrToFloat(edt1->Text);
  Userx2=StrToFloat(edt2->Text);
  Userx3=StrToFloat(edt3->Text);
  Userx4=StrToFloat(edt4->Text);

  float x[5] = {Userx1, Userx2, Userx3, Userx4, 1};    // 增广考试样本向量
  //Application->MessageBox("w1:"+FloatToStr(w1[0]), "结果", MB_OK + MB_ICONINFORMATION);

  ////////////////////////////////////////////////////////////////
  float w1[5]={0,0,0,0,0};
  float w2[5]={0,0,0,0,0};
  float w3[5]={0,0,0,0,0};

  w1[0]= StrToFloat(edt5->Text);
  w1[1]= StrToFloat(edt6->Text);
  w1[2]= StrToFloat(edt7->Text);
  w1[3]= StrToFloat(edt8->Text);
  w1[4]= StrToFloat(edt17->Text);

  w2[0]= StrToFloat(edt9->Text);
  w2[1]= StrToFloat(edt10->Text);
  w2[2]= StrToFloat(edt11->Text);
  w2[3]= StrToFloat(edt12->Text);
  w2[4]= StrToFloat(edt18->Text);

  w3[0]= StrToFloat(edt13->Text);
  w3[1]= StrToFloat(edt14->Text);
  w3[2]= StrToFloat(edt15->Text);
  w3[3]= StrToFloat(edt16->Text);
  w3[4]= StrToFloat(edt19->Text);
  ///////////////////////////////////////////////////////////////////
  //错误率
  /*int flag1=0,flag2=0,flag3=0;
  for(int n=0;n<50;n++)
  {
    float d1 = Dist(w1, PatternExpand[n]);
    float d2 = Dist(w2, PatternExpand[n]);
    float d3 = Dist(w3, PatternExpand[n]);
    if(d1>d2&&d1>d3)
      flag1++;
    if(d2>d1&&d2>d3)
      flag2++;
    if(d3>d1&&d3>d2)
      flag3++;

    d1 = Dist(w1, PatternExpand[n+50]);
    d2 = Dist(w2, PatternExpand[n+50]);
    d3 = Dist(w3, PatternExpand[n+50]);
    if(d1>d2&&d1>d3)
      flag1++;
    if(d2>d1&&d2>d3)
      flag2++;
    if(d3>d1&&d3>d2)
      flag3++;

    d1 = Dist(w1, PatternExpand[n+100]);
    d2 = Dist(w2, PatternExpand[n+100]);
    d3 = Dist(w3, PatternExpand[n+100]);
    if(d1>d2&&d1>d3)
      flag1++;
    if(d2>d1&&d2>d3)
      flag2++;
    if(d3>d1&&d3>d2)
      flag3++;
  }
  edt20->Text=IntToStr(flag1);
  edt21->Text=IntToStr(flag2);
  edt22->Text=IntToStr(flag3);
  edt23->Text=IntToStr(50-flag1);  */
  /////////////////////////////////////////////////////////////////

  float d1 = Dist(w1, x);
  float d2 = Dist(w2, x);
  float d3 = Dist(w3, x);
  if (d1 == d2 || d2 == d3 || d1 == d3)         // 显示结果
  Application->MessageBox("此样本在决策面上,不可分!", "提示", MB_OK + 
      MB_ICONINFORMATION);
  else
  {
    //dMax = d1 > d2 ? d1 : d2;
    //dMax = dMax > d3 ? dMax : d3;
    if (d1>d2&&d1>d3)
    Application->MessageBox("此样本属于第一类!", "结果", MB_OK +
        MB_ICONINFORMATION);
    else
    {
      if (d2>d1&&d2>d3)
        Application->MessageBox("此样本属于第二类!", "结果", MB_OK +
        MB_ICONINFORMATION);
      else
        Application->MessageBox("此样本属于第三类!", "结果", MB_OK +
        MB_ICONINFORMATION);
    }
  }
}
//---------------------------------------------------------------------------

⌨️ 快捷键说明

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