📄 mainfrm.cpp
字号:
dc.SelectObject(oldpen);
newpen.DeleteObject();
}
void CMainFrame::Cross()
//第二群蚂蚁的路径放到TPath中本函数的主要工作步骤是,
//1,把第一种群中的path转移到其TPath中
//2,清空第一种群的path
//3,两个种群的TPath 全面相交,结果放到 第一种群的path中
{
int i,j,a,b,flag,flag2,flag3,done,test,time=0;//flag表示两条路径有没有相交
unsigned int *I1,*I2,*i1,*i2,*TP; //分别为两个TPath中的起点和终点的坐标
for(i=0;i<AntNumber;i++)
{ ant[i].WorkDone=-1;
for(j=0;j<StepLimit;j++)
{
if(ant[i].path[j]==TarGetG)
ant[i].WorkDone=1;
ant[i].TPath[j]=ant[i].path[j];
ant[i].path[j]=0;
}
}
for(i=0;i<AntNumber;i++)
{if(ant[i].TPath[0]!=420)
test=0;
time=0;
for(j=0;j<AntNumber;j++)
{
time++;
TP=ant[i].path;
I1=ant[i].TPath; i1=I1;
I2=ant2[j].TPath; i2=I2;
flag=0; done=0;
flag2=0;
flag3=0;
////////%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%//////////////
//当两条路径都可行
if(ant[i].WorkDone==1&&ant2[j].WorkDone==1)
{ for(a=0;a<StepLimit;a++)
{
i1++;
if((*i1==TarGetG&&flag==0)||done==1)
break;
for(b=0;b<StepLimit;b++)
{
i2++;
if(*i1==*i2)//两条路径有相交点
if(i1>=I1&&i2>=I2)
{
if(ant[i].DealPath(I1,i1)>ant2[j].DealPath(I2,i2))//2中的一段路径更优
{
while(I2<i2)
{
*TP=*I2;
TP++;
I2++;
}
I1=i1;//把可行段的起点移到相同点处
flag=1;
}
else
{
while(I1<i1)
{
*TP=*I1;
TP++;
I1++;
}
I2=i2;//把可行段的起点移到相同点处
flag=1;
}
}
if(*i1==TarGetG&&*i2==TarGetG)
{
*TP=TarGetG;//把最后目标点写入 path中
done=1; //表明交叉任务已经完成
}
if(*i2==TarGetG)
{
i2=I2;//把可行段的移动点移到起点,等待下一轮对比;
break;
}
}
}
if(!flag)//做对比的两条路径没有相交 把ant中的路径写到ant.path中
for(a=0;a<StepLimit;a++)
ant[i].path[a]=ant[i].TPath[a];
}
/////////////%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%/////////////
////////%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%//////////////
//当ant中的条路径不可行 ant2中的路径可行
if(ant[i].WorkDone==-1&&ant2[j].WorkDone==1)
{ for(a=0;a<StepLimit;a++)
{
i1++;
for(b=0;b<StepLimit;b++)
{
i2++;
if(*i1==*i2)//两条路径有相交点
if(i1>=I1&&i2>=I2)
{
if(ant[i].DealPath(I1,i1)>ant2[j].DealPath(I2,i2))//2中的一段路径更优
{
while(I2<i2)
{
*TP=*I2;
TP++;
I2++;
}
I1=i1;//把可行段的起点移到相同点处
flag=1;
ant[i].WorkDone=1;
}
else
{
while(I1<i1)
{
*TP=*I1;
TP++;
I1++;
}
I2=i2;//把可行段的起点移到相同点处
flag=1;
ant[i].WorkDone=1;
}
}
if(*i2==TarGetG)
{
i2=I2;//把可行段的移动点移到起点,等待下一轮对比;
break;
}
}
if(*i1==0&&flag==0)
break;
if(*i1==0&&flag==1)
{
while(*I2!=TarGetG)
{
*TP=*I2;
TP++;
I2++;
}
*TP=TarGetG;//把最后目标点写入 path中
break;
}
}
if(!flag)//做对比的两条路径没有相交 把ant中的路径写到ant.path中
for(a=0;a<StepLimit;a++)
ant[i].path[a]=ant[i].TPath[a];
}
/////////////%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%/////////////
////////%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%//////////////
//当ant中的可行,ant2中的路径不可行
if(ant[i].WorkDone==1&&ant2[j].WorkDone==-1)
{ for(a=0;a<StepLimit;a++)
{
i1++;
if(*i1==TarGetG&&flag==0)
break;
for(b=0;b<StepLimit;b++)
{
i2++;
if(*i1==*i2&&flag==1)//两条路径有相交点
if(i1>=I1&&i2>=I2)
{
if(ant[i].DealPath(I1,i1)>ant2[j].DealPath(I2,i2))//2中的一段路径更优
{
while(I2<i2)
{
*TP=*I2;
if(*I2==0||ant[i].path[0]!=420)
test=0;
TP++;
I2++;
}
I1=i1;//把可行段的起点移到相同点处
flag=1;
}
else
{
while(I1<i1)
{
*TP=*I1;
if(*I1==0||ant[i].path[0]!=420)
test=0;
TP++;
I1++;
}
I2=i2;//把可行段的起点移到相同点处
flag=1;
}
}
if(*i1==*i2&&flag==0)//两条路径有相交点第一点
//把ant中的路径从开头到这一点写入path中
if(i1>=I1&&i2>=I2)
{
while(I1<i1)
{
*TP=*I1;
if(*I1==0||ant[i].path[0]!=420)
test=0;
TP++;
I1++;
}
I2=i2;//把可行段的起点移到相同点处
flag=1;
}
if(*i1==TarGetG&&flag==1)
{
while(I1<i1)
{
*TP=*I1;
if(*I1==0||ant[i].path[0]!=420)
test=0;
TP++;
I1++;
}
*TP=TarGetG;//把最后目标点写入 path中
flag2=1;
break;
}
if(*i2==TarGetG)
{
i2=I2;//把可行段的移动点移到起点,等待下一轮对比;
break;
}
}
if(flag2==1)
break;
}
if(!flag)//做对比的两条路径没有相交 把ant中的路径写到ant.path中
for(a=0;a<StepLimit;a++)
ant[i].path[a]=ant[i].TPath[a];
}
/////////////%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%/////////////
////////%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%//////////////
//当ant中的不可行,ant2中的路径不可行
if(ant[i].WorkDone==-1&&ant2[j].WorkDone==-1)
{ for(a=0;a<StepLimit;a++)
{
i1++;
for(b=0;b<StepLimit;b++)
{
i2++;
if(*i1==*i2&&flag==1)//两条路径有相交点
if(i1>=I1&&i2>=I2)
{
if(ant[i].DealPath(I1,i1)>ant2[j].DealPath(I2,i2))//***2中的一段路径更优
{
while(I2<i2)
{
*TP=*I2;
TP++;
I2++;
}
I1=i1;//把可行段的起点移到相同点处
flag=1;
}
else
{
while(I1<i1)
{
*TP=*I1;
TP++;
I1++;
}
I2=i2;//把可行段的起点移到相同点处
flag=1;
}
}
if(*i2==TarGetG)
{
i2=I2;//把可行段的移动点移到起点,等待下一轮对比;
break;
}
if(*i1==0)
flag3=1;
if(*i1==0&&flag==1)
{
while(*I2!=TarGetG)
{
*TP=*I2;
TP++;
I2++;
}
*TP=TarGetG;//把最后目标点写入 path中
break;
}
if(*i1==*i2&&flag==0)//两条路径有相交点第一点
//把ant中的路径从开头到这一点写入path中
if(i1>=I1&&i2>=I2)
{
while(I1<i1)
{
*TP=*I1;
TP++;
I1++;
}
I2=i2;//把可行段的起点移到相同点处
flag=1;
ant[i].WorkDone=1;
}
}
if(flag3)
break;
}
if(!flag)//做对比的两条路径没有相交 把ant中的路径写到ant.path中
for(a=0;a<StepLimit;a++)
ant[i].path[a]=ant[i].TPath[a];
}
/////////////%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%/////////////
for(a=0;a<StepLimit;a++)
ant[i].TPath[a]=ant[i].path[a]; //ant中的某只蚂蚁的路径和ant2中蚂蚁路径相交后
//结果放到了ant.path中, 需要把结果放到ant.tpath中,
if(j<19)//如果没有到ant2中的最后一只蚂蚁,所有相交的结果放到ant.tpath中
//等带再次相交,最后一只的结果则直接放在ant.path中等待处理,不做转移
for(a=0;a<StepLimit;a++)
ant[i].path[a]=0;
}
}
}
void CMainFrame::CreatArea9_ant2(unsigned int core, unsigned int AntNum, int step2)
{
unsigned int i,j,point;
ant2[AntNum].area9[1][1].x=core%mapH;
ant2[AntNum].area9[1][1].y=core/mapH;//设置中心点-核-现在时刻所在点
for(i=0;i<3;i++)
for(j=0;j<3;j++)
{
ant2[AntNum].area9[i][j].x=ant2[AntNum].area9[1][1].x-1+j;
ant2[AntNum].area9[i][j].y=ant2[AntNum].area9[1][1].y-1+i;
//填充其他八点 用坐标点的方式
if(ant2[AntNum].area9[i][j].x>=mapH||ant2[AntNum].area9[i][j].y>=mapV
||ant2[AntNum].area9[i][j].x<0||ant2[AntNum].area9[i][j].y<0)
{ ant2[AntNum].area9[i][j].state=1;
ant2[AntNum].area9[i][j].pr=0;
continue; }
//查看各点是否超过地图范围
if(map.point[ant2[AntNum].area9[i][j].y][ant2[AntNum].area9[i][j].x].PointType)
{ ant2[AntNum].area9[i][j].state=1;
ant2[AntNum].area9[i][j].pr=0;
continue;
}
//查看各点的状态
point=ant2[AntNum].area9[i][j].y*mapH+ant2[AntNum].area9[i][j].x;// 对点编码
if(ant2[AntNum].FindInPath(point,step2)) //
{ant2[AntNum].area9[i][j].state=2;
ant2[AntNum].area9[i][j].pr=0;
continue;}
//还要查询禁忌表 把已经走过的点标记为不可通过 ×××
ant2[AntNum].area9[i][j].state=0;
ant2[AntNum].area9[i][j].pr=map.point[ant2[AntNum].area9[i][j].y][ant2[AntNum].area9[i][j].x].tau;
//初始信息素 pr 单元
}
if(ant2[AntNum].area9[0][1].state==1)
{
ant2[AntNum].area9[0][0].state=1;
ant2[AntNum].area9[0][0].pr=0;
ant2[AntNum].area9[0][2].state=1;
ant2[AntNum].area9[0][2].pr=0;
}
if(ant2[AntNum].area9[1][0].state==1)
{
ant2[AntNum].area9[0][0].state=1;
ant2[AntNum].area9[0][0].pr=0;
ant2[AntNum].area9[2][0].state=1;
ant2[AntNum].area9[2][0].pr=0;
}
if(ant2[AntNum].area9[2][1].state==1)
{
ant2[AntNum].area9[2][2].state=1;
ant2[AntNum].area9[2][2].pr=0;
ant2[AntNum].area9[2][0].state=1;
ant2[AntNum].area9[2][0].pr=0;
}
if(ant2[AntNum].area9[1][2].state==1)
{
ant2[AntNum].area9[2][2].state=1;
ant2[AntNum].area9[2][2].pr=0;
ant2[AntNum].area9[0][2].state=1;
ant2[AntNum].area9[0][2].pr=0;
}
}
void CMainFrame::AnalyzePathG(int Gener, int AntNum)//处理输出数据 //针对40*40格
{
unsigned int *p;
int i,flag=0;
p=data[Gener].path[AntNum];
for(i=0;i<StepLimit;i++)
{
if(1==abs(*p-*(p+1))||40==abs(*p-*(p+1)))
data[Gener].Value[AntNum]+=1;
else if(41==abs(*p-*(p+1))||39==abs(*p-*(p+1)))
data[Gener].Value[AntNum]+=1.414;
else
{
flag=2;
data[Gener].Value[AntNum]=0;
break;
}
p++;
if (TarGetG==*p)
{
flag=1;
break;
}
}
}
void CMainFrame::DataOut()
{
FILE *fp;
int i,j;
fp=fopen("data.dat", "w");
for(i=0;i<GenerLimit;i++)
{for(j=0;j<AntNumber;j++)
{
fprintf(fp, "%3.3f",data[i].Value[j]);
fprintf(fp, " ");
}
fprintf(fp,"\n");
}
fclose(fp);
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -