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

📄 mainfrm.cpp

📁 双蚁群算法实现机器人路径规划
💻 CPP
📖 第 1 页 / 共 2 页
字号:
	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 + -