📄 sccadlg.cpp
字号:
v1[i][j]=0;
for (k=0;k<CL;k++)
{
if (v[i][j*CL+k]==1)
{
//v1[i][j]=v1[i][j]+pow(2,CL-k-1);
}
else
{
v1[i][j]=v1[i][j];
}
}
fa1[j]=v1[i][j]*(vup-vdown)/(pow(2,CL)-1)+vdown;
}
fit[i]=comfit(funn,c,fa1);
} //译码
fev=fev+N; //计算亲合度值
while (it<ge&&sollution<ting)
{
for (i=0;i<N;i++)
{
Ns=Nb;
for (j=0;j<Ns;j++)
{
for (k=0;k<c*CL;k++)
{
sub[j][k]=v[i][k];
}
for (L=0;L<c*CL;L++)
{
r[L]=rand()/z;
}
for (k=0;k<c*CL;k++)
{
if (r[k]<=1.000000000000/CL)
{
sub[j][k]=1-sub[j][k];
}
}
} //克隆操作
for (j=0;j<Ns;j++)
{
for (k=0;k<c;k++)
{
v1[j][k]=0;
for (L=0;L<CL;L++)
{
if (sub[j][k*CL+L]==1)
{
v1[j][k]=v1[j][k]+pow(2,CL-L-1);
}
else
{
v1[j][k]=v1[j][k];
}
}
fa1[k]=v1[j][k]*(vup-vdown)/(pow(2,CL)-1)+vdown;
}
fit1[j]=comfit(funn,c,fa1);
fev=fev+1;
} //克隆子群体计算亲和度值
//------------------------------------------------------------------
max=fit[i];
for (k=0;k<c*CL;k++)
{
maxhang[k]=v[i][k];
}
for (k=0;k<Ns;k++)
{
if (max<fit1[k])
{
max=fit1[k];
for (L=0;L<c*CL;L++)
{
maxhang[L]=sub[k][L];
}
}
}
for (k=0;k<c*CL;k++)
{
v[i][k]=maxhang[k];
}
fit[i]=max;
} //克隆选择完成
max=fit[0];
for (i=1;i<N;i++)
{
if (max<fit[i])
{
max=fit[i];
}
}
//输出结果:
sollution=max;
guiji[it]=sollution;
it=it+1;
m_now=it;
UpdateData(false);
}
//----------------------------
huatu();
huaquxian(it,guiji,fev);
//算法程序(输入变量:N 种群规模;funn 测试问题;c 变量维数;Nb 克隆比例;ge 最大进化代数
//输出变量:it 进化代数;guiji[]最优值进化轨迹;fev 评价次数
delete [] v;
delete [] v1;
}
//________________________________________________ 不明白为什么能运行,但显示不出来。
/*void CSCCADlg::window()//界面的预处理
{
CClientDC dc1(this);
CString str1="中华任命共和国";
dc1.SetTextColor(RGB(255,0,0));
dc1.TextOut(380,310,str1);
//CClientDC shuazi(this);
CPaintDC dc(this);
CBrush sz(RGB(250,250,100));
CBrush *p_oldbrush;
p_oldbrush=dc.SelectObject(&sz);
RECT *pRect=&dc.m_ps.rcPaint;
//*********
/*CPaintDC paintDC(this);
RECT *pRect=&paintDC.m_ps.rcPaint;
for (int x=pRect->left+30;x<pRect->right-120;x++)
{
for (int y=pRect->top+30;y<pRect->bottom-30;y++)
{
paintDC.SetPixel(x,y,x*y);//根据点的坐标计算它们的颜色
}
}
paintDC.MoveTo(pRect->left+30,pRect->top+30);
paintDC.LineTo(pRect->right-120,pRect->bottom-30);
paintDC.MoveTo(pRect->right-120,pRect->top+30);
paintDC.LineTo(pRect->left+30,pRect->bottom-30);
//*********
//CRect rect(225,15,600,253);
//CRect rect(pRect->left+30,pRect->top+30,pRect->right-120,pRect->bottom-30);
CRect rect(50,15,450,400);
//dc.FillRect(&rect,&sz);
dc.FillRect(pRect,p_oldbrush);
MessageBox("你好,你辛苦了。");
//shuazi.FillRect(&rect,sz);
}*/
//________________________________________________
void CSCCADlg::window()//界面的预处理
{
CClientDC dc1(this);
CString str1="";
dc1.SetTextColor(RGB(255,0,0));
dc1.TextOut(380,310,str1);
CClientDC shuazi(this);
CBrush sz(RGB(250,250,250));
CBrush *p_oldbrush;
p_oldbrush=shuazi.SelectObject(&sz);
//CRect rect(15,15,450,430);
CRect rect(225,15,600,253);
shuazi.FillRect(&rect,&sz);
}
void CSCCADlg::huatu()//画网格//四顶点坐标(228,22)(580,22)(228,250)(580,250)
{
CClientDC dc(this);
CPen a1(PS_DOT,1,RGB(255,255,0));
CPen *p_oldpen;
p_oldpen=dc.SelectObject(&a1);
//POINT points[3]={{10,150},{50,200},{70,160}};
//dc.Polyline(points,(ge-1));
dc.MoveTo(404,22);
dc.LineTo(404,250);
dc.MoveTo(228,136);
dc.LineTo(580,136);
dc.MoveTo(316,22);
dc.LineTo(316,250);
dc.MoveTo(228,79);
dc.LineTo(580,79);
dc.MoveTo(492,22);
dc.LineTo(492,250);
dc.MoveTo(228,193);
dc.LineTo(580,193);
dc.MoveTo(228,22);
dc.LineTo(580,22);
dc.MoveTo(580,22);
dc.LineTo(580,250);
CPen a2(PS_SOLID,1,RGB(0,0,0));
p_oldpen=dc.SelectObject(&a2);
dc.MoveTo(228,15);
dc.LineTo(228,250);
dc.MoveTo(228,250);
dc.LineTo(590,250);
dc.MoveTo(225,25);
dc.LineTo(228,15);
dc.MoveTo(228,15);
dc.LineTo(231,25);
dc.MoveTo(580,248);
dc.LineTo(590,250);
dc.MoveTo(590,250);
dc.LineTo(580,252);
dc.SelectObject(p_oldpen);
}
void CSCCADlg::huaquxian(int ab, double c[],int fev)//ab 是进化代数,fev 为计算函数值次数,c 为进化的轨迹(长为a
//的一维数组)
{
int ge=ab;
double gz=c[0];
double dx,dy;
int xo=228,yo=250;
int i;
if (c[0]!=c[ge-1])
{
dx=352.0/ge;
dy=228.0/(gz-c[ge-1]);
m_zz=c[ge-1];
m_fev=fev;
m_x1=1;
m_x2=floor(ge/4.0);
m_x3=floor(ge/2.0);
m_x4=floor(ge*3/4.0);
m_x5=ge;
m_y1=gz;
m_y2=gz-(gz-c[ge-1])/4.0;
m_y3=gz-(gz-c[ge-1])/2.0;
m_y4=gz-(gz-c[ge-1])*3/4.0;
m_y5=c[ge-1];
UpdateData(false);
for (i=1;i<ge;i++)
{
//------------------------------
CClientDC dc(this);
CPen a(PS_SOLID,2,RGB(255,0,0));
CPen *p_oldpen;
p_oldpen=dc.SelectObject(&a);
dc.MoveTo(xo+(i-1)*dx,yo+dy*(c[i-1]-c[0]));
dc.LineTo(xo+i*dx,yo+dy*(c[i]-c[0]));
dc.SelectObject(p_oldpen); //画图
//------------------------------
}
}
else
{
dx=352.0/ge;
dy=0;
m_zz=c[ge-1];
m_fev=fev;
m_x1=1;
m_x2=floor(ge/4.0);
m_x3=floor(ge/2.0);
m_x4=floor(ge*3/4.0);
m_x5=ge;
m_y1=0;
m_y2=0.5*c[ge-1];
m_y3=c[ge-1];
m_y4=1.5*c[ge-1];
m_y5=2*c[ge-1];
UpdateData(false);
CClientDC dc(this);
CPen a(PS_SOLID,2,RGB(255,0,0));
CPen *p_oldpen;
p_oldpen=dc.SelectObject(&a);
dc.MoveTo(228,135);
dc.LineTo(580,135);
dc.SelectObject(p_oldpen); //画图
}
CClientDC dc2(this);
CString str2="";
dc2.TextOut(380,310,str2);
}
double CSCCADlg::comfit(int funn,int vn,double v1i[])
//计算一个抗体的亲和力,funn 为函数序号,vn 为变量维数,v1i[]为一个抗体
{
int i;double f1=0,f1h,f1m;
switch (funn)
{
case 1:
{
f1=10+(sin(1/v1i[0]))/((v1i[0]-0.16)*(v1i[0]-0.16)+0.1);
}
break;
case 3:
{
f1=pow(v1i[0],2)+pow(v1i[1],2)-0.3*cos(3*3.1415926535897931*v1i[0])+0.3*cos(4*3.1415926535897931*v1i[1])+0.3;
f1=-1*f1;
}
break;
case 4:
{
f1h=0;f1m=0;
for (i=1;i<6;i++)
{
f1h=f1h+i*cos((i+1)*v1i[0]+i);
f1m=f1m+i*cos((i+1)*v1i[1]+i);
}
f1=f1h*f1m;
f1=-1*f1;
}
break;
case 5:
{
f1=1+v1i[0]*sin(4*3.1415926*v1i[0])-v1i[1]*sin(4*3.1415926*v1i[1]+3.1415926)+sin(6*sqrt(v1i[0]*v1i[0]+v1i[1]*v1i[1]))/(
6*sqrt(v1i[0]*v1i[0]+v1i[1]*v1i[1])+pow(10,-15));
}
break;
case 6:
{
f1=1+v1i[0]*sin(4*3.1415926*v1i[0])-v1i[1]*sin(4*3.1415926*v1i[1]+3.1415926);
}
break;
case 7:
{
f1=pow(3/(0.05+pow(v1i[0],2)+pow(v1i[1],2)),2)+pow(pow(v1i[0],2)+pow(v1i[1],2),2);
}
break;
case 8:
{
f1=-1*pow(pow(v1i[0],2)+pow(v1i[1],2),0.25)*(pow(sin(50*pow(v1i[0]*v1i[0]+v1i[1]*v1i[1],0.1)),2)+1.0);
}
break;
case 9:
{
for (i=0;i<2;i++)
{
f1=f1+pow(v1i[i],2)-10*cos(2*3.1415926*v1i[i]);
}
f1=10*vn+f1;
f1=-1*f1;
}
break;
case 11:
{
f1=-1*pow(v1i[0],2)-1*pow(v1i[1],2);
}
break;
case 13:
{
f1=0.5+(pow(sin(sqrt(v1i[0]*v1i[0]+v1i[1]*v1i[1])),2)-0.5)/pow(1+0.001*(pow(v1i[0]*v1i[0]+v1i[1]*v1i[1],2)),2);
f1=-1*f1;
}
break;
case 14:
{
f1=v1i[0]*sin(sqrt(fabs(v1i[1]+1-v1i[0])))*cos(sqrt(fabs(v1i[1]+1+v1i[0])))+(v1i[1]+1)*cos(sqrt(fabs(v1i[1]+1-v1i[0])))*
sin(sqrt(fabs(v1i[1]+1+v1i[0])));
f1=-1*f1;
}
break;
}
return (f1);
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -