test/min_cost_flow_test.cc
author hegyi
Thu, 05 Jan 2006 12:30:09 +0000
changeset 1878 409a31271efd
parent 1435 8e85e6bbefdf
child 1956 a055123339d5
permissions -rw-r--r--
Several changes. \n If new map is added to mapstorage it emits signal with the name of the new map. This was important, because from now on not only tha mapwin should be updated. \n Furthermore algobox gets a pointer to mapstorage instead of only the mapnames from it. This is important because without it it would be complicated to pass all of the required maps to algobox.
alpar@906
     1
/* -*- C++ -*-
ladanyi@1435
     2
 * test/min_cost_flow_test.cc - Part of LEMON, a generic C++ optimization library
alpar@906
     3
 *
alpar@1875
     4
 * Copyright (C) 2006 Egervary Jeno Kombinatorikus Optimalizalasi Kutatocsoport
alpar@1359
     5
 * (Egervary Research Group on Combinatorial Optimization, EGRES).
alpar@906
     6
 *
alpar@906
     7
 * Permission to use, modify and distribute this software is granted
alpar@906
     8
 * provided that this copyright notice appears in all copies. For
alpar@906
     9
 * precise terms see the accompanying LICENSE file.
alpar@906
    10
 *
alpar@906
    11
 * This software is provided "AS IS" with no warranty of any kind,
alpar@906
    12
 * express or implied, and with no claim as to its suitability for any
alpar@906
    13
 * purpose.
alpar@906
    14
 *
alpar@906
    15
 */
alpar@906
    16
alpar@899
    17
#include <iostream>
alpar@899
    18
#include "test_tools.h"
alpar@921
    19
#include <lemon/list_graph.h>
alpar@921
    20
#include <lemon/min_cost_flow.h>
alpar@899
    21
//#include <path.h>
alpar@899
    22
//#include <maps.h>
alpar@899
    23
alpar@921
    24
using namespace lemon;
alpar@899
    25
alpar@899
    26
alpar@899
    27
bool passed = true;
alpar@899
    28
/*
alpar@899
    29
void check(bool rc, char *msg="") {
alpar@899
    30
  passed = passed && rc;
alpar@899
    31
  if(!rc) {
alpar@899
    32
    std::cerr << "Test failed! ("<< msg << ")" << std::endl; \
alpar@899
    33
 
alpar@899
    34
alpar@899
    35
  }
alpar@899
    36
}
alpar@899
    37
*/
alpar@899
    38
alpar@899
    39
alpar@899
    40
int main()
alpar@899
    41
{
marci@941
    42
  typedef ListGraph Graph;
marci@941
    43
  typedef Graph::Node Node;
marci@941
    44
  typedef Graph::Edge Edge;
alpar@899
    45
marci@941
    46
  Graph graph;
alpar@899
    47
alpar@899
    48
  //Ahuja könyv példája
alpar@899
    49
alpar@899
    50
  Node s=graph.addNode();
alpar@899
    51
  Node v1=graph.addNode();  
alpar@899
    52
  Node v2=graph.addNode();
alpar@899
    53
  Node v3=graph.addNode();
alpar@899
    54
  Node v4=graph.addNode();
alpar@899
    55
  Node v5=graph.addNode();
alpar@899
    56
  Node t=graph.addNode();
alpar@899
    57
alpar@899
    58
  Edge s_v1=graph.addEdge(s, v1);
alpar@899
    59
  Edge v1_v2=graph.addEdge(v1, v2);
alpar@899
    60
  Edge s_v3=graph.addEdge(s, v3);
alpar@899
    61
  Edge v2_v4=graph.addEdge(v2, v4);
alpar@899
    62
  Edge v2_v5=graph.addEdge(v2, v5);
alpar@899
    63
  Edge v3_v5=graph.addEdge(v3, v5);
alpar@899
    64
  Edge v4_t=graph.addEdge(v4, t);
alpar@899
    65
  Edge v5_t=graph.addEdge(v5, t);
alpar@899
    66
  
alpar@899
    67
marci@941
    68
  Graph::EdgeMap<int> length(graph);
alpar@899
    69
alpar@899
    70
  length.set(s_v1, 6);
alpar@899
    71
  length.set(v1_v2, 4);
alpar@899
    72
  length.set(s_v3, 10);
alpar@899
    73
  length.set(v2_v4, 5);
alpar@899
    74
  length.set(v2_v5, 1);
alpar@899
    75
  length.set(v3_v5, 4);
alpar@899
    76
  length.set(v4_t, 8);
alpar@899
    77
  length.set(v5_t, 8);
alpar@899
    78
marci@941
    79
  Graph::EdgeMap<int> capacity(graph);
alpar@899
    80
alpar@899
    81
  capacity.set(s_v1, 2);
alpar@899
    82
  capacity.set(v1_v2, 2);
alpar@899
    83
  capacity.set(s_v3, 1);
alpar@899
    84
  capacity.set(v2_v4, 1);
alpar@899
    85
  capacity.set(v2_v5, 1);
alpar@899
    86
  capacity.set(v3_v5, 1);
alpar@899
    87
  capacity.set(v4_t, 1);
alpar@899
    88
  capacity.set(v5_t, 2);
alpar@899
    89
alpar@899
    90
  //  ConstMap<Edge, int> const1map(1);
alpar@899
    91
  std::cout << "Mincostflows algorithm test..." << std::endl;
alpar@899
    92
marci@941
    93
  MinCostFlow< Graph, Graph::EdgeMap<int>, Graph::EdgeMap<int> >
marci@941
    94
    surb_test(graph, length, capacity, s, t);
alpar@899
    95
alpar@899
    96
  int k=1;
alpar@899
    97
marci@941
    98
  surb_test.augment();
marci@941
    99
  check(  surb_test.flowValue() == 1 && surb_test.totalLength() == 19,"One path, total length should be 19");
marci@941
   100
marci@941
   101
  check(  surb_test.run(k) == 1 && surb_test.totalLength() == 19,"One path, total length should be 19");
alpar@899
   102
alpar@899
   103
  check(surb_test.checkComplementarySlackness(), "Is the primal-dual solution pair really optimal?");
alpar@899
   104
  
alpar@899
   105
  k=2;
alpar@899
   106
  
marci@941
   107
  check(  surb_test.run(k) == 2 && surb_test.totalLength() == 41,"Two paths, total length should be 41");
alpar@899
   108
alpar@899
   109
  check(surb_test.checkComplementarySlackness(), "Is the primal-dual solution pair really optimal?");
alpar@899
   110
  
marci@941
   111
  surb_test.augment();
marci@941
   112
  surb_test.augment();
marci@941
   113
  surb_test.augment();
alpar@899
   114
  k=4;
alpar@899
   115
marci@941
   116
  check(  surb_test.run(k) == 3 && surb_test.totalLength() == 64,"Three paths, total length should be 64");
alpar@899
   117
alpar@899
   118
  check(surb_test.checkComplementarySlackness(), "Is the primal-dual solution pair really optimal?");
alpar@899
   119
alpar@899
   120
marci@941
   121
  std::cout << (passed ? "All tests passed." : "Some of the tests failed!!!")
marci@941
   122
	    << std::endl;
alpar@899
   123
alpar@899
   124
  return passed ? 0 : 1;
alpar@899
   125
alpar@899
   126
}