demo/lp_demo.cc
author deba
Wed, 01 Mar 2006 10:17:25 +0000
changeset 1990 15fb7a4ea6be
parent 1875 98698b69a902
child 2369 6ae1a97055a2
permissions -rw-r--r--
Some classes assumed that the GraphMaps should be inherited
from an ObserverBase. These classes parents replaced with
DefaultMap which cause that the graph maps should not be
inherited from the ObserverBase.
athos@1577
     1
/* -*- C++ -*-
athos@1577
     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
athos@1577
     7
 * (Egervary Research Group on Combinatorial Optimization, EGRES).
athos@1577
     8
 *
athos@1577
     9
 * Permission to use, modify and distribute this software is granted
athos@1577
    10
 * provided that this copyright notice appears in all copies. For
athos@1577
    11
 * precise terms see the accompanying LICENSE file.
athos@1577
    12
 *
athos@1577
    13
 * This software is provided "AS IS" with no warranty of any kind,
athos@1577
    14
 * express or implied, and with no claim as to its suitability for any
athos@1577
    15
 * purpose.
athos@1577
    16
 *
athos@1577
    17
 */
athos@1577
    18
athos@1577
    19
/// \ingroup demos
athos@1577
    20
/// \file
athos@1577
    21
/// \brief A program demonstrating the LEMON LP solver interface
athos@1577
    22
///
athos@1577
    23
/// This program is a simple application of the LEMON LP solver
athos@1577
    24
/// interface: we formulate a linear programming (LP) problem and then
athos@1577
    25
/// solve it using the underlying solver (GLPK or CPLEX for
athos@1577
    26
/// example). For the detailed documentation of the LEMON LP solver
athos@1577
    27
/// interface read \ref lemon::LpSolverBase "this".
alpar@1641
    28
///
alpar@1641
    29
/// \include lp_demo.cc
athos@1577
    30
alpar@1610
    31
#include <lemon/lp.h>
ladanyi@1387
    32
alpar@1362
    33
#include <iostream>
alpar@1381
    34
alpar@1362
    35
using namespace lemon;
alpar@1362
    36
alpar@1362
    37
int main()
alpar@1362
    38
{     
alpar@1362
    39
 //The following example is taken from the documentation of the GLPK library.
alpar@1362
    40
 //See it in the GLPK reference manual and among the GLPK sample files (sample.c)
athos@1530
    41
athos@1530
    42
  //A default solver is taken
alpar@1610
    43
  Lp lp;
alpar@1610
    44
  typedef Lp::Row Row;
alpar@1610
    45
  typedef Lp::Col Col;
athos@1513
    46
  
alpar@1362
    47
athos@1577
    48
  std::cout<<"A program demonstrating the LEMON LP solver interface"<<std::endl; 
athos@1577
    49
  std::cout<<"Solver used: "<<default_solver_name<<std::endl;
athos@1577
    50
athos@1513
    51
  //This will be a maximization
alpar@1362
    52
  lp.max();
alpar@1362
    53
athos@1513
    54
  //We add coloumns (variables) to our problem
alpar@1362
    55
  Col x1 = lp.addCol();
alpar@1362
    56
  Col x2 = lp.addCol();
alpar@1362
    57
  Col x3 = lp.addCol();
alpar@1362
    58
alpar@1362
    59
  //Constraints
alpar@1362
    60
  lp.addRow(x1+x2+x3 <=100);  
alpar@1362
    61
  lp.addRow(10*x1+4*x2+5*x3<=600);  
alpar@1362
    62
  lp.addRow(2*x1+2*x2+6*x3<=300);  
alpar@1362
    63
  //Nonnegativity of the variables
alpar@1362
    64
  lp.colLowerBound(x1, 0);
alpar@1362
    65
  lp.colLowerBound(x2, 0);
alpar@1362
    66
  lp.colLowerBound(x3, 0);
alpar@1362
    67
  //Objective function
alpar@1362
    68
  lp.setObj(10*x1+6*x2+4*x3);
alpar@1362
    69
  
athos@1513
    70
  //Call the routine of the underlying LP solver
alpar@1362
    71
  lp.solve();
alpar@1362
    72
athos@1513
    73
  //Print results
alpar@1362
    74
  if (lp.primalStatus()==LpSolverBase::OPTIMAL){
athos@1577
    75
    std::cout<<"Optimal solution found!"<<std::endl;
athos@1577
    76
    printf("optimum value = %g; x1 = %g; x2 = %g; x3 = %g\n", 
alpar@1362
    77
	   lp.primalValue(), 
alpar@1362
    78
	   lp.primal(x1), lp.primal(x2), lp.primal(x3));
alpar@1362
    79
  }
alpar@1362
    80
  else{
alpar@1362
    81
    std::cout<<"Optimal solution not found!"<<std::endl;
alpar@1362
    82
  }
alpar@1362
    83
athos@1530
    84
  //End of LEMON style code
alpar@1362
    85
alpar@1362
    86
  //Here comes the same problem written in C using GLPK API routines
alpar@1362
    87
alpar@1362
    88
//   LPX *lp;
alpar@1362
    89
//       int ia[1+1000], ja[1+1000];
alpar@1362
    90
//       double ar[1+1000], Z, x1, x2, x3;
alpar@1362
    91
// s1:   lp = lpx_create_prob();
alpar@1362
    92
// s2:   lpx_set_prob_name(lp, "sample");
alpar@1362
    93
// s3:   lpx_set_obj_dir(lp, LPX_MAX);
alpar@1362
    94
// s4:   lpx_add_rows(lp, 3);
alpar@1362
    95
// s5:   lpx_set_row_name(lp, 1, "p");
alpar@1362
    96
// s6:   lpx_set_row_bnds(lp, 1, LPX_UP, 0.0, 100.0);
alpar@1362
    97
// s7:   lpx_set_row_name(lp, 2, "q");
alpar@1362
    98
// s8:   lpx_set_row_bnds(lp, 2, LPX_UP, 0.0, 600.0);
alpar@1362
    99
// s9:   lpx_set_row_name(lp, 3, "r");
alpar@1362
   100
// s10:  lpx_set_row_bnds(lp, 3, LPX_UP, 0.0, 300.0);
alpar@1362
   101
// s11:  lpx_add_cols(lp, 3);
alpar@1362
   102
// s12:  lpx_set_col_name(lp, 1, "x1");
alpar@1362
   103
// s13:  lpx_set_col_bnds(lp, 1, LPX_LO, 0.0, 0.0);
alpar@1362
   104
// s14:  lpx_set_obj_coef(lp, 1, 10.0);
alpar@1362
   105
// s15:  lpx_set_col_name(lp, 2, "x2");
alpar@1362
   106
// s16:  lpx_set_col_bnds(lp, 2, LPX_LO, 0.0, 0.0);
alpar@1362
   107
// s17:  lpx_set_obj_coef(lp, 2, 6.0);
alpar@1362
   108
// s18:  lpx_set_col_name(lp, 3, "x3");
alpar@1362
   109
// s19:  lpx_set_col_bnds(lp, 3, LPX_LO, 0.0, 0.0);
alpar@1362
   110
// s20:  lpx_set_obj_coef(lp, 3, 4.0);
alpar@1362
   111
// s21:  ia[1] = 1, ja[1] = 1, ar[1] =  1.0; /* a[1,1] =  1 */
alpar@1362
   112
// s22:  ia[2] = 1, ja[2] = 2, ar[2] =  1.0; /* a[1,2] =  1 */
alpar@1362
   113
// s23:  ia[3] = 1, ja[3] = 3, ar[3] =  1.0; /* a[1,3] =  1 */
alpar@1362
   114
// s24:  ia[4] = 2, ja[4] = 1, ar[4] = 10.0; /* a[2,1] = 10 */
alpar@1362
   115
// s25:  ia[5] = 3, ja[5] = 1, ar[5] =  2.0; /* a[3,1] =  2 */
alpar@1362
   116
// s26:  ia[6] = 2, ja[6] = 2, ar[6] =  4.0; /* a[2,2] =  4 */
alpar@1362
   117
// s27:  ia[7] = 3, ja[7] = 2, ar[7] =  2.0; /* a[3,2] =  2 */
alpar@1362
   118
// s28:  ia[8] = 2, ja[8] = 3, ar[8] =  5.0; /* a[2,3] =  5 */
alpar@1362
   119
// s29:  ia[9] = 3, ja[9] = 3, ar[9] =  6.0; /* a[3,3] =  6 */
alpar@1362
   120
// s30:  lpx_load_matrix(lp, 9, ia, ja, ar);
alpar@1362
   121
// s31:  lpx_simplex(lp);
alpar@1362
   122
// s32:  Z = lpx_get_obj_val(lp);
alpar@1362
   123
// s33:  x1 = lpx_get_col_prim(lp, 1);
alpar@1362
   124
// s34:  x2 = lpx_get_col_prim(lp, 2);
alpar@1362
   125
// s35:  x3 = lpx_get_col_prim(lp, 3);
alpar@1362
   126
// s36:  printf("\nZ = %g; x1 = %g; x2 = %g; x3 = %g\n", Z, x1, x2, x3);
alpar@1362
   127
// s37:  lpx_delete_prob(lp);
alpar@1362
   128
//       return 0;
alpar@1362
   129
alpar@1362
   130
  return 0;
alpar@1362
   131
}