demo/lp_demo.cc
author hegyi
Mon, 21 Nov 2005 18:03:20 +0000
changeset 1823 cb082cdf3667
parent 1636 260ac104190f
child 1875 98698b69a902
permissions -rw-r--r--
NewMapWin has become Dialog instead of Window. Therefore it is created dynamically, when there is need for it, instead of keeping one instance in memory. This solution is slower, but more correct than before.
     1 /* -*- C++ -*-
     2  * demo/lp_demo.cc - Part of LEMON, a generic C++ optimization library
     3  *
     4  * Copyright (C) 2005 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 }