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

📄 geneticdlg.cpp

📁 vc编程实现bp神经网络
💻 CPP
字号:
// GeneticDlg.cpp : implementation file
//

#include "stdafx.h"
#include "optsoftware.h"
#include "GeneticDlg.h"
#include "individual.h"
#include "SGAOptimize.h"
#include "SRealGAOptimize.h"
#include "math.h"

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

double cro,muta;   //全局变量
int geno,popsize,totallength;
individual unit;

int a[30];//存每个变量的码长
extern double zdh5[30],LowerVariable[30];
extern int VariableNo;
extern double r;
extern CString Objectfun;

/////////////////////////////////////////////////////////////////////////////
// CGeneticDlg dialog


CGeneticDlg::CGeneticDlg(CWnd* pParent /*=NULL*/)
	: CDialog(CGeneticDlg::IDD, pParent)
{
	//{{AFX_DATA_INIT(CGeneticDlg)
	m_binary = -1;
	m_text2 = _T("");
	m_text1 = _T("");
	//}}AFX_DATA_INIT
}


void CGeneticDlg::DoDataExchange(CDataExchange* pDX)
{
	CDialog::DoDataExchange(pDX);
	//{{AFX_DATA_MAP(CGeneticDlg)
	DDX_Control(pDX, IDC_PROGRESS1, m_progress);
	DDX_Radio(pDX, IDC_BINARY, m_binary);
	DDX_Text(pDX, IDC_REASULT, m_text2);
	DDX_Text(pDX, IDC_VARIABLEOUT, m_text1);
	//}}AFX_DATA_MAP
}


BEGIN_MESSAGE_MAP(CGeneticDlg, CDialog)
	//{{AFX_MSG_MAP(CGeneticDlg)
	ON_BN_CLICKED(IDC_BUTTON1, OnButton1)
	ON_WM_TIMER()
	//}}AFX_MSG_MAP
END_MESSAGE_MAP()

/////////////////////////////////////////////////////////////////////////////
// CGeneticDlg message handlers

int timer;//为进度条设置的定时器

void CGeneticDlg::OnButton1() 
{
	// TODO: Add your control notification handler code here
		// TODO: Add your control notification handler code here
	double TempResult;
	char s1[10],s2[10],s3[10],s4[10],s5[10];//从编辑框中得到参数值以及精度	
	CEdit *d1,*d2,*d3,*d4,*d5;
	d1=(CEdit*)GetDlgItem(IDC_CROSSOVER);
	d2=(CEdit*)GetDlgItem(IDC_MUTATION);
	d3=(CEdit*)GetDlgItem(IDC_GENERATENO);
	d4=(CEdit*)GetDlgItem(IDC_POPSIZENO);
	d5=(CEdit*)GetDlgItem(IDC_PRECITION);
	if(!d1->GetWindowText(s1,10)||!d2->GetWindowText(s2,10)||!d3->GetWindowText(s3,10)||!d4->GetWindowText(s4,10))
	{
		AfxMessageBox("请输入参数!");
		return;
	}
	d1->GetWindowText(s1,10);
	cro=atof(s1);
	d2->GetWindowText(s2,10);
	muta=atof(s2);
	d3->GetWindowText(s3,10);
	geno=atoi(s3);
	d4->GetWindowText(s4,10);
	popsize=atoi(s4);
	d5->GetWindowText(s5,10);
	precision=atoi(s5);
	UpdateData(TRUE);
	switch(m_binary)
	{
		case 0:			
		if(!d5->GetWindowText(s5,10))//此精度要求只对二进制编码时有作用,	
		{		                     //所以在十进制编码时不考虑其是否输入
			AfxMessageBox("请输入精度要求!");		
			return;	
		}
		GetLength();
		binary();
		b[1]=b[0];
		LastVariable1=FormerVariable;
		binary();
		b[2]=b[0];//先存两次的结果
		LastVariable2=FormerVariable;
		if(b[1]<b[2])
		{
			double temp;
			CString str;
			temp=b[1];
			b[1]=b[2];
			b[2]=temp;
			str=LastVariable1;
			LastVariable1=LastVariable2;
			LastVariable2=str;
		}
		for(m_count=1;m_count<=10;m_count++)
		{
			timer=SetTimer(1,100, NULL);//定时器
			binary();//总共计算了21次
			if(b[0]>b[1])
			{
				b[1]=b[0];
				LastVariable1=FormerVariable;
			}
			else
				if(b[0]<b[2])
				{				
					b[2]=b[0];
					LastVariable2=FormerVariable;
				}			
		}
/*			if(b[2]-b[3]>5)//设置的收敛条件,是否从界面上输入?
			{
				AfxMessageBox("受随机初始值或参数的影响,优化结果不收敛,请重新计算或修改参数!");
			}
			else
			{ */		
//				m_text2.Format("%f",b[2]);
				m_text1=LastVariable2;
				TempResult=ReturnOptResult(LastVariable2);
				m_text2.Format("%f",TempResult);
				UpdateData(FALSE);
//			}
		break;
	case 1:		
		real();
		b[1]=b[0];
		LastVariable1=FormerVariable;
		real();
		b[2]=b[0];//先存两次的结果
		LastVariable2=FormerVariable;
		if(b[1]<b[2])
		{
			double temp;
			CString str;
			temp=b[1];
			b[1]=b[2];
			b[2]=temp;
			str=LastVariable1;
			LastVariable1=LastVariable2;
			LastVariable2=str;
		}
		for(m_count=1;m_count<=10;m_count++)
		{
			timer=SetTimer(2,100,NULL);
			real();
			if(b[0]>b[1])
			{
				b[1]=b[0];
				LastVariable1=FormerVariable;
			}
			else
				if(b[0]<b[2])
				{				
					b[2]=b[0];
					LastVariable2=FormerVariable;
				}			
		}
/*		if(b[1]-b[2]>30)
			{
				AfxMessageBox("不符合收敛条件,请重新设置参数,再次优化!");
			}				
		else
			{ 	
				m_text2.Format("%f",b[2]);
				m_text1=LastVariable2;
				UpdateData(FALSE);
//			}*/
		m_text1=LastVariable2;
		TempResult=ReturnOptResult(LastVariable2);
		m_text2.Format("%f",TempResult);
		UpdateData(FALSE);
		break;
	default:		
		AfxMessageBox("请选择编码类型!");
	}  
}

