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

📄 贝叶斯决策dlg.cpp

📁 贝叶斯决策解决城市最短路径问题,人工只能实验项目
💻 CPP
📖 第 1 页 / 共 2 页
字号:
	m=j=0;
	
	if(filedialog.DoModal()==IDOK)
	{
		pFileName=filedialog.GetPathName();
			m_List3.ResetContent();
			m_List2.ResetContent();	
			m_List1.ResetContent();
			m_List4.ResetContent();
			f=0;
	}
	if (pFileName!="") 
	{
	fp=fopen(pFileName,"r");
	fscanf(fp,"%d,",&i);
	fscanf(fp,"%d,",&k);
	
	m_Lei=i;
	m_TeZheng=k;
	n=new int[i];
	move=true;
	for(m=0;m<i;m++)
			fscanf(fp,"%d,",&n[m]);	
	for(m=0;m<i;m++)
		j+=n[m];
    master=new int [j*k];
	
	for(m=0;m<j*k;m++)
		fscanf(fp,"%d,",&master[m]);
	fclose(fp);

	m_List1.ResetContent();
	for(m=1;m<=i;m++)
	{
	str.Format("第%d类",m);
	m_List1.AddString((LPCTSTR)str);
	}
	m_List1.SetCurSel(0);

	m_List2.ResetContent();
	for(m=1;m<=k;m++)
	{
		str.Format("特征%d",m);
		m_List2.AddString((LPCTSTR)str);
	}
	m_List2.SetCurSel(0);

	m_List3.ResetContent();
	for(m=0;m<n[0];m++)
	{
		str.Format("%d",master[m]);
		m_List3.AddString((LPCTSTR)str);
	}
    UpdateData(false);
	}
}

void CMyDlg::OnSelchangeList1() 
{
	// TODO: Add your control notification handler code here
	int l,g,m;
	int num; 
	CString str;
	m=num=0;
	l=m_List2.GetCurSel();
	g=m_List1.GetCurSel();
	m_List3.ResetContent();
	
	for(m=0;m<g;m++)
		num+=n[m];
	for(m=0;m<n[g];m++)
	{
		str.Format("%d",master[num*m_TeZheng+n[g]*(l)+m]);
		m_List3.AddString((LPCTSTR)str);
	}	
}

void CMyDlg::OnSelchangeList2() 
{
	// TODO: Add your control notification handler code here
	int l,g,m;
	int num; 
	CString str;
	m=num=0;
	l=m_List2.GetCurSel();
	g=m_List1.GetCurSel();
	m_List3.ResetContent();

	for(m=0;m<g;m++)
		num+=n[m];
	for(m=0;m<n[g];m++)
		{
			str.Format("%d",master[num*m_TeZheng+n[g]*(l)+m]);
			m_List3.AddString((LPCTSTR)str);
		}


		
//	m_List2.GetText(i,str);
}

void CMyDlg::OnSelchangeList3() 
{
	// TODO: Add your control notification handler code here
	int i; CString str;
	i=m_List3.GetCurSel();
	m_List3.GetText(i,str);
}

void CMyDlg::OnButton2() 
{
	// TODO: Add your control notification handler code here
	UpdateData(true);
	if (k==0||i==0) 
	{
		MessageBox("训练样本不合格!");
		return;
	}
	if(f==k)
	{
		MessageBox("样本已经达到上限!");
    return;
	}
    if(m_X!="")
	{	
	m_List4.AddString((LPCTSTR)m_X);
	f++;
	}
	else
	{
		MessageBox("请输入样本值!");
		return;
	}
	UpdateData(false);
	
}

void CMyDlg::OnRadio1() 
{
	// TODO: Add your control notification handler code here
	select=true;
	((CButton*)GetDlgItem(IDC_RADIO1))->SetCheck(1);
	((CButton*)GetDlgItem(IDC_RADIO2))->SetCheck(0);
}

void CMyDlg::OnRadio2() 
{
	// TODO: Add your control notification handler code here
	select=false;
	((CButton*)GetDlgItem(IDC_RADIO2))->SetCheck(1);
	((CButton*)GetDlgItem(IDC_RADIO1))->SetCheck(0);
}

