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

📄 sgaview.cpp

📁 用开发语言vc++编程实现用遗传算法求解函数f=x*sin(10*x)+1.0的最大值。
💻 CPP
字号:
// SGAView.cpp : implementation of the CSGAView class
//

#include "stdafx.h"
#include "SGA.h"

#include "SGADoc.h"
#include "SGAView.h"
#include "math.h"
#include <stdlib.h>
#include <string.h>
#define Pi 3.1415926

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

/////////////////////////////////////////////////////////////////////////////
// CSGAView

IMPLEMENT_DYNCREATE(CSGAView, CScrollView)

BEGIN_MESSAGE_MAP(CSGAView, CScrollView)
	//{{AFX_MSG_MAP(CSGAView)
	ON_COMMAND(ID_INPUTPARAM, OnInputParam)
	ON_COMMAND(ID_RUNGA, OnRunGA)
	ON_COMMAND(ID_FIMAGE, OnFimage)
	ON_UPDATE_COMMAND_UI(ID_FIMAGE, OnUpdateFimage)
	//}}AFX_MSG_MAP
	// Standard printing commands
	ON_COMMAND(ID_FILE_PRINT, CScrollView::OnFilePrint)
	ON_COMMAND(ID_FILE_PRINT_DIRECT, CScrollView::OnFilePrint)
	ON_COMMAND(ID_FILE_PRINT_PREVIEW, CScrollView::OnFilePrintPreview)
END_MESSAGE_MAP()

/////////////////////////////////////////////////////////////////////////////
// CSGAView construction/destruction


CSGAView::~CSGAView()
{
}

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

	return CScrollView::PreCreateWindow(cs);
}

/////////////////////////////////////////////////////////////////////////////
// CSGAView drawing

void CSGAView::OnDraw(CDC* pDC)
{
	CSGADoc* pDoc = GetDocument();
	ASSERT_VALID(pDoc);
	// TODO: add draw code for native data here
	
	TEXTMETRIC tm;
	pDC->GetTextMetrics(&tm);
	pDC->SetBkMode(TRANSPARENT);

	POSITION pos=MyGA.lsRptData.GetHeadPosition();
	UINT ntxt=0;
	for(int i=0;i<MyGA.lsRptData.GetCount();i++)
	{
		pDC->TextOut(0,ntxt+=tm.tmHeight,MyGA.lsRptData.GetNext(pos));
	}

	OnFimage();

}


void CSGAView::OnInitialUpdate()
{
	CScrollView::OnInitialUpdate();

	CSize sizeTotal;
	// TODO: calculate the total size of this view
	sizeTotal.cx = sizeTotal.cy = 100; 
	SetScrollSizes(MM_TEXT, sizeTotal);
}

/////////////////////////////////////////////////////////////////////////////
// CSGAView printing

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

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

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

/////////////////////////////////////////////////////////////////////////////
// CSGAView diagnostics

#ifdef _DEBUG
void CSGAView::AssertValid() const
{
	
	CScrollView::AssertValid();
}

void CSGAView::Dump(CDumpContext& dc) const
{
	CScrollView::Dump(dc);
}

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

/////////////////////////////////////////////////////////////////////////////
// CSGAView message handlers

void CSGAView::OnInputParam() 
{
	// TODO: Add your command handler code here
	if(ParDlg.DoModal()==IDOK)
		MyGA.InitData(ParDlg.m_nPopSize,ParDlg.m_nChromLen,ParDlg.m_nMaxGen,ParDlg.m_fPc,ParDlg.m_fPm);
}

void CSGAView::OnRunGA() 
{
	float oldmaxfit;
	int oldmaxpp;

	if(!MyGA.lsRptData.IsEmpty())
		MyGA.InitData();
	MyGA.InitPop();
	MyGA.InitReport();
	MyGA.pPop=MyGA.pNewPop;
	MyGA.pNewPop=MyGA.pOldPop;
	MyGA.StatPop(MyGA.pNewPop);
	MyGA.Report(MyGA.nGen);
	MyGA.pNewPop=MyGA.pPop;
	do
	{
		MyGA.nGen++;
		oldmaxfit=MyGA.fMaxFit;
		oldmaxpp=MyGA.nMaxPop;
		MyGA.UpdateGen();
		MyGA.StatPop(MyGA.pNewPop);
		if(MyGA.fMaxFit<oldmaxfit)
		{
			for(unsigned i=0;i<MyGA.nChromLen;i++)
				MyGA.pNewPop[MyGA.nMinPop].chrom[i]=MyGA.pOldPop[oldmaxpp].chrom[i];
			MyGA.pNewPop[MyGA.nMinPop].x=MyGA.pOldPop[oldmaxpp].x;
			MyGA.pNewPop[MyGA.nMinPop].fitness=MyGA.pOldPop[oldmaxpp].fitness;
			MyGA.StatPop(MyGA.pNewPop);
		}
		MyGA.Report(MyGA.nGen);
		MyGA.pPop=MyGA.pOldPop;
		MyGA.pOldPop=MyGA.pNewPop;
		MyGA.pNewPop=MyGA.pPop;
	}while(MyGA.nGen<MyGA.nMaxGen);

	FILE *fp;
	if((fp=fopen("SGAReport.txt","w"))==NULL)
		MessageBox("Cannot Open File for Report !");
	POSITION pos=MyGA.lsRptData.GetHeadPosition();
	for(int i=0;i<MyGA.lsRptData.GetCount();i++)
		fprintf(fp,"%s\n",(LPCTSTR)MyGA.lsRptData.GetNext(pos));
	fclose(fp);

	TEXTMETRIC tm;
	CDC *pDC=GetDC();
	pDC->GetTextMetrics(&tm);
	SetScrollSizes(MM_TEXT,CSize(1000,MyGA.lsRptData.GetCount()*tm.tmHeight));

	Invalidate();
}

void CSGAView::OnFimage() 
{
	// TODO: Add your command handler code here
	//CClientDC dc(this);//获取设备环境
	//CRect rect; 
    //POINT Sin[200]; //定义正弦曲线的点坐标
    
	//GetClientRect(&rect); 
    //dc.SetMapMode(MM_ISOTROPIC/*MM_ANISOTROPIC MM_LOMETRIC*/);//设置映象模式0.1mm 
    //dc.SetWindowOrg(1600,1000);//设置窗口原点(即窗口的中心点) 
    //dc.SetViewportOrg(rect.right/2,rect.bottom/2);//设置视口原点 
    //dc.DPtoLP(&rect);//按0.1mm比例的倒数放大了
    //dc.FillSolidRect(rect,RGB(127,127,127));//设置背景色


    //画网格 

    /*CPen pen; 
    pen.CreatePen(PS_SOLID,1,RGB(222,222,222)); //PS_SOLID为实线 
    CPen* pOldPen=dc.SelectObject(&pen);
	//网格的创建;
    for(int i=0;i<=10000;i+=100) 
	{
	   dc.MoveTo(0,i); 
       dc.LineTo(10000,i); 
       dc.MoveTo(i,0); 
       dc.LineTo(i,10000); 

	}
	CPen pen2; 
    pen2.CreatePen(PS_SOLID,1,RGB(252,0,0)); //PS_SOLID为实线 
    pOldPen=dc.SelectObject(&pen2);
	
	//画出正弦曲线;
	dc.SetWindowOrg(0,0);
    for (int j=-100;j<100;j++)
	{
        Sin[j+100].x=(long)(100*j*Pi/180*5);
        Sin[j+100].y=(long)((j*sin((j*10)*Pi/180)+1.0)*5);

	}
	dc.Polyline(Sin,200); 


 
    //建立坐标系
	CPen pen1; 
    pen1.CreatePen(PS_SOLID,1,RGB(0,0,0)); //PS_SOLID为实线 
    pOldPen=dc.SelectObject(&pen1);
	dc.MoveTo(Sin[100].x,500);
	dc.LineTo(Sin[100].x,-500); 
	dc.MoveTo(-1000,-100);
	dc.LineTo (1000,-100);

	//确定显示刻度个数
    const int count=5;

 
    //确定每个显示刻度之间的宽度
    long  spaceX=100;

	


  

    

	//绘制X,Y轴的变量名
    dc.TextOut(-100,200,"Y");
    dc.TextOut(350,-150,"X");*/


		

    ////////////////////////////////////////////////////////////////
	//                   画出正弦曲线的另一种方法                 //
	///////////////////////////////////////////////////////////////
   /*dc.SetWindowOrg(0,0);
   for (int j=0;j<1440;j++)//生成正弦曲线的点坐标.
		{
		    
				Sin[j].x=(long)(100*j*Pi/180);
                Sin[j].y=(long)((j*sin((j*10)*Pi/180)+1.0)/2);
	
         }
	  	dc.Polyline(Sin,1440); 

		for(i=0;i<1440;i++)
		{
			Sin2[i].y=Sin[i].y;
			Sin2[i].x=-Sin[i].x;
			
		}
		dc.SetWindowOrg(0,0);
		dc.Polyline(Sin2,1440); */
	


	////////////////////////////////////////////////////////////////
	//下面的代码是建立一个坐标系                                  //
	///////////////////////////////////////////////////////////////

    //分别取得X与Y最大值、最小值
	
	/*long maxX=Sin[0].x;
	long minX=Sin[0].x;
	long maxY=Sin[0].y;
	long minY=Sin[0].y;
	for (int k=-100;k<100;k++)
	{
		if (Sin[k+100].x>maxX)
		    maxX=Sin[k+10].x;
		if (Sin[k+100].x<minX)
		    minX=Sin[k+100].x;
		if (Sin[k+100].y>maxY)
		    maxY=Sin[k+10].y;
		if (Sin[k+100].y<minY)
		    minY=Sin[k+100].y;
		
	}
	
	 //确定图象显示大小

       int width=2000;

       int height=1000;
	 //确定坐标图四周预留的空白大小

       const int mytop=10;

       const int mybottom=10;

       const int myleft=10;

       const int myright=10;
	  
	   //确定X,Y轴每单位显示宽度

       long intervalX=(width-myleft-myright)/(maxX-minX);

       long intervalY=(height-mybottom-mytop)/(maxY-minY);
       //绘制曲线。由于绘图坐标的Y轴是向下延升,所以这里每个点的Y值是用

       //图象高度减去y值大小。

       dc.MoveTo(int(myleft+(Sin[0].x-minX)*intervalX), 

                     int(height-(mybottom+(Sin[0].y-minY)*intervalY)));

       for(int m=-100;m<100;m++)

       {

              dc.LineTo(int(myleft+(Sin[m+100].x-minX)*intervalX), 

                     int(height-(mybottom+(Sin[m+100].y-minY)*intervalY)));

       }

 

       //绘制X,Y轴

       //X轴从图形区域最左端到最右端

       long bottomY=0;

       long leftX=0;

       //bottomY表示X轴的y值,leftX表示Y轴的x值

       if(minY>0)

              bottomY=minY;

       if(minX>0)

              leftX=minX;

 

        dc.MoveTo(int(myleft),int(height-(mybottom+(bottomY-minY)*intervalY)));

        dc.LineTo(int(width-myright),int(height-(mybottom+(bottomY-minY)*intervalY)));

       //Y轴从图形区域最底端到最顶端

       dc.MoveTo(int(myleft+(leftX-minX)*intervalX),int(height-mybottom));

       dc.LineTo(int(myleft+(leftX-minX)*intervalX),int(mytop));

 

       //确定显示刻度个数

       const int count=10;

 

       //确定每个显示刻度之间的宽度

       long  spaceX=(width-myleft-myright)/count;

       long  spaceY=(height-mybottom-mytop)/count;

 

       //绘制刻度和刻度值

       CString str;

       //X轴

       for(i=0;i<=count;i++)

       {

              str.Format("%.1f",minX+i*(maxX-minX)/count);

              dc.MoveTo(int(myleft+spaceX*i),int(height-(mybottom+(bottomY-minY)*intervalY)));

              dc.LineTo(int(myleft+spaceX*i),int(height-(mybottom+(bottomY-minY)*intervalY)));

              dc.TextOut(int(myleft+spaceX*i-10),

                     int(height-(mybottom+(bottomY-minY)*intervalY-5)),str);

       }

 

       //Y轴

       for(i=0;i<=count;i++)

       {

              str.Format("%.1f",minY+i*(maxY-minY)/count);

              dc.MoveTo(int(myleft+(leftX-minX)*intervalX),int(height-(mybottom+spaceY*i)));

              dc.LineTo(int(myleft+(leftX-minX)*intervalX+1),int(height-(mybottom+spaceY*i)));

              dc.TextOut(int(myleft+(leftX-minX)*intervalX-30),

                     int(height-(mybottom+spaceY*i+8)),str);

       }

 

    //绘制X,Y轴的变量名

       dc.TextOut(width/2,-100,"X");

       dc.TextOut(-100,height/2,"Y");*/


 







	
}

void CSGAView::OnUpdateFimage(CCmdUI* pCmdUI) 
{
	// TODO: Add your command update UI handler code here
	pCmdUI->SetRadio(TRUE);
}

⌨️ 快捷键说明

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