void CGeneticDlg::binary()
{
	MSG message;//消息处理
	r=1;
	CSGAOptimize opt;
    opt.GenerateInitialPopulation();
	opt.EvaluatePopulation();
	while(opt.generation<opt.params.MaxGeneration)
	{
		r=r*0.05;
		opt.generation++;
		opt.GenerateNextPopulation();
		opt.EvaluatePopulation();
//		opt.PerformEvolution();
		if(::PeekMessage(&message,NULL,0,0,PM_REMOVE))//消息处理所需					
			{					
				::TranslateMessage(&message);		
				::DispatchMessage(&message);
			}
	}
	StrArray[30]=_T("");
	b[0]=opt.currentbest[0].fitness;
	for(int i=0;i<VariableNo;i++)
	{
		StrArray[i].Format("%f",opt.currentbest[0].realvalue[i]);
		if(StrArray[30]=="")
		{
			StrArray[30]=StrArray[i];
		}
		else
		{
			StrArray[30]=StrArray[30]+"#"+StrArray[i];
		}
	}
	FormerVariable=StrArray[30];

}

void CGeneticDlg::real()
{
	MSG message;//消息处理所需
	r=1;
	CSRealGAOptimize opt;
    opt.GenerateInitialPopulation();
	opt.EvaluatePopulation();
	while(opt.generation<opt.params.MaxGeneration)
	{
		r=r*0.05;
		opt.generation++;
		opt.GenerateNextPopulation();
		opt.EvaluatePopulation();
//		opt.PerformEvolution();//每次循环到最后,PeekMessage函数允许其他消息被处理,此处为wm_timer
		if(::PeekMessage(&message,NULL,0,0,PM_REMOVE))//消息处理所需					
			{					
				::TranslateMessage(&message);		
				::DispatchMessage(&message);
			}
	}
	StrArray[30]=_T("");
	b[0]=opt.currentbest[0].fitness;
	for(int i=0;i<VariableNo;i++)
	{
		StrArray[i].Format("%f",opt.currentbest[0].realvalue[i]);
		if(StrArray[30]=="")
		{
			StrArray[30]=StrArray[i];
		}
		else
		{
			StrArray[30]=StrArray[30]+"#"+StrArray[i];
		}
	}
	FormerVariable=StrArray[30];

}

void CGeneticDlg::OnTimer(UINT nIDEvent) 
{
	// TODO: Add your message handler code here and/or call default
	CProgressCtrl * pBar=(CProgressCtrl *)GetDlgItem(IDC_PROGRESS1);
	pBar->SetPos(m_count*10);//进度条按计数的次数每次增长这么多
	if(nIDEvent==1)
	{
		if(m_count==10)//当进度条达到最大时使进度条重新回到起始状态,这里是以m_count作为计数
		{
			KillTimer(timer);	
			pBar->SetPos(0);
		}
	}
	else if(nIDEvent==2)
	{
		if(m_count==10)//当进度条达到最大时使进度条重新回到起始状态,这里是以m_count作为计数
		{
			KillTimer(timer);	
			pBar->SetPos(0);
		}
	}
	CDialog::OnTimer(nIDEvent);
}


void CGeneticDlg::GetLength()
{
	int b=1;
	double x;
	double minus;
	for(int i=0;i<precision;i++)
	{
		b=b*10;
	}
	for(int j=0;j<VariableNo;j++)
	{		
		minus=zdh5[j]-LowerVariable[j];
		x= minus*b;
		a[j]=log(x)/log(2)+1;//每个变量的编码长度,取整后加1
	}
	for(int k=0;k<VariableNo;k++)
	{
		totallength+=a[k];//一个个体编码总长度
	}

}

double CGeneticDlg::ReturnOptResult(CString str)//得到f(x)
{
	CString StrTemp,StrTemp1[30];
	str=str+"#";
	double Result[30],LastResult;
	for(int i=0,j=0;i<str.GetLength();i++)
	{ 
	  StrTemp=str.GetAt(i);
	  if (StrTemp!='#')
	  {
		  StrTemp1[j]=StrTemp1[j]+StrTemp;
	  }
	  else 
	  { 
		  Result[j]=atof(StrTemp1[j]);
		  j++;
	   }
	}
	M_FORMULA1.SetFormula(Objectfun.GetBuffer(Objectfun.GetLength()));
	LastResult=M_FORMULA1.computer(Result,VariableNo);
	return LastResult;
	
}

⌨️ 快捷键说明

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