📄 text2.txt
字号:
float C_AB=sigma_AB(rrii,matchii[i],matchjj[i],aveB,SizeSearch // 协方差
,llii,aveA,SizeMatch);
float rel_k=C_AB/sqrt(sigmaA*sigmaB); //相关系数
matchadnn[i]=fabs(rel_k);
sumgray+=matchadnn[i];
if(matchadnn[i]>maxr)//寻找最大值
{
drag[ik]=1;
maxr=matchadnn[i];
maxii=matchii[i];
maxjj=matchjj[i];
matchadnn[kk]=matchadnn[i];
}
}
int matchii0[5],matchjj0[5],matchadnn0[5];
matchii0[0]=maxii;//复制
matchjj0[0]=maxjj;
if(maxii==0) //避免下面取负值
maxii=3;
matchii0[1]=maxii-1;//复制
matchjj0[1]=maxjj;
matchii0[2]=maxii+1;//复制
matchjj0[2]=maxjj;
matchii0[3]=maxii;//复制
if(maxjj==0) //避免下面取负值
maxjj=3;
matchjj0[3]=maxjj-1;
matchii0[4]=maxii;//复制
matchjj0[4]=maxjj+1;
for(i=0;i<5;i++)
{
float aveB=average(rrii,SizeSearch,matchii0[i],matchjj0[i],SizeMatch);
float sigmaA=sigma(llii,SizeMatch,0,0,aveA,SizeMatch); //方差
float sigmaB=sigma(rrii,SizeSearch,matchii0[i],matchjj0[i],aveB,SizeMatch);
float C_AB=sigma_AB(rrii,matchii0[i],matchjj0[i],aveB,SizeSearch // 协方差
,llii,aveA,SizeMatch);
float rel_k=C_AB/sqrt(sigmaA*sigmaB); //相关系数
rel_k=fabs(rel_k);
if(rel_k>maxr)//寻找最大值
{
maxr=rel_k;
maxii=matchii0[i];
maxjj=matchjj0[i];
matchadnn[kk]=rel_k;
}
}
//赌轮法选择出中间群体
for(int inn=0;inn<nn;inn++)
{
i=0;
float partsum=0.0;
float wheel_pos=rnd()*sumgray;
do
{
partsum+=matchadnn[i];
i=i+1;
}while(partsum<wheel_pos&&i<nn);
matchii[inn]=matchii[i-1];
matchjj[inn]=matchjj[i-1];
}
//从中间群体随机产生两个父代和一个模板进行杂交
char (*boy)[16],(*girl)[16];
boy=new char [nn/2][16];
girl=new char [nn/2][16];
int zajiaosum=(nn-2)/2,drag0=0;
if(ik>3)
if(drag[ik]==0&&drag[ik-1]==0&&drag[ik-2]==0&&drag[ik-3]==0&&drag[ik-4]==0)
zajiaosum=(nn-6)/2;
if (ik>8)
{
drag0=0;
for(i=ik-9;i<=ik;i++)
if(drag[i]==1)
drag0=1;
if(!drag0)
zajiaosum=(nn-11)/2;
}
if(ik>13)
{
drag0=0;
for(i=ik-14;i<=ik;i++)
if(drag[i]==1)
drag0=1;
if(!drag0)
{
zajiaosum=(nn-16)/2;
}
}
if(ik>18)
{
drag0=0;
for(i=ik-19;i<=ik;i++)
if(drag[i]==1)
drag0=1;
if(!drag0)
{
matchi=maxii+CurPt.y-SizeSearch/2+SizeMatch/2;
matchj=maxjj+CurPt.x-SizeSearch/2+SizeMatch/2;
goto line;
}
}
int tubianshu;
if(nn%2==1)
{
zajiaosum+=1;
tubianshu=zajiaosum*2;
}
else
tubianshu=zajiaosum*2+1;
for(int jk=0;jk<zajiaosum;jk++)
{
do{
random1=rand()%nn;
random2=rand()%nn;
}while(random1==random2);//不同父代
//||matchii[random1]==matchii[random2]&&matchjj[random1]==matchjj[random2]);
// matchii[random1]=127;
// matchjj[random1]=128;
char rowfather[8],colfather[8],father[16];
// int_gelei(127,rowfather);
// int_gelei(128,colfather);
// gelei_gelei(rowfather,colfather,father);
int_gelei(matchii[random1],rowfather);
int_gelei(matchjj[random1],colfather);
gelei_gelei(rowfather,colfather,father);
char rowmother[8],colmother[8],mother[16];
// int_gelei(128,rowmother);
// int_gelei(127,colmother);
// gelei_gelei(rowmother,colmother,mother);
int_gelei(matchii[random2],rowmother);
int_gelei(matchjj[random2],colmother);
gelei_gelei(rowmother,colmother,mother);
//杂交
for(int inn=0;inn<16;inn++)
{
random[inn]=rand()%2;//随机产生模板
if(random[inn]==0)
{
boy[jk][inn]=father[inn];
girl[jk][inn]=mother[inn];
}
else if(random[inn]==1)
{
boy[jk][inn]=mother[inn];
girl[jk][inn]=father[inn];
}
}
// gelei_int(boy,matchii[ak++],matchjj[ak++]);
// gelei_int(boy,matchii[ak++],matchjj[ak++]);
}
//突变
char rowparent[8],colparent[8],parent[16];
char (*son)[16];
son=new char [nn-2*zajiaosum][16];
for(i=0;i<nn-2*zajiaosum;i++)
{
int random0=rand()%nn;
int_gelei(matchii[random0],rowparent);
int_gelei(matchjj[random0],colparent);
gelei_gelei(rowparent,colparent,parent);
int change1,change2;
do{
change1=rand()%16;
change2=rand()%16;
}while(change1==change2);
for(j=0;j<16;j++)
son[i][j]=parent[j];
if(parent[change1]=='0')
son[i][change1]='1';
else if(parent[change1]=='1')
son[i][change1]='0';
if(parent[change2]=='0')
son[i][change2]='1';
else if(parent[change2]=='1')
son[i][change2]='0';
}
//复制,最佳个体保存法
matchii[0]=maxii;
matchjj[0]=maxjj;
//格雷码数转化为十进制数
int *p1,*p2;
for(i=1;i<zajiaosum*2+1;i+=2)//杂交
{
p1=&matchii[i];
p2=&matchjj[i];
gelei_int(boy[i/2],p1,p2);
// matchii[i]=*p1;
// matchjj[i]=*p2;
p1=&matchii[i+1];
p2=&matchjj[i+1];
gelei_int(girl[i/2],p1,p2);
// matchii[i+1]=*p1;
// matchjj[i+1]=*p2;
}
for(i=tubianshu;i<nn;i++)
{
p1=&matchii[i];
p2=&matchjj[i];
gelei_int(son[i-tubianshu],p1,p2); //突变
}
}//迭代结束
maxr=0.0;
for(i=0;i<nn;i++)
{
float aveB=average(rrii,SizeSearch,matchii[i],matchjj[i],SizeMatch);
float sigmaA=sigma(llii,SizeMatch,0,0,aveA,SizeMatch); //方差
float sigmaB=sigma(rrii,SizeSearch,matchii[i],matchjj[i],aveB,SizeMatch);
float C_AB=sigma_AB(rrii,matchii[i],matchjj[i],aveB,SizeSearch // 协方差
,llii,aveA,SizeMatch);
float rel_k=C_AB/sqrt(sigmaA*sigmaB); //相关系数
rel_k=fabs(rel_k);
if(rel_k>=maxr)//寻找最大值
{
maxr=rel_k;
matchi=matchii[i]+CurPt.y-SizeSearch/2+SizeMatch/2;
matchj=matchjj[i]+CurPt.x-SizeSearch/2+SizeMatch/2;
}
}
// delete [] matchii;
// delete [] matchjj;
// delete [] matchadnn;
line:
finish = clock(); //结束时间
EndWaitCursor();
maxrelk=maxr;
// pChildFrm=GetActiveFrame();
// pView=(CGaMatchView*)(pChildFrm->GetActiveView());
if(nTask==11)
{
POSITION pos=GetFirstViewPosition();
CGaMatchView* pView=(CGaMatchView* )GetNextView(pos);
CPoint pt0=pView->GetDeviceScrollPosition();
CDC* dc=pView->GetDC();
CPen pen1(PS_SOLID,1,RGB(255,0,0));
dc->SelectObject(&pen1);
/* dc->MoveTo(CurPt.x-pt0.x-5,CurPt.y-pt0.y);
dc->LineTo(CurPt.x-pt0.x+5,CurPt.y-pt0.y);
dc->MoveTo(CurPt.x-pt0.x,CurPt.y-5-pt0.y);
dc->LineTo(CurPt.x-pt0.x,CurPt.y+5-pt0.y);*/
dc->MoveTo(matchj-pt0.x-5,matchi-pt0.y);
dc->LineTo(matchj-pt0.x+5,matchi-pt0.y);
dc->MoveTo(matchj-pt0.x,matchi-pt0.y-5);
dc->LineTo(matchj-pt0.x,matchi-pt0.y+5);
static int num=1;
char string[30];
sprintf(string,"%d",num);
dc->TextOut(matchj-pt0.x+5,matchi-pt0.y+5,string);
num++;
double duration = (double)(finish - start); // CLOCKS_PER_SEC;计算经历时间段
char ss[40];
wsprintf(ss,"lx=%d,ly=%d,rx=%d,ry=%d,maxr=%d,time_span=%d",lx,ly,matchj,matchi,(int)(maxr*100),(int)duration);
AfxMessageBox(ss);
}
}
void int_gelei(long xx,char zzs[])//十进制数转化为格雷码
{
char yys[9],yyss[9];
_itoa(xx,yys,2);
int i=0;
while(yys[i])
i++;
for(int j=0;j<8;j++)
if(j<8-i)
yyss[j]='0';
else
yyss[j]=yys[j+i-8];
zzs[0]=yyss[0];
for(j=1;j<8;j++)
{
if(yyss[j-1]=='0'&&yyss[j]=='0'||yyss[j-1]=='1'&&yyss[j]=='1')
zzs[j]='0';
else if(yyss[j-1]=='0'&&yyss[j]=='1'||yyss[j-1]=='1'&&yyss[j]=='0')
zzs[j]='1';
}
}
void gelei_gelei(char xx[],char yy[],char sums[])//用行格雷码和列格雷码进行格雷编码
{
for(int i=0;i<16;i++)
{
if(i<8)
sums[i]=xx[i];
else if(i>=8)
sums[i]=yy[i-8];
}
}
long gelei_boi(long xx)//格雷码转化为二进制数
{
CString xxs;
char yys[1],aa[1],bb[1];
long sum=0,yy;
int len,aa0,bb0,cc0;
xxs.Format("%d",xx);
yys[0]=xxs.GetAt(0);
len=xxs.GetLength();
sum=atoi(yys)*pow(10,len-1);
cc0=atoi(yys);
for(int i=1;i<len;i++)
{
aa[0]=xxs.GetAt(i);
aa0=atoi(aa);
cc0+=aa0;
if(cc0==2)
cc0=0;
sum+=cc0*pow(10,len-1-i);
}
return sum;
}
long boi_int(long xx)//二进制数转化为十进制数
{
CString xxs,yys;
long sum=0,yy;
int len;
xxs.Format("%d",xx);
len=xxs.GetLength();
for(int i=0;i<len;i++)
{
yys.Format("%c",xxs.GetAt(i));
yy=atoi(yys);
sum+=yy*pow(2,len-1-i);
}
return sum;
}
void gelei_int(char parent[],int *row,int *col)//格雷码转化为十进制数
{
char rows[8],cols[8];
int yy1,yy2;
rows[0]=parent[0];
cols[0]=parent[8];
for(int i=1;i<8;i++)
{
if(rows[i-1]=='0'&&parent[i]=='0'||rows[i-1]=='1'&&parent[i]=='1')
rows[i]='0';
else if(rows[i-1]=='0'&&parent[i]=='1'||rows[i-1]=='1'&&parent[i]=='0')
rows[i]='1';
}
for(i=9;i<16;i++)
{
if(cols[i-9]=='0'&&parent[i]=='0'||cols[i-9]=='1'&&parent[i]=='1')
cols[i-8]='0';
else if(cols[i-9]=='0'&&parent[i]=='1'||cols[i-9]=='1'&&parent[i]=='0')
cols[i-8]='1';
}
CString rowss,colss;
int aa=0,bb=0;
for(i=0;i<8;i++)
{
rowss=rows[i];
yy1=atoi(rowss);
aa+=yy1*pow(2,8-1-i);
}
*row=aa;
for(i=0;i<8;i++)
{
colss=cols[i];
yy2=atoi(colss);
bb+=yy2*pow(2,8-1-i);
}
*col=bb;
}
float rnd()
{
int i;
float j;
i=rand();
j=float(i)/float(RAND_MAX);
return j;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -