demo/min_route.cc
author deba
Mon, 19 Jun 2006 13:44:06 +0000
changeset 2101 439b7f21ccc4
parent 1956 a055123339d5
child 2207 75a29ac69c19
permissions -rw-r--r--
Improvement:

The item sets are written in the order sorted by the labels.

It solves the problem if we read a graph from a file and
then write it back then the nodes will be reversed.
It can be switched off with the LemonWriter interface.
ladanyi@1636
     1
/* -*- C++ -*-
ladanyi@1636
     2
 *
alpar@1956
     3
 * This file is a part of LEMON, a generic C++ optimization library
alpar@1956
     4
 *
alpar@1956
     5
 * Copyright (C) 2003-2006
alpar@1956
     6
 * Egervary Jeno Kombinatorikus Optimalizalasi Kutatocsoport
ladanyi@1636
     7
 * (Egervary Research Group on Combinatorial Optimization, EGRES).
ladanyi@1636
     8
 *
ladanyi@1636
     9
 * Permission to use, modify and distribute this software is granted
ladanyi@1636
    10
 * provided that this copyright notice appears in all copies. For
ladanyi@1636
    11
 * precise terms see the accompanying LICENSE file.
ladanyi@1636
    12
 *
ladanyi@1636
    13
 * This software is provided "AS IS" with no warranty of any kind,
ladanyi@1636
    14
 * express or implied, and with no claim as to its suitability for any
ladanyi@1636
    15
 * purpose.
ladanyi@1636
    16
 *
ladanyi@1636
    17
 */
ladanyi@1636
    18
deba@1358
    19
#include <iostream>
deba@1358
    20
#include <fstream>
deba@1358
    21
deba@1342
    22
#include <lemon/smart_graph.h>
deba@1342
    23
#include <lemon/dijkstra.h>
deba@1342
    24
#include <lemon/maps.h>
deba@1342
    25
#include <lemon/xy.h>
deba@1342
    26
#include <lemon/graph_reader.h>
deba@1342
    27
deba@1342
    28
#include <lemon/time_measure.h>
deba@1342
    29
deba@1342
    30
#include <cmath>
deba@1342
    31
deba@1775
    32
/// \ingroup demos
deba@1775
    33
/// \file
alpar@1959
    34
/// \brief Minimal route on a planar graph with eucledian distances.
deba@1775
    35
///
alpar@1959
    36
/// Minimal route on a planar graph with eucledian distances.
deba@1775
    37
///
deba@1775
    38
/// \include min_route.cc
deba@1775
    39
deba@1358
    40
deba@1342
    41
using namespace lemon;
deba@1342
    42
deba@1342
    43
template <typename CoordMap>
deba@1342
    44
class PotentialMap {
deba@1342
    45
public:
deba@1342
    46
  typedef double Value;
deba@1342
    47
  typedef typename CoordMap::Key Key;
deba@1342
    48
deba@1342
    49
  PotentialMap(const CoordMap& _coord, const xy<double>& _target)
deba@1342
    50
    : coord(_coord), target(_target) {}
deba@1342
    51
deba@1342
    52
  double operator[](const Key& node) const {
deba@1342
    53
    return std::sqrt((coord[node].x - target.x) * (coord[node].x - target.x) + 
deba@1342
    54
		     (coord[node].y - target.y) * (coord[node].y - target.y));
deba@1342
    55
  }
deba@1342
    56
private:
deba@1358
    57
  const CoordMap& coord;
deba@1342
    58
  xy<double> target;
deba@1342
    59
};
deba@1342
    60
deba@1342
    61
template <typename Graph, typename LengthMap, typename PotentialMap>
deba@1342
    62
