📄 sccadlg.cpp
字号:
//定义程序变量
//srand((unsigned)time(null);
//------------------------------------------------------------------------------
for(i=0;i<N;i++)
{
for(j=0;j<c*CL;j++)
{
ab=rand()/z;
if(ab<=0.5)
{
v[i][j]=0;
}
else
{
v[i][j]=1;
}
}
}
//初始化二进制种群
for(i=0;i<N;i++)
{
for(j=0;j<c;j++)
{
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];
}
}
fal[j]=v1[i][j]*(vup-vdown)/(pow(2,CL)-1)+vdown;
}
fit[i]=comfit(funn,c,fal);
}
//译码
fev=fev+N;
//计算亲合度值
while(it<ge&&sollution<ting)
{
for(i=0;i<N;i++)
{
double *r=new double[c*CL];
memset(r,0,sizeof(double)*c*CL);
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];
}
}
}
delete[]r;
//克隆操作
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];
}
}
fal[k]=v1[j][k]*(vup-vdown)/(pow(2,CL)-1)+vdown;
}
fit1[j]=comfit(funn,c,fal);
fev=fev+1;
}
//克隆子群体计算亲合度值
//-------------------------------------------------
max=fit[i];
int *maxhang=new int[c*CL];
memset(r,0,sizeof(int)*c*CL);
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;
delete[]maxhang;
}
//克隆选择完成
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);
delete[]v;
delete[]v1;
}
void CSCCADlg::OnEditchangeCombo1()
{
// TODO: Add your control notification handler code here
}
void CSCCADlg::Window()
{
CClientDC dcl(this);
CString str1="";
dcl.SetTextColor(RGB(255,0,0));
dcl.TextOut(380,310,str1);
CClientDC shuazi(this);
CBrush sz(RGB(250,250,250));
CBrush *p_oldbrush;
p_oldbrush = shuazi.SelectObject(&sz);
CRect rect(225,15,600,253);
shuazi.FillRect(&rect,p_oldbrush);
}
void CSCCADlg::huatu() //画网格//四顶点坐标(228,22)(580,22)(228,250)(580,250)
{
CClientDC dc(this);
CPen al(PS_DOT,1,RGB(255,255,0));
CPen *p_oldpen;
p_oldpen = dc.SelectObject(&al);
//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);
}
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 vli[])
//计算一个抗体的亲和力,funn为函数序号,vn为变量维数,vli[]为一个抗体
{
int i;
double f1=0,flh,flm;
switch(funn)
{
case 1:
{
f1=10+(sin(1/vli[0]))/((vli[0]-0.16)*(vli[0]-0.16)+0.1);
}
break;
case 3:
{
f1=pow(vli[0],2)+pow(vli[1],2)-0.3*cos(3*3.1415926535897931*vli[0])
+0.3*cos(4*3.1415926535897931*vli[1])+0.3;
f1=-1*f1;
}
break;
case 4:
{
flh=0;flm=0;
for(int i=1;i<6;i++)
{
flh=flh+i*cos((i+1)*vli[0]+i);
flm=flm+i*cos((i+1)*vli[1]+i);
}
f1=flh*flm;
f1=-1*f1;
}
break;
case 5:
{
f1=1+vli[0]*sin(4*3.1415926*vli[0])-vli[1]*sin(4*3.1415926*vli[1]+3.1415926)+
sin(6*sqrt(vli[0]*vli[0]+vli[1]*vli[1]))/(6*sqrt(vli[0]*vli[0]+vli[1]*vli[1])
+pow(10,-15));
}
break;
case 6:
{
f1=1+vli[0]*sin(4*3.1415926*vli[0])-vli[1]*sin(4*3.1415926*vli[1]+3.1415926);
}
break;
case 7:
{
f1=pow(3/(0.05+pow(vli[0],2)+pow(vli[1],2)),2)+pow(pow(vli[0],2)+pow(vli[1],2),2);
}
break;
case 8:
{
f1=-1*pow(pow(vli[0],2)+pow(vli[1],2),0.25)*
(pow(sin(50*pow(vli[0]*vli[0]+vli[1]*vli[1],0.1)),2)+1.0);
}
break;
case 9:
{
for(i=0;i<2;i++)
{
f1=f1+pow(vli[i],2)-10*cos(2*3.1415926*vli[i]);
}
f1=10*vn+f1;
f1=-1*f1;
}
break;
case 11:
{
f1=-1*pow(vli[0],2)-1*pow(vli[1],2);
}
break;
case 13:
{
f1=0.5+(pow(sin(sqrt(vli[0]*vli[0]+vli[1]*vli[1])),2)-0.5)/
pow(1+0.001*(pow(vli[0]*vli[0]+vli[1]*vli[1],2)),2);
f1=-1*f1;
}
break;
case 14:
{
f1=vli[0]*sin(sqrt(fabs(vli[1]+1-vli[0])))*cos(sqrt(fabs(vli[1]+1+vli[0])))
+(vli[1]+1)*cos(sqrt(fabs(vli[1]+1-vli[0])))*sin(sqrt(fabs(vli[1]+1+vli[0])));
f1=-1*f1;
}
break;
}
return (f1);
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -