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

📄 sccadlg.cpp

📁 免疫算法求解函数优化问题运行时请选择所要的函数,并且点Button1执行
💻 CPP
📖 第 1 页 / 共 2 页
字号:
	//定义程序变量
	//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 + -