📄 mygaview.cpp
字号:
// 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 + -