c – boost :: graph astar算法,无异常
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了c – boost :: graph astar算法,无异常,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含2824字,纯文字阅读大概需要5分钟。
内容图文
![c – boost :: graph astar算法,无异常](/upload/InfoBanner/zyjiaocheng/723/f0276d7135de4daf87ff1c419acdd058.jpg)
我正在阅读boost :: graph文档以供将来使用.我对A *算法特别感兴趣.
看看boost :: graph :: astar_search用法示例,似乎停止算法的方法是抛出异常并将其捕获到算法之外.
因为我不想抛出任何异常,导致C中的异常处理真的很复杂而且效率不高,我想知道boost :: graph是否提出了另一种方法来在达到目标时停止算法.
有没有人有一个不使用任何例外的替代例子?
解决方法:
根据FAQ,从BFS提前退出的唯一方法是抛出异常并“查看提升邮件列表以获取详细信息”,但我从未发现过这样的细节.
要不在A *中使用异常,您必须修改算法并为您自己的访问者引入停止条件:
#include <boost/graph/astar_search.hpp>
namespace boost { namespace graph {
template < class Visitors = null_visitor >
struct stopable_astar_visitor : public astar_visitor<Visitors> {
stopable_astar_visitor() {}
stopable_astar_visitor(Visitors vis) : astar_visitor<Visitors>(vis) {}
template < class Vertex, class Graph >
bool should_stop(Vertex &v, Graph &g) {
return true;
}
};
template <typename VertexListGraph, typename AStarHeuristic,
typename AStarVisitor, typename PredecessorMap,
typename CostMap, typename DistanceMap,
typename WeightMap,
typename CompareFunction, typename CombineFunction,
typename CostZero>
inline void
stoppable_astar_search_no_init_tree
(const VertexListGraph &g,
typename graph_traits<VertexListGraph>::vertex_descriptor s,
AStarHeuristic h, AStarVisitor vis,
PredecessorMap predecessor, CostMap cost,
DistanceMap distance, WeightMap weight,
CompareFunction compare, CombineFunction combine,
CostZero zero)
{
typedef typename graph_traits<VertexListGraph>::vertex_descriptor
Vertex;
typedef typename property_traits<DistanceMap>::value_type Distance;
typedef d_ary_heap_indirect<
std::pair<Distance, Vertex>,
4,
null_property_map<std::pair<Distance, Vertex>, std::size_t>,
function_property_map<graph_detail::select1st<Distance, Vertex>, std::pair<Distance, Vertex> >,
CompareFunction>
MutableQueue;
MutableQueue Q(
make_function_property_map<std::pair<Distance, Vertex> >(graph_detail::select1st<Distance, Vertex>()),
null_property_map<std::pair<Distance, Vertex>, std::size_t>(),
compare);
int counter = 0;
vis.discover_vertex(s, g);
Q.push(std::make_pair(get(cost, s), s));
while (!Q.empty()) {
counter++;
Vertex v;
Distance v_rank;
boost::tie(v_rank, v) = Q.top();
Q.pop();
if (vis.should_stop(v, g)) {
return;
}
vis.examine_vertex(v, g);
BGL_FORALL_OUTEDGES_T(v, e, g, VertexListGraph) {
Vertex w = target(e, g);
vis.examine_edge(e, g);
Distance e_weight = get(weight, e);
if (compare(e_weight, zero))
BOOST_THROW_EXCEPTION(negative_edge());
bool decreased =
relax(e, g, weight, predecessor, distance,
combine, compare);
Distance w_d = combine(get(distance, v), e_weight);
if (decreased) {
vis.edge_relaxed(e, g);
Distance w_rank = combine(get(distance, w), h(w));
put(cost, w, w_rank);
vis.discover_vertex(w, g);
Q.push(std::make_pair(w_rank, w));
} else {
vis.edge_not_relaxed(e, g);
}
}
vis.finish_vertex(v, g);
}
}
}} // end namespace boost::graph
内容总结
以上是互联网集市为您收集整理的c – boost :: graph astar算法,无异常全部内容,希望文章能够帮你解决c – boost :: graph astar算法,无异常所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。