Weight map as function in Boost Graph Dijkstra algorithm(权重图作为 Boost Graph Dijkstra 算法中的函数)
问题描述
我正在使用 Boost Graph Libraries 并且需要使用一个权重图,它不是常数,但它是参数 K 的函数(即边缘成本取决于 K).在实践中,给定以下代码:
I'm using Boost Graph Libraries and need to use a weightmap which is not constant, but which is a function of a parameter K (i.e. the edge costs depend on K). In practice, given the following code:
#include <boost/config.hpp>
#include <iostream>
#include <fstream>
#include <boost/graph/graph_traits.hpp>
#include <boost/graph/dijkstra_shortest_paths.hpp>
#include <boost/graph/adjacency_list.hpp>
struct Edge {
Edge(float weight_) : weight(weight_) {}
float weight;
float getWeight(int K)
{
return K*weight;
}
};
int main(int, char**){
typedef boost::adjacency_list < boost::vecS, boost::vecS, boost::directedS, boost::no_property, Edge > graph_t;
typedef boost::graph_traits < graph_t >::vertex_descriptor vertex_t;
graph_t g;
vertex_t a = boost::add_vertex(g);
vertex_t b = boost::add_vertex(g);
vertex_t c = boost::add_vertex(g);
vertex_t d = boost::add_vertex(g);
boost::add_edge(a, b, Edge(3), g);
boost::add_edge(b, c, Edge(3), g);
boost::add_edge(a, d, Edge(1), g);
boost::add_edge(d, c, Edge(4), g);
std::vector<vertex_t> preds(4);
// Traditional dijsktra (sum)
boost::dijkstra_shortest_paths(g, a, boost::predecessor_map(&preds[0]).weight_map(boost::get(&Edge::weight,g)));
return 0;
}
我想调用 Dijkstra 算法如下:
I'd like to call Dijkstra algorithm as follows:
boost::dijkstra_shortest_paths(g, a, boost::predecessor_map(&preds[0]).weight_map(boost::get(&Edge::getWeight(2),g)));
但错误如下
不能在没有的情况下调用成员函数‘float Edge::getWeight(int)’对象
cannot call member function ‘float Edge::getWeight(int)’ without object
有人知道如何解决这个问题吗?
Does anyone know how to solve this?
推荐答案
属性映射有多种风格.特别是这里可以使用transform_value_property_map
.
There are a number of property map flavours. In particular one is the transform_value_property_map
can be used here.
假设你会写 c++03:
Assuming c++03 you'd write:
生活在 Coliru
#include <boost/property_map/transform_value_property_map.hpp>
#include <boost/bind.hpp>
// ...
boost::dijkstra_shortest_paths(g, a, boost::predecessor_map(&preds[0]).weight_map(
boost::make_transform_value_property_map(
boost::bind(&Edge::getWeight ,_1, 2),
boost::get(boost::edge_bundle, g))
));
更清洁的 C++11
生活在 Coliru
auto wmap = make_transform_value_property_map([](Edge& e) { return e.getWeight(2); }, get(boost::edge_bundle, g));
boost::dijkstra_shortest_paths(g, a, boost::predecessor_map(&preds[0]).weight_map(wmap));
您可以删除 boost/bind.hpp
包含.
生活在 Coliru
你实际上并不需要它.您可以就地编写 Phoenix 演员:
You don't actually need it. You could write a Phoenix actor in-place:
#include <boost/phoenix.hpp>
using boost::phoenix::arg_names::arg1;
auto wmap = make_transform_value_property_map(2 * (&arg1->*&Edge::weight), get(boost::edge_bundle, g));
或者再次使用c++11:
Or use c++11 again:
生活在 Coliru
auto wmap = make_transform_value_property_map([](Edge& e) { return e.weight * 2; }, get(boost::edge_bundle, g));
这篇关于权重图作为 Boost Graph Dijkstra 算法中的函数的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持编程学习网!
本文标题为:权重图作为 Boost Graph Dijkstra 算法中的函数
基础教程推荐
- 如何在不破坏 vtbl 的情况下做相当于 memset(this, ...) 的操作? 2022-01-01
- 在 C++ 中循环遍历所有 Lua 全局变量 2021-01-01
- 为什么语句不能出现在命名空间范围内? 2021-01-01
- 如何“在 Finder 中显示"或“在资源管理器中显 2021-01-01
- 如何使图像调整大小以在 Qt 中缩放? 2021-01-01
- 管理共享内存应该分配多少内存?(助推) 2022-12-07
- 使用从字符串中提取的参数调用函数 2022-01-01
- 从 std::cin 读取密码 2021-01-01
- 为 C/C++ 中的项目的 makefile 生成依赖项 2022-01-01
- Windows Media Foundation 录制音频 2021-01-01