class ReducedLengthMap {
deba@1342
    63
public:
deba@1342
    64
  typedef double Value;
deba@1342
    65
  typedef typename LengthMap::Key Key;
deba@1342
    66
deba@1342
    67
  ReducedLengthMap(const Graph& _graph, const LengthMap& _length, 
deba@1342
    68
		   const PotentialMap& _pot) 
deba@1342
    69
    : graph(_graph), length(_length), pot(_pot) {}
deba@1342
    70
deba@1342
    71
  Value operator[](const Key& edge) const {
deba@1342
    72
    return length[edge] - (pot[graph.source(edge)] - pot[graph.target(edge)]);
deba@1342
    73
  }
deba@1342
    74
deba@1342
    75
private:
deba@1342
    76
  const Graph& graph;
deba@1342
    77
  const LengthMap& length;
deba@1342
    78
  const PotentialMap& pot;
deba@1342
    79
};
deba@1342
    80
deba@1342
    81
int main() {
deba@1342
    82
  typedef SmartGraph Graph;
deba@1342
    83
deba@1342
    84
  typedef Graph::Edge Edge;
deba@1342
    85
  typedef Graph::Node Node;
deba@1342
    86
  typedef Graph::EdgeIt EdgeIt;
deba@1342
    87
  typedef Graph::NodeIt NodeIt;
deba@1342
    88
  typedef Graph::EdgeMap<double> LengthMap;
deba@1342
    89
  typedef Graph::NodeMap<xy<double> > CoordMap;
deba@1342
    90
deba@1342
    91
  SmartGraph graph;
deba@1342
    92
deba@1358
    93
  std::ifstream is("route.lgf");
deba@1358
    94
  GraphReader<Graph> reader(is, graph);
deba@1342
    95
  
deba@1342
    96
  CoordMap coord(graph);
deba@1342
    97
  XMap<CoordMap> xcoord = xMap(coord);
deba@1394
    98
  reader.readNodeMap("coordinates_x", xcoord);
deba@1342
    99
  YMap<CoordMap> ycoord = yMap(coord);
deba@1394
   100
  reader.readNodeMap("coordinates_y", ycoord);
deba@1342
   101
deba@1342
   102
  LengthMap length(graph);
deba@1394
   103
  reader.readEdgeMap("length", length);
deba@1342
   104
deba@1342
   105
  Node source, target;
deba@1394
   106
  reader.readNode("source", source);
deba@1394
   107
  reader.readNode("target", target);
deba@1342
   108
deba@1342
   109
  reader.run();
deba@1342
   110
deba@1342
   111
  {
deba@1342
   112
    Timer timer;
deba@1342
   113
    Dijkstra<Graph, LengthMap> dijkstra(graph, length);
deba@1342
   114
    dijkstra.init();
deba@1342
   115
    dijkstra.addSource(source);
deba@1342
   116
    dijkstra.start(target);
deba@1342
   117
deba@1342
   118
    std::cout << dijkstra.dist(target) << std::endl;
deba@1342
   119
    std::cout << timer << std::endl;
deba@1342
   120
  }
deba@1342
   121
  {
deba@1342
   122
    Timer timer;
deba@1342
   123
    typedef PotentialMap<CoordMap> Potential;
deba@1342
   124
    Potential potential(coord, coord[target]);
deba@1342
   125
deba@1342
   126
    typedef ReducedLengthMap<Graph, LengthMap, Potential> ReducedLength;
deba@1342
   127
    ReducedLength reduced(graph, length, potential);
deba@1342
   128
deba@1342
   129
    Dijkstra<Graph, ReducedLength> dijkstra(graph, reduced);
deba@1342
   130
deba@1342
   131
    dijkstra.init();
deba@1342
   132
    dijkstra.addSource(source);
deba@1342
   133
    dijkstra.start(target);
deba@1342
   134
  
deba@1342
   135
    std::cout << dijkstra.dist(target) + potential[source] << std::endl;
deba@1342
   136
    std::cout << timer << std::endl;
deba@1342
   137
  }
deba@1342
   138
deba@1342
   139
  return 0;
deba@1342
   140
}