dijkstra_heap_performance.cpp
来自「Boost provides free peer-reviewed portab」· C++ 代码 · 共 150 行
CPP
150 行
// Copyright 2004 The Trustees of Indiana University.// Use, modification and distribution is subject to the Boost Software// License, Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at// http://www.boost.org/LICENSE_1_0.txt)// Authors: Douglas Gregor// Andrew Lumsdaine#ifndef BOOST_GRAPH_DIJKSTRA_TESTING_DIETMAR# define BOOST_GRAPH_DIJKSTRA_TESTING#endif#include <boost/graph/dijkstra_shortest_paths.hpp>#include <boost/graph/adjacency_list.hpp>#include <boost/random/linear_congruential.hpp>#include <boost/lexical_cast.hpp>#include <boost/random/uniform_real.hpp>#include <boost/timer.hpp>#include <vector>#include <iostream>#include <iterator>#include <utility>#include <boost/random/uniform_int.hpp>#include <boost/graph/graph_traits.hpp>#include <boost/graph/erdos_renyi_generator.hpp>#include <boost/type_traits/is_base_and_derived.hpp>#include <boost/type_traits/is_same.hpp>#include <boost/detail/lightweight_test.hpp>using namespace boost;#ifdef BOOST_GRAPH_DIJKSTRA_TESTING_DIETMARstruct show_events_visitor : dijkstra_visitor<>{ template<typename Vertex, typename Graph> void discover_vertex(Vertex v, const Graph&) { std::cerr << "on_discover_vertex(" << v << ")\n"; } template<typename Vertex, typename Graph> void examine_vertex(Vertex v, const Graph&) { std::cerr << "on_discover_vertex(" << v << ")\n"; }};template<typename Graph, typename Kind>void run_test(const Graph& g, const char* name, Kind kind, const std::vector<double>& correct_distances){ std::vector<double> distances(num_vertices(g)); std::cout << "Running Dijkstra's with " << name << "..."; std::cout.flush(); timer t; dijkstra_heap_kind = kind; dijkstra_shortest_paths(g, vertex(0, g), distance_map(&distances[0]). visitor(show_events_visitor())); double run_time = t.elapsed(); std::cout << run_time << " seconds.\n"; BOOST_TEST(distances == correct_distances); if (distances != correct_distances) { std::cout << "Expected: "; std::copy(correct_distances.begin(), correct_distances.end(), std::ostream_iterator<double>(std::cout, " ")); std::cout << "\nReceived: "; std::copy(distances.begin(), distances.end(), std::ostream_iterator<double>(std::cout, " ")); std::cout << std::endl; }}#endifint main(int argc, char* argv[]){ unsigned n = (argc > 1? lexical_cast<unsigned>(argv[1]) : 10000u); unsigned m = (argc > 2? lexical_cast<unsigned>(argv[2]) : 10*n); int seed = (argc > 3? lexical_cast<int>(argv[3]) : 1); // Build random graph typedef adjacency_list<vecS, vecS, directedS, no_property, property<edge_weight_t, double> > Graph; std::cout << "Generating graph..."; std::cout.flush(); minstd_rand gen(seed); double p = double(m)/(double(n)*double(n)); Graph g(erdos_renyi_iterator<minstd_rand, Graph>(gen, n, p), erdos_renyi_iterator<minstd_rand, Graph>(), n); std::cout << n << " vertices, " << num_edges(g) << " edges.\n"; uniform_real<double> rand01(0.0, 1.0); graph_traits<Graph>::edge_iterator ei, ei_end; for (tie(ei, ei_end) = edges(g); ei != ei_end; ++ei) put(edge_weight, g, *ei, rand01(gen)); std::vector<double> binary_heap_distances(n); std::vector<double> relaxed_heap_distances(n); // Run binary heap version std::cout << "Running Dijkstra's with binary heap..."; std::cout.flush(); timer t;#ifdef BOOST_GRAPH_DIJKSTRA_TESTING_DIETMAR dijkstra_heap_kind = dijkstra_binary_heap;#else dijkstra_relaxed_heap = false;#endif dijkstra_shortest_paths(g, vertex(0, g), distance_map(&binary_heap_distances[0])); double binary_heap_time = t.elapsed(); std::cout << binary_heap_time << " seconds.\n"; // Run relaxed heap version std::cout << "Running Dijkstra's with relaxed heap..."; std::cout.flush(); t.restart();#ifdef BOOST_GRAPH_DIJKSTRA_TESTING_DIETMAR dijkstra_heap_kind = dijkstra_relaxed_heap;#else dijkstra_relaxed_heap = true;#endif dijkstra_shortest_paths(g, vertex(0, g), distance_map(&relaxed_heap_distances[0])); double relaxed_heap_time = t.elapsed(); std::cout << relaxed_heap_time << " seconds.\n" << "Speedup = " << (binary_heap_time / relaxed_heap_time) << ".\n"; // Verify that the results are equivalent BOOST_TEST(binary_heap_distances == relaxed_heap_distances);#ifdef BOOST_GRAPH_DIJKSTRA_TESTING_DIETMAR run_test(g, "d-ary heap (d=2)", dijkstra_d_heap_2, binary_heap_distances); run_test(g, "d-ary heap (d=3)", dijkstra_d_heap_3, binary_heap_distances); run_test(g, "Fibonacci heap", dijkstra_fibonacci_heap, binary_heap_distances); run_test(g, "Lazy Fibonacci heap", dijkstra_lazy_fibonacci_heap, binary_heap_distances); run_test(g, "Pairing heap", dijkstra_pairing_heap, binary_heap_distances); run_test(g, "Splay heap", dijkstra_splay_heap, binary_heap_distances);#endif return boost::report_errors();}
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?