📄 ca_testdlg.cpp
字号:
lMaxCount2=lMaxCount2+0.5;
pDC->MoveTo(LeftTop_x,LeftTop_y);//这里画了一个矩形区域
pDC->LineTo(LeftTop_x,RightButtom_y);
pDC->LineTo(RightButtom_x,RightButtom_y);
pDC->LineTo(RightButtom_x,LeftTop_y);
pDC->LineTo(LeftTop_x,LeftTop_y);
double jiangeX=(double((RightButtom_x-LeftTop_x))/m_edit2); //水平间隔
for(int j=1;j<=m_edit2;j++)
{
if(m_edit2<500)
{
// if(j%20==0)
{ //完成水平坐标值的标定
pDC->MoveTo(LeftTop_x+jiangeX/2+j*jiangeX, RightButtom_y);
pDC->LineTo(LeftTop_x+jiangeX/2+j*jiangeX, RightButtom_y+6);
CString str5;
str5.Format("%d",j);
pDC->TextOut(LeftTop_x-4+jiangeX/2+j*jiangeX, RightButtom_y+3,str5);
CPen pen1(PS_DASH,0.5,RGB(0,0,0));
CPen *pOldPen=pDC->SelectObject(&pen1);
if(j<m_edit2) //这里完成网格垂直线的绘制
{
pDC->MoveTo(j*jiangeX+LeftTop_x,LeftTop_y);
pDC->LineTo(j*jiangeX+LeftTop_x,RightButtom_y);
}
pDC->SelectObject(pOldPen);
pen1.DeleteObject();
}
}
else
{
if(j%40==0)//世代数大于200,则每隔40标定横坐标
{
pDC->MoveTo(LeftTop_x+jiangeX/2+j*jiangeX, RightButtom_y);
pDC->LineTo(LeftTop_x+jiangeX/2+j*jiangeX, RightButtom_y+6);
CString str5;
str5.Format("%d",j);
pDC->TextOut(LeftTop_x-4+jiangeX/2+j*jiangeX, RightButtom_y+3,str5);
CPen pen1(PS_DASH,0.5,RGB(0,0,0));
CPen *pOldPen=pDC->SelectObject(&pen1);
if(j<m_edit2)
{
pDC->MoveTo(j*jiangeX+LeftTop_x,LeftTop_y);
pDC->LineTo(j*jiangeX+LeftTop_x,RightButtom_y);
}
pDC->SelectObject(pOldPen);
pen1.DeleteObject();
}
}
}
double jiangeY=(double((RightButtom_y-LeftTop_y))/SegCount); //竖直间隔
for (i=0;i<(SegCount+1);i+=1)
{
pDC->MoveTo(LeftTop_x, RightButtom_y-i*jiangeY);
pDC->LineTo(LeftTop_x-4, RightButtom_y-i*jiangeY);
CString str6;
str6.Format("%d",int(lMaxCount2/SegCount)*i);
pDC->TextOut(2, RightButtom_y-5-i*jiangeY,str6);
CPen pen2(PS_DASH,0.5,RGB(0,0,0));
CPen *pOldPen1=pDC->SelectObject(&pen2);
if(i<SegCount && i>=1)//下面画网格水平线
{
pDC->MoveTo(LeftTop_x,RightButtom_y-i*jiangeY);
pDC->LineTo(RightButtom_x,RightButtom_y-i*jiangeY);
}
pDC->SelectObject(pOldPen1);
pen2.DeleteObject();
}
CPen pen3(PS_SOLID,2,RGB(255,0,0));//红色的画笔表示每世代的平均值
CPen *pOldPen2=pDC->SelectObject(&pen3);
for (i=1;i<DataLength;i++)
{
pDC->MoveTo(LeftTop_x+jiangeX*(i-1),RightButtom_y-(RightButtom_y-LeftTop_y)*(aver1[i]-lMinCount2)/(lMaxCount2-lMinCount2));
pDC->LineTo(LeftTop_x+jiangeX*i,RightButtom_y-(RightButtom_y-LeftTop_y)*(aver1[i+1]-lMinCount2)/(lMaxCount2-lMinCount2));
}
pDC->SelectObject(pOldPen2);
pen3.DeleteObject();
CPen pen4(PS_SOLID,2,RGB(0,0,255));//蓝色画笔表示每世代的最大值
CPen *pOldPen3=pDC->SelectObject(&pen4);
for (i=1;i<DataLength;i++)
{
pDC->MoveTo(LeftTop_x+jiangeX*(i-1),RightButtom_y-(RightButtom_y-LeftTop_y)*(curbest[i]-lMinCount2)/(lMaxCount2-lMinCount2));
pDC->LineTo(LeftTop_x+jiangeX*i,RightButtom_y-(RightButtom_y-LeftTop_y)*(curbest[i+1]-lMinCount2)/(lMaxCount2-lMinCount2));
}
pDC->SelectObject(pOldPen3);
pen4.DeleteObject();
pDC->TextOut(RightButtom_x+20,RightButtom_y+5,"代数");
pDC->TextOut(LeftTop_x-40,LeftTop_y-20,"函数值");
}
void CCA_TestDlg::crossover()//交叉
{
int i,j,k;
// s=(int)(1+rand()%(2-1));
// struct individual R[10][10];
struct individual temp11[10][10];
struct individual temp22[10][10];
double lamda=double(rand())/RAND_MAX*3-2;
/*
for(i=0;i<L;i++)
{
for(j=0;j<L;j++)
{
R[i][j]=population[i][j];
}
}
*/
/* for(i=0;i<L;i++)
{
for(j=0;j<L;j++)
{
for(k=0;k<2;k++)
{
if(k>=1&&k<=s)
{
population[i][j].x[k]=R[i][j].x[k];
}
else
{
population[i][j].x[k]=bestneighboragent[i][j].x[k];
}
}
}
}
*/
////
for(i=0;i<L;i++)
{
for(j=0;j<L;j++)
{
for(k=0;k<2;k++)
{
temp11[i][j].x[k]=lamda*population[i][j].x[k]+(1-lamda)*bestneighborindividual[i][j].x[k];
temp22[i][j].x[k]=(1-lamda)*population[i][j].x[k]+lamda*bestneighborindividual[i][j].x[k];
}
}
}
////
for(i=0;i<L;i++)
{
for(j=0;j<L;j++)
{
for(k=0;k<2;k++)
{
population[i][j].x[k]=temp11[i][j].x[k];
}
}
}
calculateobjectvalue();
calculatefitnessvalue();
for(i=0;i<L;i++)
{
for(j=0;j<L;j++)
{
temp11[i][j].fitness=population[i][j].fitness;
}
}
////
for(i=0;i<L;i++)
{
for(j=0;j<L;j++)
{
for(k=0;k<2;k++)
{
population[i][j].x[k]=temp22[i][j].x[k];
}
}
}
calculateobjectvalue();
calculatefitnessvalue();
for(i=0;i<L;i++)
{
for(j=0;j<L;j++)
{
temp22[i][j].fitness=population[i][j].fitness;
}
}
////
for(i=0;i<L;i++)
{
for(j=0;j<L;j++)
{
if(temp11[i][j].fitness>temp22[i][j].fitness)
{
population[i][j]=temp11[i][j];
}
else
{
population[i][j]=temp22[i][j];
}
}
}
/*
for(i=0;i<L;i++)
{
for(j=0;j<L;j++)
{
population[i][j]=R[i][j];
}
}
*/
for(i=0;i<L;i++)
{
for(j=0;j<L;j++)
{
for(k=0;k<2;k++)
{
if (population[i][j].x[k]<xmin)
{
population[i][j].x[k]=xmin;
}
if (population[i][j].x[k]>xmax)
{
population[i][j].x[k]=xmax;
}
}
}
}
}
void CCA_TestDlg::auto_mutation()//自变异算子
{
int i,j,k;
double temp1;
double rand1;
for(i=0;i<L;i++)
{
for(j=0;j<L;j++)
{
agent[i][j]=population[i][j];
}
}
for(i=0;i<L;i++)
{
for(j=0;j<L;j++)
{
for(k=0;k<2;k++)
{
rand1=(double)rand()/RAND_MAX*1.0;
population[i][j].x[k]=agent[i][j].x[k];
}
temp1=population[i][j].x[0];
population[i][j].x[0]=population[i][j].x[0]+rand1*2*p-p;
population[i][j].x[1]=temp1*temp1/population[i][j].x[0];
}
}
calculateobjectvalue();
calculatefitnessvalue();
for(i=0;i<L;i++)
{
for(j=0;j<L;j++)
{
if(population[i][j].fitness>agent[i][j].fitness)
{
agent[i][j]=population[i][j];
}
}
}
for(i=0;i<L;i++)
{
for(j=0;j<L;j++)
{
for(k=0;k<2;k++)
{
if (agent[i][j].x[k]<xmin)
{
agent[i][j].x[k]=xmin;
}
if (agent[i][j].x[k]>xmax)
{
agent[i][j].x[k]=xmax;
}
}
}
}
for(i=0;i<L;i++)
{
for(j=0;j<L;j++)
{
population[i][j]=agent[i][j];
}
}
}
void CCA_TestDlg::compete()//领域竞争算子
{
int i,j,k;
double rand1;
rand1=(double)rand()/RAND_MAX*2.0-1.0;
for(i=0;i<L;i++)
{
for(j=0;j<L;j++)
{
if (population[i][j].fitness<bestneighborindividual[i][j].fitness)
{
for(k=0;k<2;k++)
{
if(bestneighborindividual[i][j].x[k]+rand1*(bestneighborindividual[i][j].x[k]-population[i][j].x[k])<xmin)
{
population[i][j].x[k]=xmin;
}
else if(bestneighborindividual[i][j].x[k]+rand1*(bestneighborindividual[i][j].x[k]-population[i][j].x[k])>xmax)
{
population[i][j].x[k]=xmax;
}
else
{
population[i][j].x[k]=bestneighborindividual[i][j].x[k]+rand1*(bestneighborindividual[i][j].x[k]-population[i][j].x[k]);
}
}
}
}
}
evaluatepopulation();
}
void CCA_TestDlg::calculateobjectvalue()
{
int i,j;
double value;
for(i=0;i<L;i++)
{
for(j=0;j<L;j++)
{
value=0.0;
// GetDlgItem(IDC_COMBO1)->GetWindowText(str);
// if(str=="Rosenbrock函数")
// {
/*
for(k=0;k<2;k++)
{
if(k+1>2)
{
population[i][j].x[k+1]=population[i][j].x[1];
}
value=value+(100*pow(population[i][j].x[k+1]-pow(population[i][j].x[k],2),2)+pow((1-population[i][j].x[k]),2));
}
*/
value=value+(100*pow((pow(population[i][j].x[0],2)-population[i][j].x[1]),2)+pow((1-population[i][j].x[0]),2));
// }
/* if(str=="Ackley函数")
{
double value1,value2;
value1=0.0;
value2=0.0;
for(k=1;k<=n;k++)
{
value1=value1+pow(agent[i][j].x[k],2);
value2=value2+cos(2*3.1415926*agent[i][j].x[k]);
}
value=-20*exp(-0.2*sqrt(value1/n))-exp(value2/n)+20+2.72;
}
if(str=="Schwefel函数")
{
for(k=1;k<=n;k++)
{
value=value+(-agent[i][j].x[k]*sin(sqrt(fabs(agent[i][j].x[k]))));
}
}
if(str=="Rastrigin函数")
{
for(k=1;k<=n;k++)
{
value=value+(pow(agent[i][j].x[k],2)-10*cos(2*3.1415926*agent[i][j].x[k])+10);
}
}
if(str=="Griewank函数")
{
double value1,value2;
value1=0.0;
value2=1.0;
for(k=1;k<=n;k++)
{
value1=value1+pow(agent[i][j].x[k],2);
value2=value2*cos(agent[i][j].x[k]/sqrt(k));
}
value=value1/4000-value2+1;
}
if(str=="求和函数")
{
for(k=1;k<=n;k++)
{
value=value+pow(agent[i][j].x[k],2);
}
}*/
population[i][j].value=value;
}
}
}
void CCA_TestDlg::findneighborbestindividual()
{
int i,j,k;
struct individual bestna;
struct individual neighborindividual[8];
int aaa=0;
FILE *fp1;
fp1=fopen("neigbour.txt","w");
for(i=0;i<L;i++)
{
for(j=0;j<L;j++)
{
aaa++;
fprintf(fp1,"%d\n",aaa);
fprintf(fp1,"%d\n",L);
fprintf(fp1,"%d,%d\n",i,j);
for(k=0;k<8;k++)
{
neighborindividual[k].fitness=0.0;
}
if((i==0)&&(j==0))
{
//neighborindividual[0]=population[L-1][L-1];
//neighborindividual[1]=population[L-1][j];
//neighborindividual[2]=population[L-1][j+1];
//neighborindividual[3]=population[i][L-1];
neighborindividual[4]=population[i][j+1];
//neighborindividual[5]=population[i+1][L-1];
neighborindividual[6]=population[i+1][j];
//neighborindividual[7]=population[i+1][j+1];
fprintf(fp1,"%lf\n",neighborindividual[4].fitness);
fprintf(fp1,"%lf\n",neighborindividual[6].fitness);
fprintf(fp1,"\n");
}
if((i!=0)&&(i!=L-1)&&(j!=0)&&(j!=L-1))
{
//neighborindividual[0]=population[i-1][j-1];
neighborindividual[1]=population[i-1][j];
//neighborindividual[2]=population[i-1][j+1];
neighborindividual[3]=population[i][j-1];
neighborindividual[4]=population[i][j+1];
//neighborindividual[5]=population[i+1][j-1];
neighborindividual[6]=population[i+1][j];
//neighborindividual[7]=population[i+1][j+1];
fprintf(fp1,"%lf\n",neighborindividual[1].fitness);
fprintf(fp1,"%lf\n",neighborindividual[3].fitness);
fprintf(fp1,"%lf\n",neighborindividual[4].fitness);
fprintf(fp1,"%lf\n",neighborindividual[6].fitness);
fprintf(fp1,"\n");
}
if((i==0)&&(j!=0)&&(j!=L-1))
{
//neighborindividual[0]=population[L-1][j-1];
//neighborindividual[1]=population[L-1][j];
//neighborindividual[2]=population[L-1][j+1];
neighborindividual[3]=population[i][j-1];
neighborindividual[4]=population[i][j+1];
//neighborindividual[5]=population[i+1][j-1];
neighborindividual[6]=population[i+1][j];
//neighborindividual[7]=population[i+1][j+1];
fprintf(fp1,"%lf\n",neighborindividual[3].fitness);
fprintf(fp1,"%lf\n",neighborindividual[4].fitness);
fprintf(fp1,"%lf\n",neighborindividual[6].fitness);
fprintf(fp1,"\n");
}
if((i!=0)&&(i!=L-1)&&(j==0))
{
//neighborindividual[0]=population[i-1][L-1];
neighborindividual[1]=population[i-1][j];
//neighborindividual[2]=population[i-1][j+1];
//neighborindividual[3]=population[i][L-1];
neighborindividual[4]=population[i][j+1];
//neighborindividual[5]=population[i+1][L-1];
neighborindividual[6]=population[i+1][j];
//neighborindividual[7]=population[i+1][j+1];
fprintf(fp1,"%lf\n",neighborindividual[1].fitness);
fprintf(fp1,"%lf\n",neighborindividual[4].fitness);
fprintf(fp1,"%lf\n",neighborindividual[6].fitness);
fprintf(fp1,"\n");
}
if((i==L-1)&&(j!=0)&&(j!=L-1))
{
//neighborindividual[0]=population[i-1][j-1];
neighborindividual[1]=population[i-1][j];
//neighborindividual[2]=population[i-1][j+1];
neighborindividual[3]=population[i][j-1];
neighborindividual[4]=population[i][j+1];
//neighborindividual[5]=population[0][j-1];
//neighborindividual[6]=population[0][j];
//neighborindividual[7]=population[0][j+1];
fprintf(fp1,"%lf\n",neighborindividual[1].fitness);
fprintf(fp1,"%lf\n",neighborindividual[3].fitness);
fprintf(fp1,"%lf\n",neighborindividual[4].fitness);
fprintf(fp1,"\n");
}
if((i!=0)&&(i!=L-1)&&(j==L-1))
{
//neighborindividual[0]=population[i-1][j-1];
neighborindividual[1]=population[i-1][j];
//neighborindividual[2]=population[i-1][0];
neighborindividual[3]=population[i][j-1];
//neighborindividual[4]=population[i][0];
//neighborindividual[5]=population[i+1][j-1];
neighborindividual[6]=population[i+1][j];
//neighborindividual[7]=population[i+1][0];
fprintf(fp1,"%lf\n",neighborindividual[1].fitness);
fprintf(fp1,"%lf\n",neighborindividual[3].fitness);
fprintf(fp1,"%lf\n",neighborindividual[6].fitness);
fprintf(fp1,"\n");
}
if((i==0)&&(j==L-1))
{
//neighborindividual[0]=population[L-1][j-1];
//neighborindividual[1]=population[L-1][j];
//neighborindividual[2]=population[L-1][0];
neighborindividual[3]=population[i][j-1];
//neighborindividual[4]=population[i][0];
//neighborindividual[5]=population[i+1][j-1];
neighborindividual[6]=population[i+1][j];
//neighborindividual[7]=population[i+1][0];
fprintf(fp1,"%lf\n",neighborindividual[3].fitness);
fprintf(fp1,"%lf\n",neighborindividual[6].fitness);
fprintf(fp1,"\n");
}
if((i==L-1)&&(j==0))
{
//neighborindividual[0]=population[i-1][L-1];
neighborindividual[1]=population[i-1][j];
//neighborindividual[2]=population[i-1][j+1];
//neighborindividual[3]=population[i][L-1];
neighborindividual[4]=population[i][j+1];
//neighborindividual[5]=population[0][L-1];
//neighborindividual[6]=population[0][j];
//neighborindividual[7]=population[0][j+1];
fprintf(fp1,"%lf\n",neighborindividual[1].fitness);
fprintf(fp1,"%lf\n",neighborindividual[4].fitness);
fprintf(fp1,"\n");
}
if((i==L-1)&&(j==L-1))
{
//neighborindividual[0]=population[i-1][j-1];
neighborindividual[1]=population[i-1][j];
//neighborindividual[2]=population[i-1][0];
neighborindividual[3]=population[i][j-1];
//neighborindividual[4]=population[i][0];
//neighborindividual[5]=population[0][j-1];
//neighborindividual[6]=population[0][j];
//neighborindividual[7]=population[0][0];
fprintf(fp1,"%lf\n",neighborindividual[1].fitness);
fprintf(fp1,"%lf\n",neighborindividual[3].fitness);
fprintf(fp1,"\n");
}
// for(k=0;k<8;k++)
// {
// fprintf(fp1,"%lf\n",neighborindividual[k].fitness);
// }
bestna.fitness=neighborindividual[0].fitness;
for(k=0;k<8;k++)
{
if(neighborindividual[k].fitness>bestna.fitness)
{
bestna=neighborindividual[k];
}
}
bestneighborindividual[i][j]=bestna;
fprintf(fp1,"%lf\n",bestneighborindividual[i][j].fitness);
fprintf(fp1,"\n\n");
}
}
fclose(fp1);
}
void CCA_TestDlg::performevolution()
{
if (bestindividual.fitness>currentbest.fitness)
{
currentbest=population[best_indexi][best_indexj];
}
else
{
population[worst_indexi][worst_indexj]=currentbest;
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -