【发布时间】:2015-05-17 11:18:23
【问题描述】:
我正在尝试在 VS2013 上使用 C++ 实现最佳优先搜索。下面是代码。
//node for tree
struct Node
{
Node(std::string const& s, std::string const& p)
: state(s), path(p)
{}
const std::string state;
const std::string path;
};
//heuristic functor
struct ManhattanDistance
{
std::size_t operator()(std::string const& state, std::string const& goal)
{
std::size_t ret = 0;
for (int index = 0; index != goal.size(); ++index)
{
if ('0' == state[index])
continue;
auto digit = state[index] - '0';
ret += abs(index / 3 - digit / 3) + abs(index % 3 - digit % 3);// distance(row) plus distance(col)
}
return ret;
}
};
//functor to compare nodes using the heuristic function.
template<typename HeuristicFunc>
struct GreaterThan
{
explicit GreaterThan(HeuristicFunc h, std::string const& g = "012345678")
: goal(g), heuristic(h)
{}
bool operator()(Node const& lhs, Node const& rhs) const
{
return heuristic(lhs.state, goal) > heuristic(rhs.state, goal);
return true;
}
const std::string goal;
const HeuristicFunc heuristic;
};
在单元测试中测试此代码时,编译器抱怨:
错误 1 错误 C3848:类型为 'const ai::search::ManhattanDistance' 的表达式将丢失一些 const-volatile 限定符,以便调用 'size_t ManhattanDistance::operator ()(const std::string &,const std ::字符串 &)'
如何理解这个错误?如何解决?
【问题讨论】:
-
您的意思是“深度优先搜索”还是“广度优先搜索”? “最佳优先搜索”对我来说是新的......
-
嗨@UlrichEckhardt,不是DFS 或BFS。最佳优先搜索使用启发式函数来评估每个节点,以便我们可以使用该值作为键来对优先级队列中的节点进行排序。这种方式有时比普通的 DFS 或 BFS 具有更好的性能。在这里查看更多详细信息:en.wikipedia.org/wiki/Best-first_search
-
谢谢,不知道那个。
标签: c++ visual-studio templates c++11