///////////////////////////////////////////
void CMyDlg::ivy(double *a,int n)
{
	int i,j,k;
	for(k=0;k<n;k++){
		for(i=0;i<n;i++){
			if(i!=k)
				*(a+i*n+k)=-*(a+i*n+k)/(*(a+k*n+k));
		}
		*(a+k*n+k)=1/(*(a+k*n+k));
		for(i=0;i<n;i++){
			if(i!=k){
				for(j=0;j<n;j++){
					if(j!=k)
						*(a+i*n+j)+=*(a+k*n+j)* *(a+i*n+k);
				}
			}
		}
		for(j=0;j<n;j++){
			if(j!=k)
				*(a+k*n+j)*=*(a+k*n+k);
		}
	}
	
}

void CMyDlg::mult(double *m1,double *m2,double *result,int i_1,int j_12,int j_2)
{
	int i,j,k;
	for(i=0;i<i_1;i++)
		for(j=0;j<j_2;j++)
		{
			result[i*j_2+j]=0.0;
			for(k=0;k<j_12;k++)
				result[i*j_2+j]+=m1[i*j_12+k]*m2[j+k*j_2];
		}
		return;
		
}

void CMyDlg::transpose(double *m1,double *m2,int m,int n)
{
	int i,j;
	for(i=0;i<m;i++)
		for(j=0;j<n;j++)
			m2[j*m+i]=m1[i*n+j];
		return;
		
}

int CMyDlg::Max(double *s,int m)
{
	double a,b;
	int k=0;
	a=s[0];
	b=a-1;
	for(int s1=1;s1<m;s1++)
	{
		if(a<=s[s1])
		{
			b=a;
			a=s[s1];
			k=s1;
		}
	}
	if (a==b) 
	{
		return -1;
	}
	else
		return k+1;
}

double CMyDlg::GetValue(double *A,int N)
{
	int i,j,m,n,s,t,k=1;
	
	double *a,f=1,c,x,sn;
	a=new double[N*N];
	
	for(i=0;i<N*N;i++)
		a[i]=A[i];
	
	for (i=0,j=0;i<N&&j<N;i++,j++)
	{
		if (a[i*N+j]==0)
		{
			for (m=i;a[m*N+j]==0;m++);
			if (m==N)
			{
				sn=0;
				return sn;
			}
			else
				for (n=j;n<N;n++)
				{
					c=a[i*N+n];
					a[i*N+n]=a[m*N+n];
					a[m*N+n]=c;
				}
				k*=(-1);
		}
		for (s=N-1;s>i;s--)
		{
			x=a[s*N+j];
			for (t=j;t<N;t++)
				a[s*N+t]-=a[i*N+t]*(x/a[i*N+j]);
		}
	}
	for (i=0;i<N;i++)
		f*=a[i*N+i];
	sn=k*f;
	delete a;
	return sn;
}

void CMyDlg::OnButton3() 
{
	// TODO: Add your control notification handler code here
	int i;
	for(i=m_List4.GetCount()-1;i>=0;i--)/*这个小程序来自于小组的其他成员*/
	{
		if(m_List4.GetSel(i))
		{
			m_List4.DeleteString(i);
			f--;
		}	
	}
	UpdateData(FALSE);
}

void CMyDlg::OnButton4() 
{
	// TODO: Add your control notification handler code here
	int a=m_List4.GetCount();
	for(int l=0;l<a;l++)
	m_List4.DeleteString(0);
	f=0;
	UpdateData(FALSE);
}

