📄 bpnetdlg.cpp
字号:
flaghand3=TRUE;
Invalidate();
for(int m=0;m<N;m++)
{
for(int i=0;i<IN1;i++)
{
GetWorkData>>Work_Data[m].input[i]; //取得输入数据
}
for(int j=0;j<ON;j++)
{
GetWorkData>>Work_Data[m].teach[j]; //取得输出数据
}
}
GetWorkData.close();
}
else
{ AfxMessageBox("请载入泛化样本!!!");
buttonflag5=FALSE;
return;
}
for(int ii=0;ii<IN1;ii++)
{
fanhuainputmax[ii]=Work_Data[0].input[ii];
fanhuainputmin[ii]=Work_Data[0].input[ii];
}
for(int jj=0;jj<ON;jj++)
{
fanhuateachmax[jj]=Work_Data[0].teach[jj];
fanhuateachmin[jj]=Work_Data[0].teach[jj];
}
////////以下是找到泛化样本的最大最小值
for(int m=0;m<N;m++)
{
for(int ii=0;ii<IN1;ii++)
{
if(Work_Data[m].input[ii]>=fanhuainputmax[ii])
fanhuainputmax[ii]=Work_Data[m].input[ii];
if(Work_Data[m].input[ii]<=fanhuainputmin[ii])
fanhuainputmax[ii]=Work_Data[m].input[ii];
}
for(int jj=0;jj<ON;jj++)
{
if(Work_Data[m].teach[jj]>=fanhuateachmax[jj])
fanhuateachmax[jj]=Work_Data[m].teach[jj];
if(Work_Data[m].teach[jj]<=fanhuateachmin[jj])
fanhuateachmin[jj]=Work_Data[m].teach[jj];
}
}
////////以上是找到泛化样本的最大最小值
//////以下找到两个样本中的最大最小值
for(int i=0;i<IN1;i++)
{
if(traininputmax[i]<fanhuainputmax[i])
traininputmax[i]=fanhuainputmax[i];
if(traininputmin[i]>fanhuainputmin[i])
traininputmin[i]=fanhuainputmin[i];
}
for(i=0;i<ON;i++)
{
if(trainteachmax[i]<fanhuateachmax[i])
trainteachmax[i]=fanhuateachmax[i];
if(trainteachmin[i]>fanhuateachmin[i])
trainteachmin[i]=fanhuateachmin[i];
}
//////以上找到两个样本中的最大最小值
///////开始调整数据
for(m=0;m<N;m++)
{
for(i=0;i<IN1;i++)
{
Study_Data[m].input[i]=(Study_Data[m].input[i]-traininputmin[i])/(traininputmax[i]-traininputmin[i]);
Work_Data[m].input[i]=(Work_Data[m].input[i]-traininputmin[i])/(traininputmax[i]-traininputmin[i]); //取得输入数据
}
for(int j=0;j<ON;j++)
{
{
Study_Data[m].teach[j]=(Study_Data[m].teach[j]-trainteachmin[j])/(trainteachmax[j]-trainteachmin[j]);
}
{
Work_Data[m].teach[j]=(Work_Data[m].teach[j]-trainteachmin[j])/(trainteachmax[j]-trainteachmin[j]);
}
//取得输出数据
}
}
}
flaghand3=TRUE;
flaghand2=FALSE;
Invalidate();
}
void CBPnetDlg::OnInitial()
{
flaghand3=FALSE;
//隐层权、阈值初始化//
if(buttonflag2==FALSE)
{
AfxMessageBox("请先载入数据!");
return;
}
else
{
flaghand4=TRUE;
SetTimer(1,500,NULL);
srand( (unsigned)time( NULL ) );
for(int i=0;i<HN;i++)
{
for(int j=0;j<IN1;j++)
{ W[i][j]= (double)((rand()/32767.0)*2-1); //初始化输入层到隐层的权值,随机模拟0 和 1 -1
Winitial[i][j]=W[i][j];
old_W[i][j]=W[i][j];
}
}
for(int ii=0;ii<ON;ii++)
{
for(int jj=0;jj<HN;jj++)
{ V[ii][jj]= (double)((rand()/32767.0)*2-1); //初始化隐层到输出层的权值,随机模拟0 和 1 -1
Vinitial[ii][jj]=V[ii][jj];
old_V[ii][jj]=V[ii][jj];
}
}
for(int k=0;k<HN;k++)
{
YU_HN[k] = (double)((rand()/32888.0)*2-1);//隐层阈值初始化 ,-0.01 ~ 0.01 之间
YU_HNinitial[k]=YU_HN[k];
}
for(int kk=0;kk<ON;kk++)
{
YU_ON[kk] = (double)((rand()/32888.0)*2-1); //输出层阈值初始化 ,-0.01 ~ 0.01 之间
YU_ONinitial[kk]=YU_ON[kk];
}
Flagpicture=1;
Invalidate();
buttonflag3=TRUE;
}
}
void CBPnetDlg::OnTrain()
{
for(int i=0;i<100;i++)
{
err[i]=0;
errwork[i]=0;
}
flagerrpicture=TRUE;
flagdynamic=TRUE;
if(buttonflag3==FALSE)
{
AfxMessageBox("请先初使化网络!");
return;
}
else
{
buttonflag4=TRUE;
Flagpicture=0;// 标志位,使初使化数据消失
KillTimer(1);// 使初使化闪烁效果消失
clear1();
clear2();
clear3();
clear4();
do
{
++study;
for (int m=0;m<N;m++)
{
intput_P(m); //输入第m个学习样本 (2)
intput_T(m);//输入第m个样本的教师信号 (3)
input_Pwork(m);
input_Twork(m);
H_I_O(); //第m个学习样本隐层各单元输入、输出值 (4)
O_I_O(); //第m个学习样本输出层各单元输入、输出值 (5)
H_I_Owork();
O_I_Owork();
Err_O_H(m); //第m个学习样本输出层至隐层一般化误差 (6)
Err_O_Hwork(m);
Err_H_I(); //第m个学习样本隐层至输入层一般化误差 (7)
Delta_O_H(m,study); //第m个学习样本输出层至隐层权阈值调整、修改 (8)
Delta_H_I(m,study); //第m个学习样本隐层至输入层权阈值调整、修改 (9)
c+=err[m];
cwork+=errwork[m];
saveWV();
}
//全部样本训练完毕
cwork=cwork/Nfanhua;
c=c/N;
cerror[study]=c;
cerrorwork[study]=cwork;
errworkpicture();
errpicture();
if(f2==0)
{
if(c<=wucha)
{
break;
}
}
if(f2==1)
{
if(study>=times)
{
break;
}
}
if(f2==2)
{
if(c<=wucha)
{
break;
}
if(study>=times)
{
break;
}
}
c=0;
cwork=0;
} while (1);
flaghand6=TRUE;
flaghand4=FALSE;
Invalidate();
}
}
HBRUSH CBPnetDlg::OnCtlColor(CDC* pDC, CWnd* pWnd, UINT nCtlColor)
{
HBRUSH hbr = CDialog::OnCtlColor(pDC, pWnd, nCtlColor);
if(pWnd->GetDlgCtrlID()==IDC_1)
{pDC->SetTextColor(RGB(255,255,255));
pDC->SetBkMode(TRANSPARENT);
return m_brush;
}
if(pWnd->GetDlgCtrlID()==IDC_2)
{pDC->SetTextColor(RGB(255,255,255));
pDC->SetBkMode(TRANSPARENT);
return m_brush;
}
if(pWnd->GetDlgCtrlID()==IDC_3)
{pDC->SetTextColor(RGB(255,255,255));
pDC->SetBkMode(TRANSPARENT);
return m_brush;
}
if(pWnd->GetDlgCtrlID()==IDC_EDIT1)
{
pDC->SetBkMode(TRANSPARENT);
return m_brush2;
}
if(pWnd->GetDlgCtrlID()==IDC_EDIT3)
{
pDC->SetBkMode(TRANSPARENT);
return m_brush2;
}
if(pWnd->GetDlgCtrlID()==IDC_EDIT2)
{
pDC->SetBkMode(TRANSPARENT);
return m_brush2;
}
if(pWnd->GetDlgCtrlID()==IDC_EDIT4)
{
pDC->SetBkMode(TRANSPARENT);
return m_brush2;
}
if(pWnd->GetDlgCtrlID()==IDC_EDIT5)
{
pDC->SetBkMode(TRANSPARENT);
return m_brush2;
}
if(pWnd->GetDlgCtrlID()==IDC_EDIT6)
{
pDC->SetBkMode(TRANSPARENT);
return m_brush2;
}
return m_brush;
}
void CBPnetDlg::OnSet()
{
N=50;
Nfanhua=50;
CSetDlg dlg;
dlg.m_a=a1;
dlg.m_b=b1;
dlg.m_alp=alpha;
dlg.m_in=aa;
dlg.m_on=cc;
dlg.m_hn=bb;
if(dlg.DoModal()==IDOK)
{
flaghand2=TRUE;
flaghand1=FALSE;
buttonflag1=TRUE;
HN=dlg.m_hn;
ON=dlg.m_on;
IN1=dlg.m_in;
a1=dlg.m_a;
b1=dlg.m_b;
alpha=dlg.m_alp;
Pre_error=dlg.Pre_error;
}
Flagpicture=0;
Invalidate();
}
void CBPnetDlg::picture1()
{
CPaintDC dc(this);
pWnd = GetDlgItem(IDC_EDIT2);
pDC = pWnd->GetDC();
pWnd->Invalidate();
pWnd->UpdateWindow();
pDC->TextOut(0,45,"输入层神经元个数:");
pDC->TextOut(0,70,"隐层神经元个数:");
pDC->TextOut(0,95,"输出层神经元个数:");
pDC->TextOut(0,165,"输出层至隐层的学习效率:");
pDC->TextOut(0,190,"输出层至隐层的学习效率:");
pDC->TextOut(0,220,"动量因子:");
CString str1,str2,str3,str4,str5,str6;
str1.Format("%d",aa);
str2.Format("%d",bb);
str3.Format("%d",cc);
str4.Format("%.1f",a1);
str5.Format("%.1f",b1);
str6.Format("%.1f",alpha);
pDC->TextOut(150,45,str1);
pDC->TextOut(150,70,str2);
pDC->TextOut(150,95,str3);
pDC->TextOut(200,165,str4);
pDC->TextOut(200,190,str5);
pDC->TextOut(200,220,str6);
CFont font;
font.CreatePointFont(200,"黑体",NULL);
pDC->SelectObject(&font);
pDC->SetTextColor(RGB(255,0,0));
pDC->TextOut(25,0,"神经元网络结构");
pDC->TextOut(25,120,"神经元网络参数");
}
void CBPnetDlg::picture2()
{
pWnd = GetDlgItem(IDC_EDIT3);
pDC = pWnd->GetDC();
pWnd->Invalidate();
pWnd->UpdateWindow();
pDC->SetTextColor(RGB(250,0,0));
pDC->TextOut(0,0,"输入层至隐层权值:");
CString str[10][10];
for(int i=0;i<HN;i++)
{
for(int j=0;j<IN1;j++)
{ str[i][j].Format("%.2f",Winitial[i][j]);
pDC->TextOut(i*40,20+20*j,str[i][j]);
}
}
}
void CBPnetDlg::picture3()
{
pWnd = GetDlgItem(IDC_EDIT4);
pDC = pWnd->GetDC();
pWnd->Invalidate();
pWnd->UpdateWindow();
pDC->SetTextColor(RGB(250,0,0));
pDC->TextOut(0,0,"隐层至输出层权值:");
CString str[10][10];
for(int i=0;i<ON;i++)
{
for(int j=0;j<HN;j++)
{
str[i][j].Format("%.2f",Vinitial[i][j]);
pDC->TextOut(i*40,20+20*j,str[i][j]);
}
}
}
void CBPnetDlg::picture4()
{
pWnd = GetDlgItem(IDC_EDIT5);
pDC = pWnd->GetDC();
pWnd->Invalidate();
pWnd->UpdateWindow();
pDC->SetTextColor(RGB(250,0,0));
pDC->TextOut(0,0,"隐层阈值:");
CString str[10];
for(int k=0;k<HN;k++)
{
str[k].Format("%.2f",YU_HNinitial[k]);
pDC->TextOut(0,20+20*k,str[k]);
}
}
void CBPnetDlg::picture5()
{
pWnd = GetDlgItem(IDC_EDIT6);
pDC = pWnd->GetDC();
pWnd->Invalidate();
pWnd->UpdateWindow();
pDC->SetTextColor(RGB(250,0,0));
pDC->TextOut(0,0,"输出层阈值:");
CString str[10];
for(int k=0;k<ON;k++)
{
str[k].Format("%.2f",YU_ONinitial[k]);
pDC->TextOut(0,20+20*k,str[k]);
}
}
void CBPnetDlg::introducepicture()
{
pWnd = GetDlgItem(IDC_INTRODUCE);
pDC = pWnd->GetDC();
pWnd->Invalidate();
pWnd->UpdateWindow();
CRect rect;
pWnd-> GetClientRect(rect);
pDC->SetBkMode(TRANSPARENT);
pDC->SetTextColor(RGB(120,192,255));
pDC->SelectObject(&font3);
pDC->TextOut(0,0,"作者:张学进 信研0501");
pDC->TextOut(0,20,"关于神经元网络的BP算法");
}
void CBPnetDlg::OnTimer(UINT nIDEvent)
{
if(nIDEvent==1)
{
static int a=0;
a++;
if(a==4)
{
a=1;
}
if(Flagpicture==1)
{
pWnd = GetDlgItem(IDC_EDIT3);
pDC = pWnd->GetDC();
if(a%2==0)
{
pDC->SetTextColor(RGB(250,0,0));
}
else
{pDC->SetTextColor(RGB(250,255,255));
}
pDC->TextOut(160,120,"初使化...");
}
if(Flagpicture==1)
{
pWnd = GetDlgItem(IDC_EDIT4);
pDC = pWnd->GetDC();
if(a%2==0)
{
pDC->SetTextColor(RGB(250,0,0));
}
else
{pDC->SetTextColor(RGB(250,255,255));
}
pDC->TextOut(160,120,"初使化...");
}
if(Flagpicture==1)
{
pWnd = GetDlgItem(IDC_EDIT5);
pDC = pWnd->GetDC();
if(a%2==0)
{
pDC->SetTextColor(RGB(250,0,0));
}
else
{pDC->SetTextColor(RGB(250,255,255));
}
pDC->TextOut(160,120,"初使化...");
}
if(Flagpicture==1)
{
pWnd = GetDlgItem(IDC_EDIT6);
pDC = pWnd->GetDC();
if(a%2==0)
{
pDC->SetTextColor(RGB(250,0,0));
}
else
{pDC->SetTextColor(RGB(250,255,255));
}
pDC->TextOut(160,120,"初使化...");
}
}
else
{
CRect dlgRect;
GetWindowRect(dlgRect); //当前对话框窗口大小
if (flagsuofang==0)
{ if(dlgRect.Width() < (dlgWidth - dlgDx))
MoveWindow
(
( -dlgDx+DesktopRect.Width() - dlgRect.Width() )/2,
( -dlgDy+DesktopRect.Height() - dlgRect.Height() )/2,
+dlgDx+dlgRect.Width(),
+dlgDy+dlgRect.Height()
);
else
MoveWindow
(
( -dlgDx+DesktopRect.Width() - dlgRect.Width() )/2,
( -dlgDy+DesktopRect.Height() - dlgRect.Height() )/2,
1200,
+dlgDy+dlgRect.Height()
);
//if (( dlgRect.Width() >= (dlgWidth - dlgDx) )|| ( dlgRect.Height() >= (dlgHeight - dlgDy)))
if ( ( dlgRect.Height() >= (dlgHeight - dlgDy)))
{
::KillTimer(this->m_hWnd, 0);
}
}
}
CDialog::OnTimer(nIDEvent);
}
void CBPnetDlg::picture()
{
CPaintDC dc(this);
pWnd = GetDlgItem(IDC_EDIT1);
pDC = pWnd->GetDC();
pWnd->Invalidate();
pWnd->UpdateWindow();
CRect rectClient;
pWnd->GetClientRect(rectClient);
pDC->SetMapMode(MM_ISOTROPIC);
pDC->SetWindowExt(12500,1000);
int orgh=rectClient.Width()/9;
int orgz=4*rectClient.Height()/5;
pDC->SetViewportExt(rectClient.right,-rectClient.bottom);
pDC->SetViewportOrg(orgh,orgz);
CBrush *pBrush=CBrush::FromHandle((HBRUSH)GetStockObject(NULL_BRUSH));
CPen* oldpen=pDC->SelectObject(&pen1);
pDC->SelectObject(&pBrush);
CRect rect;
pWnd-> GetClientRect(rect);
pDC->Rectangle(CRect(0,4000,10000,0));
pDC->SelectObject(&pen3);
for(int i=0;i<9;i++)
{
pDC->MoveTo(1000+i*1000,4000);
pDC->LineTo(1000+i*1000,0);
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -