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

📄 mygaview.cpp

📁 一个遗传算法的程序
💻 CPP
📖 第 1 页 / 共 3 页
字号:
// MyGAView.cpp : implementation of the CMyGAView class
//

#include "stdafx.h"
#include <afxtempl.h>

#include "MyGA.h"

#include "MyGADoc.h"
#include "MyGAView.h"
#include "MainFrm.h"
#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif

/////////////////////////////////////////////////////////////////////////////
// CMyGAView

IMPLEMENT_DYNCREATE(CMyGAView, CScrollView)

BEGIN_MESSAGE_MAP(CMyGAView, CScrollView)
	//{{AFX_MSG_MAP(CMyGAView)
	ON_COMMAND(ID_CAL_STOP, OnCalStop)
	ON_COMMAND(ID_CAL_START, OnCalStart)
	ON_COMMAND(ID_CAL_PAUSE, OnCalPause)
	ON_COMMAND(ID_CAL_SETTING, OnCALSetting)
	ON_COMMAND(ID_FUN_SELECT, OnFunSelect)
	ON_UPDATE_COMMAND_UI(ID_CAL_START, OnUpdateCalStart)
	ON_UPDATE_COMMAND_UI(ID_CAL_PAUSE, OnUpdateCalPause)
	ON_UPDATE_COMMAND_UI(ID_CAL_STOP, OnUpdateCalStop)
	ON_UPDATE_COMMAND_UI(ID_CAL_SETTING, OnUpdateCalSetting)
	ON_UPDATE_COMMAND_UI(ID_FUN_SELECT, OnUpdateFunSelect)
	ON_COMMAND(ID_DISPSET, OnDispSet)
	ON_WM_SIZE()
	ON_COMMAND(ID_CLR_RESULT, OnClrResult)
	ON_COMMAND(ID_SUBPOP_SET, OnSubpopSet)
	ON_UPDATE_COMMAND_UI(ID_SUBPOP_SET, OnUpdateSubpopSet)
	ON_COMMAND(ID_FUNCAL, OnFuncal)
	ON_COMMAND(ID_PARASHOW, OnParaShow)
	ON_COMMAND(ID_MCSTART, OnMCStart)
	ON_COMMAND(ID_MCPAUSE, OnMCPause)
	ON_COMMAND(ID_MCSTOP, OnMCStop)
	ON_UPDATE_COMMAND_UI(ID_MCSTOP, OnUpdateMCStop)
	ON_UPDATE_COMMAND_UI(ID_MCSTART, OnUpdateMCStart)
	ON_UPDATE_COMMAND_UI(ID_MCPAUSE, OnUpdateMCPause)
	//}}AFX_MSG_MAP
	// Standard printing commands
	ON_MESSAGE(WM_GAFINISHED,OnGAFinished)
	ON_MESSAGE(WM_GARESULT,OnGAResult)
	ON_MESSAGE(WM_GAPAUSE,OnGAPause)
	ON_MESSAGE(WM_MCRESULT,OnMCResult)
	ON_MESSAGE(WM_MCFINISHED,OnMCFinished)
END_MESSAGE_MAP()

/////////////////////////////////////////////////////////////////////////////
// CMyGAView construction/destruction

GAPARAMS gGAParam;
CPopulation *g_pPop;
CMyGAView::CMyGAView()
{
	// TODO: add construction code here
	gGAParam.iSSW=0;
	m_bParaChanged=FALSE;
	m_bAutoScroll=false;
	m_bLowSpeed=false;
	m_iShowSelect=0;
	m_iLine=1200;
	m_iLineHeight=18;
	m_pFile=NULL;m_pMCFile=NULL;
	gGAParam.bSorted=TRUE;
	m_color[0]=RGB(0,192,0);
	m_color[1]=RGB(192,0,0);
	m_bAllOptimaFitness=true;
	m_bAllOptimaGene=true;
	m_bAllSubpopFitness=m_bAllSubpopGene=m_bSubpop1=m_bSubpop2=m_bSubpop3=false;
	m_iSubpop1=m_iSubpop2=m_iSubpop3=0;
}

CMyGAView::~CMyGAView()
{
	if(m_bParaChanged)SaveGAPara(gGAParam);
	if(m_pFile)fclose(m_pFile);
	if(m_pMCFile)fclose(m_pMCFile);
	if(g_pPop)delete []g_pPop;
}

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

	return CScrollView::PreCreateWindow(cs);
}

/////////////////////////////////////////////////////////////////////////////
// CMyGAView drawing
void CMyGAView::OnDraw(CDC* pDC)
{
	CMyGADoc* pDoc = GetDocument();
	ASSERT_VALID(pDoc);
	// TODO: add draw code for native data here
	CRect rect;
	CString str;
	pDC->GetClipBox(&rect);
	int iStartLine=rect.top/m_iLineHeight;
	int iEndLine=rect.bottom/m_iLineHeight+1;
	int iCount=m_strList.GetCount();
	if(iCount<iStartLine)return;
	int i=iStartLine;
	POSITION pos=m_strList.FindIndex(i);
	while(pos!=NULL&&i<iEndLine)
	{
		str=m_strList.GetNext(pos);
		pDC->SetTextColor(m_color[i&1]);
		pDC->TextOut(0,i*m_iLineHeight,str);
		i++;
	}

}

void CMyGAView::OnInitialUpdate()
{
	CScrollView::OnInitialUpdate();
	if(GetGAPara(gGAParam))
	{
		AfxMessageBox(_T("无法打开参数设置文件"),MB_OK|MB_ICONINFORMATION);
		//return FALSE;
	}

	CMainFrame *pFrame=(CMainFrame*)AfxGetApp()->m_pMainWnd;
	m_pStatus=(CStatusBar*)pFrame->GetMessageBar();

}

void CMyGAView::OnSize(UINT nType, int cx, int cy) 
{
	CScrollView::OnSize(nType, cx, cy);
	
	// TODO: Add your message handler code here
	CSize sizeTotal,sizePage,sizeLine;
	CRect rect;
	// TODO: calculate the total size of this view
	CClientDC dc(this);
	TEXTMETRIC tm;
	dc.GetTextMetrics(&tm);
	m_iLineHeight=tm.tmHeight+tm.tmExternalLeading;
	sizeTotal.cx =15000;
	sizeTotal.cy = m_iLine*m_iLineHeight;
	GetClientRect(&rect);
	m_iPageLine=rect.Height()/m_iLineHeight;
	sizePage.cx=sizePage.cy=rect.Height();
	sizeLine.cx=sizeLine.cy=m_iLineHeight;
	SetScrollSizes(MM_TEXT, sizeTotal,sizePage,sizeLine);
}

/////////////////////////////////////////////////////////////////////////////
// CMyGAView diagnostics

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

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

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

/////////////////////////////////////////////////////////////////////////////
// CMyGAView message handlers
void CMyGAView::OnCalStop() 
{
	// TODO: Add your command handler code here
	if(AfxMessageBox(_T("确实要终止进化计算吗?"),MB_YESNO|MB_ICONQUESTION)==IDYES)
	{
		if(gGAParam.iSSW)m_pGAFun->ResumeThread();
		gGAParam.iSSW=0;
	}
}


void CMyGAView::OnCalStart() 
{
	// TODO: Add your command handler code here
	if(gGAParam.iSSW==0)
	{
		if(m_bParaChanged)
		{
			SaveGAPara(gGAParam);
			m_bParaChanged=false;
			if(g_pPop!=NULL)delete []g_pPop;
/*			CPopulation::Setup(gGAParam.iMu,gGAParam.iLumda,gGAParam.iKapa,gGAParam.dSigma0,
				gGAParam.dMinSigma,gGAParam.dSigmaCoe,gGAParam.iTuneInterval,gGAParam.lMaxGeneration,
				gGAParam.lMaxNoEvolveGen,gGAParam.dOptima,gGAParam.dAccuracy,gGAParam.dSubpopRadius,
				gGAParam.iMaxOptimaNum,gGAParam.iNoNewNum,gGAParam.iESType);
			CIndividual::Setup(gGAParam.iFunSel,gGAParam.iVarNum,gGAParam.iMuteType,
				gGAParam.iReproduceType);*/
			CPopulation::Setup(gGAParam);
			CIndividual::Setup(gGAParam);
			g_pPop=new CPopulation[gGAParam.iSubpopNum];
		}
		if(g_pPop==NULL)
		{
/*			CPopulation::Setup(gGAParam.iMu,gGAParam.iLumda,gGAParam.iKapa,gGAParam.dSigma0,gGAParam.dMinSigma,
				gGAParam.dSigmaCoe,gGAParam.iTuneInterval,gGAParam.lMaxGeneration,
				gGAParam.lMaxNoEvolveGen,gGAParam.dOptima,gGAParam.dAccuracy,gGAParam.dSubpopRadius,
				gGAParam.iMaxOptimaNum,gGAParam.iNoNewNum,gGAParam.iESType);
			CIndividual::Setup(gGAParam.iFunSel,gGAParam.iVarNum,gGAParam.iMuteType,
				gGAParam.iReproduceType);*/
			CPopulation::Setup(gGAParam);
			CIndividual::Setup(gGAParam);
			g_pPop=new CPopulation[gGAParam.iSubpopNum];
		}
		if(g_pPop==NULL)
		{
			AfxMessageBox(_T("内存不够,无法计算,请减小子种群数量试试!"));
			return;
		}
		gGAParam.hWnd=m_hWnd;
		gGAParam.iSSW=1;
		gGAParam.bResultNotProcessed=FALSE;
		m_pGAFun=AfxBeginThread(GACalculate,&gGAParam,THREAD_PRIORITY_NORMAL,0,0);
		m_pGAFun->m_bAutoDelete=true;
		m_strList.RemoveAll();
		static CString ESStr[]={_T("(μ+λ)-CES"),_T("(μ+λ+κ)-ES"),_T("思维学习ES")};
		static CString MuteTypeStr[2]={"单基因变异","全基因变异"};
		static CString ReproduceTypeStr[2]={"精英繁殖","共同繁殖"};
		m_strSetup.Empty();
		CString str;
		CTime t;
		t=CTime::GetCurrentTime();
		str=t.Format("%Y.%m.%d,  %H:%M:%S");
		m_strSetup.Format("-------------%s 计算开始     %s    ----------------------  \r\n",
			str,ESStr[gGAParam.iESType]);
		str.Format("子种群数=%d,小生境半径=%8.3lf;重复计算%d次  \r\n",
				gGAParam.iSubpopNum,gGAParam.dSubpopRadius,gGAParam.iRepeatNumber);
		m_strSetup+=str;
		str.Format("总停止条件:最多极值点数>%d,连续未找到新极值次数>%d\
			\r\n                        函数调用次数>%ld  \r\n",
				gGAParam.iMaxOptimaNum,gGAParam.iNoNewNum,gGAParam.lMaxFunCall);
		m_strSetup+=str;
		str.Format("变异方式:  %s,繁殖方式:  %s\r\n",MuteTypeStr[gGAParam.iMuteType],
			ReproduceTypeStr[gGAParam.iReproduceType]);
		m_strSetup+=str;
		str.Format("子种群参数:μ=%d,λ=%d,κ=%d,变焦间隔=%d\r\n初始σ=%5.3lf,最小σ=%13.8le,σ缩减系数=%10.5lf\r\n",
				gGAParam.iMu,gGAParam.iLumda,gGAParam.iKapa,
				gGAParam.iTuneInterval,gGAParam.dSigma0,gGAParam.dMinSigma,
				gGAParam.dSigmaCoe);
		m_strSetup+=str;
		str.Format("子种群停止条件:连续未进化代数>%ld,	进化代数>%ld  \r\n",
				gGAParam.lMaxNoEvolveGen,gGAParam.lMaxGeneration);
		m_strSetup+=str;
		str.Format("函数参数:编号:%d,变量数=%d,范围:[%10.3lf,%10.3lf]  \r\n",
				gGAParam.iFunSel,gGAParam.iVarNum,gGAParam.dLower,gGAParam.dUpper);
		m_strSetup+=str;
		str.Format("理论最优解:%13.8lf,  精度=%15.10le\r\n",
				gGAParam.dOptima,gGAParam.dAccuracy);
		m_strSetup+=str;
		if(gGAParam.iSaveType)
		{
			str.Format("Fun%02d.dat",gGAParam.iFunSel);
			if((m_pFile=fopen(str,"a"))==NULL)m_pFile=fopen(str,"w");
			fprintf(m_pFile,"\n\n%s\n\n",m_strSetup);
		}
		ScrollToPosition(CPoint(0,0));
		Invalidate(TRUE);
	}
    if(gGAParam.iSSW==2) 
	{
		if(m_bParaChanged)CPopulation::Modify(gGAParam);
		gGAParam.iSSW=1;
		m_pGAFun->ResumeThread();
	}
}

void CMyGAView::OnCalPause() 
{
	// TODO: Add your command handler code here
	gGAParam.iSSW=2;
	m_pGAFun->SuspendThread();
}

long CMyGAView::OnGAPause(WPARAM wParam,LPARAM lParam) 
{
	// TODO: Add your command handler code here
	gGAParam.iSSW=2;
	m_pGAFun->SuspendThread();
	gGAParam.bResultNotProcessed=false;
	return 0L;
}


void CMyGAView::OnCALSetting() 
{
	// TODO: Add your command handler code here
	CSetupDlg dlg;
	dlg.m_iSaveType=gGAParam.iSaveType;
	dlg.m_iRepeatNumber=gGAParam.iRepeatNumber;
	dlg.m_MaxFunCall=gGAParam.lMaxFunCall;
	dlg.m_MaxOptimaNum=gGAParam.iMaxOptimaNum;
	dlg.m_NoNewNum=gGAParam.iNoNewNum;
	dlg.m_SubpopNum=gGAParam.iSubpopNum;
	dlg.m_SubpopRadius=gGAParam.dSubpopRadius;
	dlg.m_MuteType=gGAParam.iMuteType;
	dlg.m_ReproduceType=gGAParam.iReproduceType;
	dlg.m_iESType=gGAParam.iESType;
	if(dlg.DoModal()==IDOK)
	{
		gGAParam.iSaveType=dlg.m_iSaveType;
		gGAParam.iRepeatNumber=dlg.m_iRepeatNumber;
		gGAParam.lMaxFunCall=dlg.m_MaxFunCall;
		gGAParam.iMaxOptimaNum=dlg.m_MaxOptimaNum;
		gGAParam.iNoNewNum=dlg.m_NoNewNum;
		gGAParam.iSubpopNum=dlg.m_SubpopNum;
		gGAParam.dSubpopRadius=dlg.m_SubpopRadius;
		gGAParam.iMuteType=dlg.m_MuteType;
		gGAParam.iReproduceType=dlg.m_ReproduceType;
		gGAParam.iESType=dlg.m_iESType;
		m_bParaChanged=TRUE;
	}
}

void CMyGAView::OnSubpopSet() 
{
	// TODO: Add your command handler code here
	CSubpopSetDlg dlg;
	dlg.m_Gap=gGAParam.iTuneInterval;
	dlg.m_Kap=gGAParam.iKapa;
	dlg.m_Lumda=gGAParam.iLumda;
	dlg.m_MaxGen=gGAParam.lMaxGeneration;
	dlg.m_Sigma0=gGAParam.dSigma0;
	dlg.m_MinSigma=gGAParam.dMinSigma;
	dlg.m_Mu=gGAParam.iMu;
	dlg.m_NoEvolveGen=gGAParam.lMaxNoEvolveGen;
	dlg.m_SigmaCoe=gGAParam.dSigmaCoe;
	if(dlg.DoModal()==IDOK)
	{
		gGAParam.iTuneInterval=dlg.m_Gap;
		gGAParam.iKapa=dlg.m_Kap;
		gGAParam.iLumda=dlg.m_Lumda;
		gGAParam.lMaxGeneration=dlg.m_MaxGen;
		gGAParam.dSigma0=dlg.m_Sigma0;
		gGAParam.dMinSigma=dlg.m_MinSigma;
		gGAParam.iMu=dlg.m_Mu;
		gGAParam.lMaxNoEvolveGen=dlg.m_NoEvolveGen;
		gGAParam.dSigmaCoe=dlg.m_SigmaCoe;
		m_bParaChanged=TRUE;
	}
}

const CString gstrFunList1=_T("\
  case 0: Fitness=LeungF7(x);       [0,Pi]\r\n\
  case 1:  Fitness=LeungF6(x);      [-50,50]\r\n\
  case 2:  Fitness=SchafferF6(x);   Schaffer F6[-100,100]  \r\n\
  case 3:  Fitness=SchafferF7(x);   Schaffer F7\r\n\
  case 4:  Fitness=ShubertFun(x);   \r\n\
           Shubert function         [-10,10]\r\n\
  case 5:  Fitness=WxzFun1(x);      Designed by wxz\r\n\
  case 6:  Fitness=BackStep(x);	    \r\n\
           Back Step Function1  [-20,30]\r\n\
  case 7:  Fitness=DeJongF2(x);   \r\n\
           De Jong F2 [-2.048,2.048]\r\n\
  case 8:  Fitness=DeJongF3(x);     De Jong F3  [-5.12,5.12]\r\n\
  case 9:  Fitness=DeJongF4(x);     De Jong F4  [-1.28,1.28]\r\n\
  case 10: Fitness=MultiGoal1(x);   Multi-goal [-2,2]\r\n\
  case 11: Fitness=FoxHole(px);     [-10,10] \r\n\
  case 12: Fitness=AckleyFun(x);    [-20,30]\r\n\
  case 13: Fitness=Zhanglin1(x);    Zhanglin1 [0,1]\r\n\
  case 14: Fitness=Zhanglin2(x);    Zhanglin2 [0,1]\r\n\
  case 15: Fitness=Rosenbrock(x);   Rosenbrock  [-5.12,5.12]\r\n\
  case 16: Fitness=Rastrigin(x);   \r\n\
           [-5.12,5.12] wobbling no need\r\n\
  case 17: Fitness=Gauss(x);        Gauss [-5.12,5.12]\r\n\
  case 18: Fitness=Wxz2(x);         wxz, [-5.12,5.12]\r\n\
  case 19: Fitness=Goldstein_Price(x);  \r\n\
           Goldstein_Price, [-2,2],Min=3\r\n\
  case 20: Fitness=Branin_RCOS(x);  \r\n\
           x1:[-5,10],x2:[0,15],Min=0.397887\r\n\
		   ");
const CString gstrFunList2=_T("\
case 21: Fitness=BohachevskyF3(x);  \r\n\
           Bohachevsky F3[-50,50]\r\n\
  case 22: Fitness=Colville(x);  Coliville [-10,10],Min=0;\r\n\
  case 23: Fitness=SolveEquation1(x);   wxz,[-Pi,Pi]\r\n\
  case 24: Fitness=SolveEquation2(x);   wxz,[-Pi,Pi]\r\n\
  case 25: Fitness=ThemoPowerPlant(x);\r\n\
  case 26: Fitness=FletchPowellFun(x);  [-3.142,3.142]\r\n\
  case 27: Fitness=LiPengFun(double x)  x[1]>-3,x[2]<3\r\n\
	       optima:f(-0.0093,1.5814)=8.10621\r\n\
  case 28: Fitness=KeaneBump(x);  //x[1]>-3,x[2]<3\r\n\
	        [0,10] and s.t.,n=20, max=0.8035\r\n\
  case 29: Fitness=SchwefelFun(x);    //[-512,511]\r\n\
  case 30: Fitness=LeungF2(x);  [-5.12,5.12]\r\n\
  case 31: Fitness=LeungF4(x)   [-600,600]\r\n\
  case 32: Fitness=LeungF5(x)   [-50,50]\r\n\
  case 33: Fitness=LeungF9(x)   [-5,5]\r\n\
  case 34: Fitness=LeungF13(x)  [-10,10]\r\n\
  case 35: Fitness=LeungF14(x)  [-100,100]\r\n\
  case 36: Fitness=LeungF15(x)  [-100,100]\r\n\
  case 37: Fitness=ShiKuiFan(px); \r\n\

⌨️ 快捷键说明

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