int CMyDlg::Select(double x,double y)
{

	double *E,*e,*pj,*E1,*g;
	double *m1;
	double *m2;
	double *m3;
	double m4=0;
	double p3;
	double p1=0;
	double x1[2];
	int p2;

	int result;
	int m,j,a,b,c,num=0;
	E=new double [k*k];
	g=new double [i];
	E1=new double [k*k];
	e=new double [k*k*i];
	pj=new double [k*i];
	m1=new double [k];
	m2=new double [k];
	m3=new double [k];
	x1[0]=x;
	x1[1]=y;

	
	for(m=0;m<i;m++)
		for(a=0;a<k;a++)
		{
			pj[m*k+a]=0;
			num=0;
			for(c=0;c<m;c++)
			{
				num+=n[c]*k;
			}
			num+=n[m]*a;
			for(j=0;j<n[m];j++)
				pj[m*k+a]+=master[num+j];
			pj[m*k+a]/=n[m];
	
		}
		
		for(j=0;j<i;j++)
		{
			num=0;
			for(c=0;c<j;c++)
			{
				num+=n[c]*k;
			}
			for(m=0;m<k;m++)
			{
				for(a=0;a<k;a++)
				{
					e[j*k*k+m*k+a]=0;
					for(c=0;c<n[j];c++)
					{
						e[j*k*k+m*k+a]+=(pj[j*k+m]-master[num+n[j]*m+c])*(pj[j*k+a]-master[num+n[j]*a+c]);
					}
					e[j*k*k+m*k+a]/=n[m]-1;
				}
			}
			
		}
		num=0;
		for(b=0;b<i;b++)
			num+=n[b];
///////协方差相等//////////////////////////
	if(select)
	{		
		for(j=0;j<k;j++)
		for(m=0;m<k;m++)
		{
			E[j*k+m]=0;
			for(a=0;a<i;a++)
			E[j*k+m]+=e[a*k*k+j*k+m];
		}
		ivy(E,k);
		for(m=0;m<i;m++)
		{
			for(a=0;a<k;a++)
			m1[a]=x1[a]-pj[m*k+a];
			
			transpose(m1,m2,1,k);
			mult(m1,E,m3,1,k,k);
			mult(m3,m2,&m4,1,k,1);
			
	        p1=1.0*n[m]/num;
			
			g[m]=-0.5*(m4)+log(p1);

		}
	}
/////////////两类协方差不等/////////
			else
			{
				for(m=0;m<i;m++)
					{
						for(a=0;a<k*k;a++)
						{
							E[a]=e[m*k*k+a];
							E1[a]=e[m*k*k+a];
						}
						ivy(E1,k);

						for(a=0;a<k;a++)
						m1[a]=x1[a]-pj[m*k+a];
						
						transpose(m1,m2,1,k);
						mult(m1,E1,m3,1,k,k);
						mult(m3,m2,&m4,1,k,1);
							
						p1=1.0*n[m]/num;
						p3=GetValue(E,k);
						g[m]=-0.5*(m4)+log(p1)-0.5*log(p3);
					}
			}
			delete m1;delete m2;delete m3;delete e;
			delete E;delete E1;delete pj;
			result=Max(g,i);
			delete g;
			return result;
}

void CMyDlg::OnMouseMove(UINT nFlags, CPoint point) 
{
	// TODO: Add your message handler code here and/or call default

	CFont font;
	font.CreateFont(15,6,0,0,700,0,0,0,0,0,0,0,0,"宋体");
	((CStatic*)GetDlgItem(IDC_STATIC_lei))->SetFont(&font);	
/*	CStatic *out=((CStatic*)GetDlgItem(IDC_STATIC_MAP));
	CDC *pDC=out->GetDC();
	CRect rect;
	out->GetClientRect(&rect);
	if (rect.PtInRect(point)&&move==false)*/
	if (move==false&&(point.x-412)>=-x0+10&&(point.x-412)<=x0-10&&(point.y-228)>=-y0+10&&(point.y-228)<=y0-10) 
	{
		::SetCursor(AfxGetApp()->LoadCursor(IDC_CURSOR1));
		CStatic *out=((CStatic*)GetDlgItem(IDC_STATIC_MAP));
		CDC *pDC=out->GetDC();
		point.x-=412;
		point.y-=228;
		CRect rect;
		out->GetClientRect(&rect);
		if(k==2)
		{				
			CString str;
			if (Select((1.0*point.x)/m_f,(-1.0*point.y)/m_f)!=-1) 
			{
				str.Format("该点在第 %d 类",Select((1.0*point.x)/m_f,(-1.0*point.y)/m_f));
			}
			else
			str="该点在边界上";
			CWnd::SetDlgItemText(IDC_STATIC_lei,str);
			str.Format("%f",1.0*point.x/m_f);
			CWnd::SetDlgItemText(IDC_STATIC_X,str);
			str.Format("%f",1.0*(-point.y)/m_f);
			CWnd::SetDlgItemText(IDC_STATIC_Y,str);
			
		}

	}	
	else if(move==false)
	{
		CWnd::SetDlgItemText(IDC_STATIC_lei,"");
		CWnd::SetDlgItemText(IDC_STATIC_X,"");
		CWnd::SetDlgItemText(IDC_STATIC_Y,"");
		::SetCursor(AfxGetApp()->LoadStandardCursor(IDC_ARROW));
	}
	CDialog::OnMouseMove(nFlags, point);

}

⌨️ 快捷键说明

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