📄 geneticdlg.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 + -