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