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);
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 最佳优先搜索(Best-First Search)算法是一种基于启发式搜索的算法,其目标是在搜索过程中尽可能快地找到问题的解决方案。 在最佳优先搜索算法中,需要根据一定的评估函数对搜索状态进行评估,并选择当前评估函数值最小的状态进行扩展。评估函数通常是基于问题领域知识的启发式函数,用于估计从当前状态到目标状态的距离或代价。这样可以使搜索更加高效,并且能够在搜索空间较大的情况下找到最优解或最接近最优解的解。 最佳优先搜索算法的一个重要应用是A*算法,它在评估函数中同时考虑了从起始状态到当前状态的代价以及从当前状态到目标状态的估计代价,因此能够更加准确地估计从起始状态到目标状态的代价,并找到最优解。 ### 回答2: 最佳优先搜索算法(Best First Search Algorithm)是一种启发式搜索算法,其主要思想是利用估价函数来合理地选择下一个探索的节点,从而尽可能快地找到最优解。它和其他搜索算法的不同之处在于,它不是按照固定的顺序遍历所有节点,而是根据估价函数来选择下一个节点进行拓展。 最佳优先搜索算法的估价函数可以是各种各样的,比如F(n) = g(n) + h(n),其中g(n)表示起始节点到n节点的实际代价,h(n)表示估计从n节点到目标节点的代价。这个函数也叫做估价值函数或者启发函数。最佳优先搜索算法的核心就是寻找最小的估价函数值的节点。当节点n被选中的时候,算法会检查它是否是目标节点,如果是,那么搜索成功结束;如果不是,那么它会把节点n的所有后继节点放入一个优先队列中,按照它们的估价函数值的大小进行排序,然后依次探索这些节点。 因为最佳优先搜索算法只根据估价函数来选择节点,所以它只能找到一个局部最优解,而不能保证一定找到全局最优解。这也是它的一个缺点。当估价函数比较准确的时候,最佳优先搜索算法可以比一般的搜索算法更加快速地找到一个解,但当估价函数不准确的时候,它可能会走进死胡同,无法找到解或者找到的解不是最优解。 最佳优先搜索算法在大量的实际问题中都得到了广泛的应用,比如人工智能、机器学习、自然语言处理、图像处理等领域。当然,在实际应用中,选择合适的估价函数是至关重要的。 ### 回答3: Best First Search算法(最佳优先搜索算法)是一种使用启发式函数来指导搜索方向的搜索算法。它基于贪心策略,每次选择启发函数值最小的节点进行扩展,直到搜索到目标节点。以下是Best First Search算法的详细介绍: 1. 算法实现 a. 初始化起点节点,并把起点节点放入未访问队列。 b. 从未访问队列中找到启发函数值最小的节点进行扩展,并把该节点移入已访问队列。如果该节点是目标节点,则搜索停止,返回结果。 c. 把扩展节点的相邻节点加入未访问队列中,并计算它们的启发函数值。 d. 重复步骤b和c,直到找到目标节点或者未访问队列为空。 2. 启发函数 启发函数是Best First Search算法的核心,它在每次扩展节点时起到指导搜索方向的作用。启发函数的设计需要考虑以下两点: a. 启发函数应该尽可能准确地反映当前节点到目标节点的距离估计,这样可以最大程度地减少搜索的盲目性。 b. 启发函数应该尽量简单,因为复杂的启发函数往往需要更多的计算,并且可能会给搜索带来额外的开销。 3. 优缺点 Best First Search算法的优点是可以快速找到目标节点,并且可以对启发函数进行灵活的设计,以适应不同的应用场景。缺点是搜索过程可能会受到启发函数的限制,导致搜索结果并不一定是最优解。此外,Best First Search算法也有一定的盲目性,因为它只考虑了当前节点的启发函数值,而没有考虑其他因素。因此,在实际应用中,需要结合具体情况进行选择。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值