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

📄 sofmdview.cpp

📁 自组织特征映射 SOFM实现二维排序
💻 CPP
字号:
//电子信息学院   20074228068040   ranee
//wujuan
// SOFMDView.cpp : implementation of the CSOFMDView class
//

#include "stdafx.h"
#include "SOFMD.h"

#include "SOFMDDoc.h"
#include "SOFMDView.h"

#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif

/////////////////////////////////////////////////////////////////////////////
// CSOFMDView

IMPLEMENT_DYNCREATE(CSOFMDView, CView)

BEGIN_MESSAGE_MAP(CSOFMDView, CView)
	//{{AFX_MSG_MAP(CSOFMDView)
	ON_COMMAND(IDM_SOFM, OnSofm)
	//}}AFX_MSG_MAP
	// Standard printing commands
	ON_COMMAND(ID_FILE_PRINT, CView::OnFilePrint)
	ON_COMMAND(ID_FILE_PRINT_DIRECT, CView::OnFilePrint)
	ON_COMMAND(ID_FILE_PRINT_PREVIEW, CView::OnFilePrintPreview)
END_MESSAGE_MAP()

/////////////////////////////////////////////////////////////////////////////
// CSOFMDView construction/destruction

CSOFMDView::CSOFMDView()
{
	// TODO: add construction code here

}

CSOFMDView::~CSOFMDView()
{
}

BOOL CSOFMDView::PreCreateWindow(CREATESTRUCT& cs)
{
	// TODO: Modify the Window class or styles here by modifying
	//  the CREATESTRUCT cs

	return CView::PreCreateWindow(cs);
}

/////////////////////////////////////////////////////////////////////////////
// CSOFMDView drawing

void CSOFMDView::OnDraw(CDC* pDC)
{
	CSOFMDDoc* pDoc = GetDocument();
	ASSERT_VALID(pDoc);
	// TODO: add draw code for native data here
}

/////////////////////////////////////////////////////////////////////////////
// CSOFMDView printing

BOOL CSOFMDView::OnPreparePrinting(CPrintInfo* pInfo)
{
	// default preparation
	return DoPreparePrinting(pInfo);
}

void CSOFMDView::OnBeginPrinting(CDC* /*pDC*/, CPrintInfo* /*pInfo*/)
{
	// TODO: add extra initialization before printing
}

void CSOFMDView::OnEndPrinting(CDC* /*pDC*/, CPrintInfo* /*pInfo*/)
{
	// TODO: add cleanup after printing
}

/////////////////////////////////////////////////////////////////////////////
// CSOFMDView diagnostics

#ifdef _DEBUG
void CSOFMDView::AssertValid() const
{
	CView::AssertValid();
}

void CSOFMDView::Dump(CDumpContext& dc) const
{
	CView::Dump(dc);
}

CSOFMDDoc* CSOFMDView::GetDocument() // non-debug version is inline
{
	ASSERT(m_pDocument->IsKindOf(RUNTIME_CLASS(CSOFMDDoc)));
	return (CSOFMDDoc*)m_pDocument;
}
#endif //_DEBUG

/////////////////////////////////////////////////////////////////////////////
// CSOFMDView message handlers

void CSOFMDView::OnSofm() 
{
	// TODO: Add your command handler code here
    zuobiaozhou();   //画坐标轴
	fp=fopen("ranee.txt","w");
	initw();
	for(int i=0;i<m;i++)
		for(int j=0;j<m;j++)
	{
		POINT  X;
			CClientDC dc(this);  
		   X.x=200+W[0][i][j]*100;
		   X.y=200-W[1][i][j]*100;
		
           dc.SetPixel(X,RGB(255,0,0) );
	}

	initu();
	for(int ii=0;ii<p;ii++)
	{
		POINT  Q;
	CClientDC dc(this);  
			
		   Q.x=200+U[ii][0]*100;
		   Q.y=400-U[ii][1]*100;
		
           dc.SetPixel(Q,RGB(255,0,0) );
	}
  for(int t=0;t<T;t++)        //循环
  {
	     for(int l=0;l<p;l++)
		 {  
			  //double d[M];//,dis[M];
		      double dmin=100;
		   int c0,c1;
		   for(int  i=0;i<m;i++)
		   {  
			   for(int j=0;j<m;j++)
			   {
			   //double  a=W[i][0]*U[l][0]+W[i][1]*U[l][1];  //内积
			      double  a=sqrt((U[l][0]-W[0][i][j])*(U[l][0]-W[0][i][j])+(U[l][1]-W[1][i][j])*(U[l][1]-W[1][i][j]));  //欧距
			   //d[i]=sqrt(a);
				  if(a<dmin)
				  {
					  dmin=a;
					  c0=i;
					  c1=j;
				  }
			   
			   }
			   //d1[i]=a;
		   }
		 
			double	Ng=(Ng0*exp(-5*t/T));
		  	double G=A*exp(-6.2*t/T);
	//	double  Ng=Ng0*(1-t/T);
	//	double  G=A*(1-t/T);

			for(int j=0;j<m;j++)
				for(int j1=0;j1<m;j1++)
					for(int j2=0;j2<n;j2++)
				if(fabs(j-c0)<Ng&&fabs(j1-c1)<Ng) //邻域调整
            {
					//double temp=W[j2][j][j1]+G*(U[l][j2]-W[j2][j][j1]);
				//	W[j2][j][j1]=temp;
				W[j2][j][j1]=W[j2][j][j1]+G*(U[l][j2]-W[j2][j][j1]);
				

				
			}
         
		 
		 }
  }
  fprintf(fp,"最终权值:\n" );
  //fprintf(fp,"\n"); 

for(int z=0;z<m;z++)
for(int z1=0;z1<m;z1++)
   for(int x=0;x<n;x++)
	{
	
		fprintf(fp,"%f  ",W[x][z][z1]);
		

		  

   } 
   
   for(int i0=0;i0<m;i0++)
	   for(int i1=0;i1<m;i1++)
	{
		POINT  Y;
			CClientDC dc(this);  
		   Y.x=500+W[0][i0][i1]*200;
		   Y.y=300-W[1][i0][i1]*200;
		   CPen myPen;
		    dc.SelectObject(&myPen);
           dc.SetPixel(Y,RGB(0,0,0) );
		   dc.Ellipse(Y.x-2,Y.y-2, Y.x+2,Y.y+2);  //调整后w的位置画椭圆,便于观察
		   
	}
	  

	fclose(fp);
}

void CSOFMDView::zuobiaozhou()
{
	CClientDC dc(this);  

	dc.MoveTo(200,100);
	dc.LineTo (200,200);
	dc.LineTo (300,200);
	dc.TextOut(10,10,"sofm应用----ranee  40");
    dc.TextOut (200,210,"初始权值输入");

	dc.MoveTo(500,100);
	dc.LineTo (500,300);
	dc.LineTo (700,300);
    dc.TextOut (500,310,"权值处理后");

    dc.MoveTo(200,300);
    dc.LineTo (200,400);
    dc.LineTo (300,400);
	dc.TextOut (200,410,"初始样本输入");



}

void CSOFMDView::initw()

{  
	fprintf(fp,"初始权值:" );
		fprintf(fp,"\n");
		srand((unsigned)time(NULL));
	for(int j=0;j<n;j++)
	{
		for(int i=0;i<m;i++)
		{
		   for(int k=0;k<m;k++)
		   {
	     	W[j][i][k]=(double)rand()/0x7fff/10+0.45;
	
		   fprintf(fp,"  %f",W[j][i][k]);
		    //if(j%2==1)
			//	fprintf(fp,"\n");
		   }
	
		}
	}


}

void CSOFMDView::initu()
{
	    fprintf(fp,"\n");
		fprintf(fp,"样本输入:" );
		fprintf(fp,"\n");
		srand((unsigned)time(NULL));
	for(int j=0;j<p;j++)
		for(int i=0;i<n;i++)
	{
		U[j][i]=(float)rand()/0x7fff;
	
		fprintf(fp,"  %f",U[j][i]);
		if(i%2==1)
				fprintf(fp,"\n");
	
	}


}




⌨️ 快捷键说明

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