Program Listing for File min_cycle_ratio.hpp¶
↰ Return to documentation for file (netoptim/min_cycle_ratio.hpp)
// -*- coding: utf-8 -*-
#pragma once
#include "parametric.hpp" // import max_parametric
#include <algorithm>
#include <numeric>
#include <py2cpp/py2cpp.hpp>
template <typename Graph, typename T, typename Fn1, typename Fn2,
typename Container>
auto min_cycle_ratio(const Graph& G, T& r0, Fn1&& get_cost, Fn2&& get_time,
Container&& dist, size_t max_iter = 1000)
{
using edge_t = typename Graph::edge_t;
using cost_T = decltype(get_cost(std::declval<edge_t>()));
using time_T = decltype(get_time(std::declval<edge_t>()));
auto calc_ratio = [&](const auto& C) -> T
{
auto total_cost = cost_T(0);
auto total_time = time_T(0);
for (auto&& e : C)
{
total_cost += get_cost(e);
total_time += get_time(e);
}
return T(total_cost) / total_time;
};
auto calc_weight = [&](const T& r, const auto& e) -> T
{ return get_cost(e) - r * get_time(e); };
return max_parametric(G, r0, std::move(calc_weight), std::move(calc_ratio),
std::forward<Container>(dist), max_iter);
}