📄 text1.txt
字号:
void CGaMatchDoc::GoodChooseGa(int x,int y) //择优选取良种
{
BeginWaitCursor();
int i,j,step,*matchii,*matchjj;
int random1,random2,random[16];
double adnn,maxr=0.0,maxl=0.0,adsum,*matchadnn;
int lx,ly,rx,ry;
clock_t start, finish;
lx=x;ly=y;
GetmatchWindow(lx,ly);
rx=x;ry=y;
GetSearchWind(rx,ry);
int kk=0,kkk,nn,kk0=0;
step=SizeMatch/8;//4,16
nn=((SizeSearch-SizeMatch+1)/step+1)*((SizeSearch-SizeMatch+1)/step+1);
matchii=new int [nn+2];
matchjj=new int [nn+2];
matchadnn=new double [nn+2];
start = clock();//获得开始时间
//初始种群的选取
/* for(i=0;i<SizeSearch-SizeMatch+1;i+=step)
{
for(j=0;j<SizeSearch-SizeMatch+1;j+=step)
{
matchii[kk]=i;
matchjj[kk]=j;
kk++;
}
}*/
float sumgray=0.0;
float avergray;
float aveA=average(llii,SizeMatch,0,0,SizeMatch);
for(i=0;i<SizeSearch-SizeMatch+1;i+=step)
{
for(j=0;j<SizeSearch-SizeMatch+1;j+=step)
{
float aveB=average(rrii,SizeSearch,i,j,SizeMatch);
float sigmaA=sigma(llii,SizeMatch,0,0,aveA,SizeMatch); //方差
float sigmaB=sigma(rrii,SizeSearch,i,j,aveB,SizeMatch);
float C_AB=sigma_AB(rrii,i,j,aveB,SizeSearch // 协方差
,llii,aveA,SizeMatch);
float rel_k=C_AB/sqrt(sigmaA*sigmaB); //相关系数
rel_k=fabs(rel_k);
sumgray+=rel_k;
}
}
avergray=sumgray/nn;
for(i=0;i<SizeSearch-SizeMatch+1;i+=step)
{
for(j=0;j<SizeSearch-SizeMatch+1;j+=step)
{
float aveB=average(rrii,SizeSearch,i,j,SizeMatch);
float sigmaA=sigma(llii,SizeMatch,0,0,aveA,SizeMatch); //方差
float sigmaB=sigma(rrii,SizeSearch,i,j,aveB,SizeMatch);
float C_AB=sigma_AB(rrii,i,j,aveB,SizeSearch // 协方差
,llii,aveA,SizeMatch);
float rel_k=C_AB/sqrt(sigmaA*sigmaB); //相关系数
rel_k=fabs(rel_k);
if(rel_k>2.0*avergray)//0.10,17/12,4/3,2,1,3
{
matchii[kk]=i;
matchjj[kk]=j;
kk++;
}
kk0++;
}
}
int sumnum=30;
int *drag,maxii,maxjj;
drag=new int [sumnum];
for(i=0;i<sumnum;i++)
drag[i]=0;
// float aveA=average(llii,SizeMatch,0,0,SizeMatch);
//以相关系数为指标复制adnn为最大的一个
for(int ik=0;ik<30;ik++)//最大迭代次数设为30
{
nn=kk;
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)//寻找最大值
{
drag[ik]=1;
maxr=rel_k;
maxii=matchii[i];
maxjj=matchjj[i];
matchadnn[kk]=rel_k;
}
}
//随机产生两个父代和一个模板进行杂交
char (*boy)[16],(*girl)[16];
boy=new char [nn/2][16];
girl=new char [nn/2][16];
int zajiaosum=nn/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/2-2;
if (ik>8)
{
drag0=0;
for(i=ik-9;i<=ik;i++)
if(drag[i]==1)
drag0=1;
if(!drag0)
zajiaosum=nn/2-5;
}
if(ik>13)
{
drag0=0;
for(i=ik-14;i<=ik;i++)
if(drag[i]==1)
drag0=1;
if(!drag0)
{
zajiaosum=nn/2-7;
}
}
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;
}
}
for(int jk=0;jk<zajiaosum-5;jk++)
{
do{
random1=rand()%nn;
random2=rand()%nn;
}while(random1==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';
}
//格雷码数转化为十进制数
int *p1,*p2;
matchii[0]=maxii;//复制
matchjj[0]=maxjj;
if(maxii==0) //避免下面取负值
maxii=3;
matchii[1]=maxii-1;//复制
matchjj[1]=maxjj;
matchii[2]=maxii+1;//复制
matchjj[2]=maxjj;
matchii[3]=maxii;//复制
if(maxjj==0) //避免下面取负值
maxjj=3;
matchjj[3]=maxjj-1;
matchii[4]=maxii;//复制
matchjj[4]=maxjj+1;
for(i=5;i<zajiaosum*2;i+=2)//杂交
{
p1=&matchii[i];
p2=&matchjj[i];
gelei_int(boy[i/2-2],p1,p2);
// matchii[i]=*p1;
// matchjj[i]=*p2;
p1=&matchii[i+1];
p2=&matchjj[i+1];
gelei_int(girl[i/2-2],p1,p2);
// matchii[i+1]=*p1;
// matchjj[i+1]=*p2;
}
for(i=zajiaosum*2;i<nn;i++)
{
p1=&matchii[i];
p2=&matchjj[i];
gelei_int(son[i-(zajiaosum*2)],p1,p2); //突变
}
}//迭代结束
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();
// pChildFrm=GetActiveFrame();
// pView=(CGaMatchView*)(pChildFrm->GetActiveView());
if(nTask==10)
{
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(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[80];
wsprintf(ss,"i=%d,j=%d,maxr=%d,time_span=%d,nn=%d",matchi,matchj,(int)(maxr*100),(int)duration,(int)nn*30);
AfxMessageBox(ss);
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -