热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

蚁群算法求解迷宫最优路径问题

本段程序的基本思想是利用蚁群算法中的蚁周模型,来对全局的迷宫图进行信息素的跟新和为每一仅仅蚂蚁选择下一个方格。一共会进行RcMax2000轮模拟(理论上模拟的次数越多结果会越

本段程序的基本思想是利用蚁群算法中的蚁周模型,来对全局的迷宫图进行信息素的跟新

和为每一仅仅蚂蚁选择下一个方格。 一共会进行RcMax = 2000轮模拟(理论上模拟的次数越多结果

会越接近真实值)。而在每一轮中会排除 M = 10仅仅蚂蚁进行探路。同一时候在算法的回溯思想上採用的

是栈的数据结构来实现的。当栈终于为空时则表示无解。但同一时候这段程序的一缺点就是:因为我没在

算法中对每一轮的每仅仅探路蚂蚁採用多线程的模式,所以总体的执行效率还不是非常高。

如读者有好的

思想或建议,请留言。

#include
#include
#include
using namespace std;
//坐标类
struct Point
{
	int x;
	int y;
};
//地图类
template
class Map
{
public:
	int (*p)[B];//1表示为障碍方格。0表示该方格可通
	bitset<4> (*around)[B];//记录每个方格四周四个方法的可选标记
	int row;//行数
	int col;//列数
	Map()
	{
		p =new int[A][B];
		around = new bitset<4>[A][B];
	}
	Map(Map & B1)
	{
	 p =new int[A][B];
	 around = new bitset<4>[A][B];
	 row = B1.row;
	 col = B1.col;
	 for(int i = 0;i & operator=(Map & B1)
	{
	 row = B1.row;
	 col = B1.col;
	 for(int i = 0;ip[i][j] = B1.p[i][j];
			 around[i][j] = B1.around[i][j];
		 }
	 }
	 return *this;
	}
};

//start起始点, end终止点
template
bool FindPath(Map & map,Point & start,Point & end)
{
	const int N1 =  A;
	const int N2 =  B;
	
	const int M = 10;//每一轮中蚂蚁的个数
	const int RcMax = 2000;//迭代次数
	const int IN = 1;//信息素的初始量

	double add[N1][N2];//每一段的信息素增量数组
	double phe[N1][N2];//每一段路径上的信息素
	double MAX = 0x7fffffff;

	double alphe,betra,rout,Q;//alphe信息素的影响因子,betra路线距离的影响因子,rout信息素的保持度,Q用于计算每仅仅蚂蚁在其路迹留下的信息素增量
	double bestSolution = MAX;//最短距离
	stack Beststackpath;//最优路线

	//初始化变量參数和信息数组
	alphe = betra = 2;
	rout = 0.7;
	Q = 10;

	//先给图的外围加上障碍
	for(int i = 0;i stackpath[M];
	//拷贝障碍地图
	Map Ini_map[M];
	//记录每一仅仅蚂蚁的当前位置
	Point Allposition[M];

	int s = 0;
	while(s=drand)
			  {
			  break;
			  }
			 }
		  }

		   //入栈
		   Allposition[j].x = x;
		   Allposition[j].y = y;
		   stackpath[j].push(Allposition[j]);
		   //设置障碍
		   Ini_map[j].p[Allposition[j].x][Allposition[j].y] = 1;

		  }
		  else//没找到了下一点
		  {   
			  //向后退一步,出栈
			  stackpath[j].pop();
			  //消除入栈时设置的障碍
			  Ini_map[j].p[Allposition[j].x][Allposition[j].y] = 0;
			  if(stackpath[j].empty())
			  {
				  return false;
			  }
			  //设置回溯后的Allposition
			  if(Allposition[j].x == stackpath[j].top().x)
			  {
				  if((Allposition[j].y - stackpath[j].top().y)==1)//向右
				  {
					  (Ini_map[j].around[ stackpath[j].top().x][stackpath[j].top().y])[0] = 1;//标记该方向已訪问
				  }
				  if((Allposition[j].y - stackpath[j].top().y)==-1)//向左
				  {
					  (Ini_map[j].around[ stackpath[j].top().x][stackpath[j].top().y])[2] = 1;//标记该方向已訪问
				  }
			  }
			  if(Allposition[j].y == stackpath[j].top().y)
			  {
			  
				  if((Allposition[j].x - stackpath[j].top().x)==1)//向下
				  {
					  (Ini_map[j].around[ stackpath[j].top().x][stackpath[j].top().y])[1] = 1;//标记该方向已訪问
				  }
				   if((Allposition[j].x - stackpath[j].top().x)==-1)//向上
				  {
					  (Ini_map[j].around[ stackpath[j].top().x][stackpath[j].top().y])[3] = 1;//标记该方向已訪问
				  }
			  }
			  Allposition[j].x = stackpath[j].top().x;
			  Allposition[j].y = stackpath[j].top().y;
		  }

	 }
	 }
	
	//保存最优路线
	double solution = 0;
	for(int i = 0;i20)
		{
			phe[i][j] = 20;
		}
	 }
	}

	s++;
	}//轮

	//找到路径,并输出stackpath
	cout<<"找到最优路径!"<"< map;
	map.col = map.row = 10;
	int p[10][10];
	for(int i =0;i<10;i++)//初始化迷宫
	{
	 for(int j=0;j<10;j++)
	 {
		 p[i][j] = 0;
	 }
	}
	//为迷宫设置障碍
	p[1][3] = 1;p[1][7] = 1;p[2][3] = 1;p[2][7] = 1;
	p[3][5] = 1;p[3][6] = 0;p[4][2] = 1;p[4][3] = 1;
	p[4][4] = 1;p[5][4] = 1;p[6][2] = 1;p[6][6] = 1;
	p[7][2] = 1;p[7][3] = 1;p[7][4] = 1;p[7][6] = 1;
	p[8][1] = 1;
	map.p = p ;
	Point start,end;
	start.x = start.y = 1;
	end.x =8,end.y = 8;
	if(!FindPath<10,10>(map,start,end))
	{
	  cout<<"该迷宫无解!"< 
 


推荐阅读
  • 本文讨论了使用差分约束系统求解House Man跳跃问题的思路与方法。给定一组不同高度,要求从最低点跳跃到最高点,每次跳跃的距离不超过D,并且不能改变给定的顺序。通过建立差分约束系统,将问题转化为图的建立和查询距离的问题。文章详细介绍了建立约束条件的方法,并使用SPFA算法判环并输出结果。同时还讨论了建边方向和跳跃顺序的关系。 ... [详细]
  • 本文介绍了P1651题目的描述和要求,以及计算能搭建的塔的最大高度的方法。通过动态规划和状压技术,将问题转化为求解差值的问题,并定义了相应的状态。最终得出了计算最大高度的解法。 ... [详细]
  • STL迭代器的种类及其功能介绍
    本文介绍了标准模板库(STL)定义的五种迭代器的种类和功能。通过图表展示了这几种迭代器之间的关系,并详细描述了各个迭代器的功能和使用方法。其中,输入迭代器用于从容器中读取元素,输出迭代器用于向容器中写入元素,正向迭代器是输入迭代器和输出迭代器的组合。本文的目的是帮助读者更好地理解STL迭代器的使用方法和特点。 ... [详细]
  • 本文主要解析了Open judge C16H问题中涉及到的Magical Balls的快速幂和逆元算法,并给出了问题的解析和解决方法。详细介绍了问题的背景和规则,并给出了相应的算法解析和实现步骤。通过本文的解析,读者可以更好地理解和解决Open judge C16H问题中的Magical Balls部分。 ... [详细]
  • 动态规划算法的基本步骤及最长递增子序列问题详解
    本文详细介绍了动态规划算法的基本步骤,包括划分阶段、选择状态、决策和状态转移方程,并以最长递增子序列问题为例进行了详细解析。动态规划算法的有效性依赖于问题本身所具有的最优子结构性质和子问题重叠性质。通过将子问题的解保存在一个表中,在以后尽可能多地利用这些子问题的解,从而提高算法的效率。 ... [详细]
  • 本文介绍了UVALive6575题目Odd and Even Zeroes的解法,使用了数位dp和找规律的方法。阶乘的定义和性质被介绍,并给出了一些例子。其中,部分阶乘的尾零个数为奇数,部分为偶数。 ... [详细]
  • 本文介绍了一个题目的解法,通过二分答案来解决问题,但困难在于如何进行检查。文章提供了一种逃逸方式,通过移动最慢的宿管来锁门时跑到更居中的位置,从而使所有合格的寝室都居中。文章还提到可以分开判断两边的情况,并使用前缀和的方式来求出在任意时刻能够到达宿管即将锁门的寝室的人数。最后,文章提到可以改成O(n)的直接枚举来解决问题。 ... [详细]
  • Redis底层数据结构之压缩列表的介绍及实现原理
    本文介绍了Redis底层数据结构之压缩列表的概念、实现原理以及使用场景。压缩列表是Redis为了节约内存而开发的一种顺序数据结构,由特殊编码的连续内存块组成。文章详细解释了压缩列表的构成和各个属性的含义,以及如何通过指针来计算表尾节点的地址。压缩列表适用于列表键和哈希键中只包含少量小整数值和短字符串的情况。通过使用压缩列表,可以有效减少内存占用,提升Redis的性能。 ... [详细]
  • 本文讨论了一个数列求和问题,该数列按照一定规律生成。通过观察数列的规律,我们可以得出求解该问题的算法。具体算法为计算前n项i*f[i]的和,其中f[i]表示数列中有i个数字。根据参考的思路,我们可以将算法的时间复杂度控制在O(n),即计算到5e5即可满足1e9的要求。 ... [详细]
  • 李逍遥寻找仙药的迷阵之旅
    本文讲述了少年李逍遥为了救治婶婶的病情,前往仙灵岛寻找仙药的故事。他需要穿越一个由M×N个方格组成的迷阵,有些方格内有怪物,有些方格是安全的。李逍遥需要避开有怪物的方格,并经过最少的方格,找到仙药。在寻找的过程中,他还会遇到神秘人物。本文提供了一个迷阵样例及李逍遥找到仙药的路线。 ... [详细]
  • 本文介绍了Codeforces Round #321 (Div. 2)比赛中的问题Kefa and Dishes,通过状压和spfa算法解决了这个问题。给定一个有向图,求在不超过m步的情况下,能获得的最大权值和。点不能重复走。文章详细介绍了问题的题意、解题思路和代码实现。 ... [详细]
  • 本文介绍了一道经典的状态压缩题目——关灯问题2,并提供了解决该问题的算法思路。通过使用二进制表示灯的状态,并枚举所有可能的状态,可以求解出最少按按钮的次数,从而将所有灯关掉。本文还对状压和位运算进行了解释,并指出了该方法的适用性和局限性。 ... [详细]
  • 电话号码的字母组合解题思路和代码示例
    本文介绍了力扣题目《电话号码的字母组合》的解题思路和代码示例。通过使用哈希表和递归求解的方法,可以将给定的电话号码转换为对应的字母组合。详细的解题思路和代码示例可以帮助读者更好地理解和实现该题目。 ... [详细]
  • CF:3D City Model(小思维)问题解析和代码实现
    本文通过解析CF:3D City Model问题,介绍了问题的背景和要求,并给出了相应的代码实现。该问题涉及到在一个矩形的网格上建造城市的情景,每个网格单元可以作为建筑的基础,建筑由多个立方体叠加而成。文章详细讲解了问题的解决思路,并给出了相应的代码实现供读者参考。 ... [详细]
  • Linux环境变量函数getenv、putenv、setenv和unsetenv详解
    本文详细解释了Linux中的环境变量函数getenv、putenv、setenv和unsetenv的用法和功能。通过使用这些函数,可以获取、设置和删除环境变量的值。同时给出了相应的函数原型、参数说明和返回值。通过示例代码演示了如何使用getenv函数获取环境变量的值,并打印出来。 ... [详细]
author-avatar
Eosven_119
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有