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