kpeter@710: /* -*- mode: C++; indent-tabs-mode: nil; -*- kpeter@710: * kpeter@710: * This file is a part of LEMON, a generic C++ optimization library. kpeter@710: * kpeter@710: * Copyright (C) 2003-2009 kpeter@710: * Egervary Jeno Kombinatorikus Optimalizalasi Kutatocsoport kpeter@710: * (Egervary Research Group on Combinatorial Optimization, EGRES). kpeter@710: * kpeter@710: * Permission to use, modify and distribute this software is granted kpeter@710: * provided that this copyright notice appears in all copies. For kpeter@710: * precise terms see the accompanying LICENSE file. kpeter@710: * kpeter@710: * This software is provided "AS IS" with no warranty of any kind, kpeter@710: * express or implied, and with no claim as to its suitability for any kpeter@710: * purpose. kpeter@710: * kpeter@710: */ kpeter@710: kpeter@710: namespace lemon { kpeter@710: kpeter@710: /** kpeter@710: \page min_cost_flow Minimum Cost Flow Problem kpeter@710: kpeter@710: \section mcf_def Definition (GEQ form) kpeter@710: kpeter@710: The \e minimum \e cost \e flow \e problem is to find a feasible flow of kpeter@710: minimum total cost from a set of supply nodes to a set of demand nodes kpeter@710: in a network with capacity constraints (lower and upper bounds) kpeter@802: and arc costs \ref amo93networkflows. kpeter@710: kpeter@710: Formally, let \f$G=(V,A)\f$ be a digraph, \f$lower: A\rightarrow\mathbf{R}\f$, kpeter@710: \f$upper: A\rightarrow\mathbf{R}\cup\{+\infty\}\f$ denote the lower and kpeter@710: upper bounds for the flow values on the arcs, for which kpeter@710: \f$lower(uv) \leq upper(uv)\f$ must hold for all \f$uv\in A\f$, kpeter@710: \f$cost: A\rightarrow\mathbf{R}\f$ denotes the cost per unit flow kpeter@710: on the arcs and \f$sup: V\rightarrow\mathbf{R}\f$ denotes the kpeter@710: signed supply values of the nodes. kpeter@710: If \f$sup(u)>0\f$, then \f$u\f$ is a supply node with \f$sup(u)\f$ kpeter@710: supply, if \f$sup(u)<0\f$, then \f$u\f$ is a demand node with kpeter@710: \f$-sup(u)\f$ demand. kpeter@710: A minimum cost flow is an \f$f: A\rightarrow\mathbf{R}\f$ solution kpeter@710: of the following optimization problem. kpeter@710: kpeter@710: \f[ \min\sum_{uv\in A} f(uv) \cdot cost(uv) \f] kpeter@710: \f[ \sum_{uv\in A} f(uv) - \sum_{vu\in A} f(vu) \geq kpeter@710: sup(u) \quad \forall u\in V \f] kpeter@710: \f[ lower(uv) \leq f(uv) \leq upper(uv) \quad \forall uv\in A \f] kpeter@710: kpeter@710: The sum of the supply values, i.e. \f$\sum_{u\in V} sup(u)\f$ must be kpeter@710: zero or negative in order to have a feasible solution (since the sum kpeter@710: of the expressions on the left-hand side of the inequalities is zero). kpeter@710: It means that the total demand must be greater or equal to the total kpeter@710: supply and all the supplies have to be carried out from the supply nodes, kpeter@710: but there could be demands that are not satisfied. kpeter@710: If \f$\sum_{u\in V} sup(u)\f$ is zero, then all the supply/demand kpeter@710: constraints have to be satisfied with equality, i.e. all demands kpeter@710: have to be satisfied and all supplies have to be used. kpeter@710: kpeter@710: kpeter@710: \section mcf_algs Algorithms kpeter@710: kpeter@710: LEMON contains several algorithms for solving this problem, for more kpeter@710: information see \ref min_cost_flow_algs "Minimum Cost Flow Algorithms". kpeter@710: kpeter@710: A feasible solution for this problem can be found using \ref Circulation. kpeter@710: kpeter@710: kpeter@710: \section mcf_dual Dual Solution kpeter@710: kpeter@710: The dual solution of the minimum cost flow problem is represented by kpeter@710: node potentials \f$\pi: V\rightarrow\mathbf{R}\f$. kpeter@710: An \f$f: A\rightarrow\mathbf{R}\f$ primal feasible solution is optimal kpeter@710: if and only if for some \f$\pi: V\rightarrow\mathbf{R}\f$ node potentials kpeter@710: the following \e complementary \e slackness optimality conditions hold. kpeter@710: kpeter@710: - For all \f$uv\in A\f$ arcs: kpeter@710: - if \f$cost^\pi(uv)>0\f$, then \f$f(uv)=lower(uv)\f$; kpeter@710: - if \f$lower(uv)"less or equal" (LEQ) supply/demand constraints, kpeter@710: instead of the "greater or equal" (GEQ) constraints. kpeter@710: kpeter@710: \f[ \min\sum_{uv\in A} f(uv) \cdot cost(uv) \f] kpeter@710: \f[ \sum_{uv\in A} f(uv) - \sum_{vu\in A} f(vu) \leq kpeter@710: sup(u) \quad \forall u\in V \f] kpeter@710: \f[ lower(uv) \leq f(uv) \leq upper(uv) \quad \forall uv\in A \f] kpeter@710: kpeter@710: It means that the total demand must be less or equal to the kpeter@710: total supply (i.e. \f$\sum_{u\in V} sup(u)\f$ must be zero or kpeter@710: positive) and all the demands have to be satisfied, but there kpeter@710: could be supplies that are not carried out from the supply kpeter@710: nodes. kpeter@710: The equality form is also a special case of this form, of course. kpeter@710: kpeter@710: You could easily transform this case to the \ref mcf_def "GEQ form" kpeter@710: of the problem by reversing the direction of the arcs and taking the kpeter@710: negative of the supply values (e.g. using \ref ReverseDigraph and kpeter@710: \ref NegMap adaptors). kpeter@710: However \ref NetworkSimplex algorithm also supports this form directly kpeter@710: for the sake of convenience. kpeter@710: kpeter@710: Note that the optimality conditions for this supply constraint type are kpeter@710: slightly differ from the conditions that are discussed for the GEQ form, kpeter@710: namely the potentials have to be non-negative instead of non-positive. kpeter@710: An \f$f: A\rightarrow\mathbf{R}\f$ feasible solution of this problem kpeter@710: is optimal if and only if for some \f$\pi: V\rightarrow\mathbf{R}\f$ kpeter@710: node potentials the following conditions hold. kpeter@710: kpeter@710: - For all \f$uv\in A\f$ arcs: kpeter@710: - if \f$cost^\pi(uv)>0\f$, then \f$f(uv)=lower(uv)\f$; kpeter@710: - if \f$lower(uv)=0\f$; kpeter@710: - if \f$\sum_{uv\in A} f(uv) - \sum_{vu\in A} f(vu) \neq sup(u)\f$, kpeter@710: then \f$\pi(u)=0\f$. kpeter@710: kpeter@710: */ kpeter@710: }