Boost logo

Boost Users :

Subject: [Boost-users] [BGL]Using a function for weightmap to dijkstra_shortest_path
From: Amit Prakash Ambasta (amit.prakash.ambasta_at_[hidden])
Date: 2015-11-23 03:19:45


Hi,

I am trying to write use BGL.dijkstra to calculate a shortest path in a
time dependent network where edge.cost C(u, v) is a function of
distance_at_edge.source and a variable wait time dependent on Edge.departure
i.e.

Cost(Edge(u,v), D(u)) = Wait(Edge(u, v).departure, D(u)) + Edge(u, v).delay

The cost function ( and edge property is defined as):

struct Eonnection {
    Eonnection(const Vertex source, const Vertex destination, const
double departure, const double duration, const double cost) {
        this->source = source;
        this->destination = destination;
        this->departure = departure;
        this->duration = duration;
        this->cost = cost;
    };

    Vertex source;
    Vertex destination;
    double departure; // Time of departure
    double duration; // Duration of traversing edge
    double cost; // Actual cost of traversing Edge

    std::pair<double, double> dyn_cost(std::vector<std::pair<double,
double> > distances, double t_max) {
        std::pair<double, double> d_parent = distances[this->source];
        double t_parent = d_parent.first;
        double c_parent = d_parent.second;

        double t_time_of_day = fmod(t_parent, 24 * 3600);
        double t_delay = t_time_of_day <= this->departure ?
this->departure - t_time_of_day: this->departure + (24 * 3600 -
t_time_of_day);
        double t_total = t_parent + t_delay + this->duration;

        if(t_total < t_max) {
            std::cout << "Edge usable with cost " << c_parent +
this->cost << ", " << t_total << std::endl;
            return std::pair<double, double>(c_parent + this->cost, t_total);
        } else {
            std::cout << "Edge unusable" << std::endl;
            return std::pair<double,
double>(std::numeric_limits<double>::infinity(),
std::numeric_limits<double>::infinity());
        }
    };

};

I'm trying to call dijkstra as

    dijkstra_shortest_paths_no_color_map(
        g, source,
        boost::make_iterator_property_map(pred.begin(),
get(boost::vertex_index, g)),
        boost::make_iterator_property_map(distances.begin(),
get(boost::vertex_index, g)),
        boost::make_transform_value_property_map(
            boost::bind<std::pair<double, double>
>(&Eonnection::dyn_cost, _1, _2, distances, 24 * 3600 * 3),
            get(boost::edge_bundle, g)
        ),
        get(vertex_index, g), smaller, combiner,
        std::pair<double,
double>(std::numeric_limits<double>::infinity(),
std::numeric_limits<double>::infinity()),
        std::pair<double, double>(0, 0), vis
    );

However, this does not seem to work. How can I pass the weights as a
dynamic function to dijkstra_shortest_paths?



Boost-users list run by williamkempf at hotmail.com, kalb at libertysoft.com, bjorn.karlsson at readsoft.com, gregod at cs.rpi.edu, wekempf at cox.net