`

best first search

 
阅读更多
ASSearch                 搜索算法类

ASEvaluation              特征结果集评价算法类。该类有接口接受样本输入

AttributeEvaluation        单个特征的评价类

AttributeSetEvaluation    特征集的评价类

AttributeSelection          特征选择类, 接受ASSearch与ASEvaluation作为输入

AttributeTransformer     数据转换类



Best First Search:

m_bestMerit, 记录评价最高的得分

m_cacheSize, 已评价了多少组不同的特征; lookup记录已评价属性集及其评价分的集合

m_searchDirection, 搜索方向:正向,后向,双向

m_starting, 初始结果集

m_totalEvals, 已评价次数>= m_cacheSize



1)    初始化

如果已给出初始结果集,则此轮结果集就是初始结果集;若未给出初始结果集且为双向搜索,则此轮结果集就是所有的属性集。

计算此轮结果集的评价得分, 将该结果集与得分放入已查数据中; 将该结果集放入待搜索队列中





2)    迭代搜索

迭代退出条件是, 如果连续多次扩展得到的结果集都没有比当前最好的更优,则退出,Stale < m_max_stale;  或者待扩展队列已为空。

2.0)取得待扩展队列头

2.1)根据搜索方向扩展该属性集得到新的属性集:顺序扫描每个属性,如果未处理过该属性, 则将该属性增加到待扩展集中。(如果是backward搜索, 则是将该属性从待扩展集中移除;后面类同)

2.2)如果该新的属性集未曾处理过, 则计算其评价分、将其增加到lookup中; 将该属性集加入到待扩展集中。 判断此次扩展是否比当前最好的更优、更优则记录相关信息。

2.3)恢复到迭代2.0)状态时的属性集,迭代2.1)中扫描下一个未曾处理的属性

Notes:如果是双向搜索时,则步骤2中,都是在步骤2.0)的基础之上先正向对所有属性做测试;然后逆向对所有属性做测试。就是把双向分为了先正向后逆向两个完全分开的过程。



3)步骤2退出时, 得到了最佳属性集合
    while (stale < m_maxStale) 
	{
		added = false;
		if (m_searchDirection == SELECTION_BIDIRECTIONAL) 
		{
			// bi-directional search
			done = 2;
			sd = SELECTION_FORWARD;
		} 
		else 
		{
			done = 1;
		}

		// finished search?
		if (bfList.size() == 0) 
		{
			stale = m_maxStale;
			break;
		}

		// copy the attribute set at the head of the list
		tl = bfList.getLinkAt(0);
		temp_group = (BitSet)(tl.getData()[0]);
		temp_group = (BitSet)temp_group.clone();
		// remove the head of the list
		bfList.removeLinkAt(0);
		// count the number of bits set (attributes)
		//TODO 计算temp_group中已处理过的属性个数 size

		do 
		{
			for (i = 0; i < m_numAttribs; i++) {
				//测试第i个属性是否已处理过。 z==true时表示未处理过、待处理
				if (sd == SELECTION_FORWARD) {
					z = ((i != m_classIndex) && (!temp_group.get(i)));
				} else {
					z = ((i != m_classIndex) && (temp_group.get(i)));
				}
      
				if (z) 
				{
					// set the bit (attribute to add/delete)
					// 如果待处理, 则对正向搜索而言就是增加到属性集中; 逆向搜索就是从属性集中删除
					if (sd == SELECTION_FORWARD) {
						temp_group.set(i);
						size++;
					} else {
						temp_group.clear(i);
						size--;
					}

					/* if this subset has been seen before, then it is already 
   					in the list (or has been fully expanded) */
					//如果该扩展后的属性集已见过,则取出其评价分; 未见过则处理:
					tt = (BitSet)temp_group.clone();
					hashC = tt.toString();
					if (lookup.containsKey(hashC) == false) {
						merit = ASEvaluator.evaluateSubset(temp_group);
						m_totalEvals++;
  					} else {
						merit = ((Double)lookup.get(hashC)).doubleValue();
						cacheHits++;  
					}

					// insert this one in the list。 增加到待扩展集中
					Object[] add = new Object[1];
					add[0] = tt.clone();
					bfList.addToList(add, merit);


					// is this better than the best?
					if (sd == SELECTION_FORWARD) {
						z = ((merit - best_merit) > 0.00001);
					} else 	if (merit == best_merit) {
						z = (size < best_size);
					} else {
						z = (merit >  best_merit);
					} 
				}

				if (z) //比当前最佳更好, 则记录相关信息
				{
					added = true;
					stale = 0;
					best_merit = merit;
					best_size = size;
					best_group = (BitSet)(temp_group.clone());
				}

				// unset this addition(deletion)
				//重置当前选择, 以便进行下一个属性测试
				if (sd == SELECTION_FORWARD) {
					temp_group.clear(i);
					size--;
				} else {
					temp_group.set(i);
					size++;
				}
			}////end for

			if (done == 2) {
				sd = SELECTION_BACKWARD;
			}

			done--;
		} while (done > 0); ///end do

		/* if we haven't added a new attribute subset then full expansion 
 		of this node hasen't resulted in anything better */
		if (!added) {
			stale++;
		}
	}///end while

    m_bestMerit = best_merit;
    return  attributeList(best_group);
分享到:
评论

相关推荐

    BFS, DFS, Dijkstra, Greedy Best First Search, A*五种路径规划算法Python实现

    2.算法的具体实现在BasicAlgorithm.py文件中,里面涵盖了BFS、DFS、Dijkstra、Greedy Best First Search、A*五种静态场景的路径规划算法,算法应用于二维的栅格场景 3.几种算法的基本关系: (BFS、DFS)广度和深度...

    8 puzzle的C#实现,算法课堂作业,运用best first search的树搜索算法

    在这个项目中,它被实现了C#编程语言,作为算法课程的一个作业,主要运用了最佳优先搜索(Best First Search)这一树搜索算法。 首先,我们来看C#在这个场景中的应用。C#是一种面向对象的编程语言,被广泛用于...

    Graph图Best-First Search题型套路【LeetCode刷题套路教程11】

    Graph图Best-First_Search题型套路【LeetCode刷题套路教程11】

    SearchAlgorithmVisualizations.zip

    本程序主要实现Dijkstra(因为边权为1,也可视为BFS算法)、Best First Search、A *搜索等算法在二维地图上的状态扩展过程。 里面预设了四个地图,在不同的地图每个算法的表现会不一样,在某些情况下,Best Frist ...

    Best-First-Tree 0-1 Knapsack

    best-first-search branch and bound algorithm for the knapsack problem

    The University of Melbourne - COMP90054-AI-Planning 课程重点笔记

    搜索算法是人工智能规划的核心,uniform-cost search 和 greedy best first search 是两种常见的搜索算法。Uniform-cost search 是 Dijkstra 算法的变种,旨在找到达单个终点的最短路径,而不是到达每个点的最短路径...

    A Pathfinding Project Pro 4.2.15.zip

    - **多路径算法支持**:不仅支持经典的A*(A-Star)算法,还支持Dijkstra、Best First Search等多种路径搜索算法,可以根据项目需求选择最适合的算法。 - **高效性能**:优化的算法确保在大规模地图上进行快速...

    算法竞赛专题解析--搜索进阶(4)Astar搜索1

    - **贪心最优搜索 (Greedy Best First Search)**:快速但可能非最优。 2. **单源到所有点的最短路径** - **宽度优先搜索 (Breadth-First Search, BFS)**:适用于无边权或边权为 1 的情况,简单但非最优。 - **...

    公交查询及换乘的算法源代码示例

    此外,为了提高效率,可以采用优先队列(如二叉堆)来存储待处理的节点,根据距离进行排序,每次处理最近的节点,这种方法被称为Best First Search。 压缩包中的源代码很可能是实现这些算法的实例,你可以通过阅读...

    软件价值3-A*算法寻路

    它结合了Dijkstra算法的最短路径特性与Best First Search的效率,通过引入评估函数来指导搜索过程,既保证找到最优解,又能避免像Dijkstra算法那样检查所有可能的路径。 评估函数通常定义为从起点到当前节点的实际...

    路网分层的改进A算法在智能交通系统中的应用.rar

    A*算法是一种启发式搜索算法,它结合了Dijkstra算法的全局最优性和Best First Search的效率。A*算法通过引入一个评估函数f(n) = g(n) + h(n),其中g(n)是从起点到节点n的实际路径成本,h(n)是从节点n到目标节点的...

    IOS应用源码之AStarDemo-1.zip

    A*算法结合了Dijkstra算法的全局最优性和Best First Search的效率,通过引入启发式函数来估算从起点到目标点的最优路径。它使用一个优先队列来存储待处理的节点,并根据f(n) = g(n) + h(n)的值进行排序,其中g(n)是...

    A Pathfinding Project Pro v3.7(AI寻路插件)

    此插件不仅支持基本的A*算法,还包含了其他多种寻路算法,如Dijkstra、Best First Search等,以适应不同的游戏场景和需求。 该插件的强大之处还体现在其对多种复杂地形的处理能力。无论是网格状地形、多边形地形...

    Best-First-Search-PathFinding

    最佳优先搜索(Best-First-Search)是一种在图或树结构中寻找路径的算法,它以某种策略来决定下一个要扩展的节点,目标是找到从起点到终点的最优路径。在游戏AI、机器人导航和图形处理等领域,这种算法非常常见。在...

    unity简单寻路

    A*算法结合了Dijkstra算法的全局最优性和Best First Search的启发式搜索,通过评估节点的f值(g值,即从起点到当前节点的实际代价,加上h值,即预估从当前节点到目标的代价)来决定搜索方向。 资源包中的"pdf说明...

    Unity 3D 虚拟现实及游戏 A*寻路算法

    A* 寻路算法是一种基于图的最短路径搜索算法,它结合了Dijkstra算法的全局最优性和Best First Search的效率。A*算法的核心在于使用一个评估函数来预测从起点到目标点的总成本,该函数通常由两部分组成:从当前节点到...

    最快AS3A星算法

    它结合了Dijkstra算法的全局最优性和Best First Search的效率,通过引入启发式函数来估计从当前节点到目标节点的剩余距离,从而大幅减少了搜索的节点数量。 A*算法的核心在于两个关键概念:代价函数(g(n))和启发...

    machine5_governmentsm6_AI贪吃蛇自动寻路C++程序_

    A*结合了Dijkstra算法的全局最优性和Best First Search的效率。 5. **启发式函数**: A*算法的关键在于启发式函数,它估计从当前节点到目标节点的剩余距离。在贪吃蛇游戏中,启发式函数可能基于目标食物的位置和蛇的...

    A * Pathfinding Project Pro 4.2.15

    它的核心思想是结合了Dijkstra算法的全局最优性和Best First Search的启发式特性,通过评估节点的f(n)值(即g(n)代价和h(n)启发式估计的总和)来选择最有希望的路径。在这个项目中,A*算法被优化以适应Unity的3D场景...

    ACM A*算法解八数码问题

    A* 算法是一种广泛应用在路径搜索和图形遍历中的高效启发式搜索算法,它结合了Dijkstra算法的最优化路径寻找和Best First Search的效率。在八数码问题(又称滑动拼图游戏)中,A* 算法能够帮助我们找到从初始状态到...

Global site tag (gtag.js) - Google Analytics