test/mip_test.cc
changeset 2194 eaf16c8f6fef
parent 2147 63d293ff1bef
child 2213 2c094dfa176d
equal deleted inserted replaced
1:33a3153e8b8d 2:04369612e192
     1 #include <lemon/lp.h>
     1 #include <lemon/lp.h>
       
     2 #include "test_tools.h"
     2 
     3 
     3 using namespace lemon;
     4 using namespace lemon;
     4 
     5 
     5 int main(){
     6 void solveAndCheck(Mip& lp, LpSolverBase::SolutionStatus stat, 
       
     7 		   double exp_opt) {
       
     8   using std::string;
       
     9   lp.solve();
       
    10   //int decimal,sign;
       
    11   std::ostringstream buf;
       
    12   buf << "Primalstatus should be: " << int(stat)<<" and it is "<<int(lp.primalStatus());
       
    13 
       
    14   //  itoa(stat,buf1, 10);
       
    15   check(lp.primalStatus()==stat, buf.str());
       
    16 
       
    17   if (stat ==  LpSolverBase::OPTIMAL) {
       
    18     std::ostringstream buf;
       
    19     buf << "Wrong optimal value: the right optimum is " << exp_opt; 
       
    20     check(std::abs(lp.primalValue()-exp_opt) < 1e-3, buf.str());
       
    21     //+ecvt(exp_opt,2)
       
    22   }
       
    23 }
       
    24 
       
    25 void aTest(Mip& mip)
       
    26 {
       
    27  //The following example is very simple
       
    28 
       
    29   typedef Mip::Row Row;
       
    30   typedef Mip::Col Col;
     6 
    31 
     7 
    32 
       
    33   Col x1 = mip.addCol();
       
    34   Col x2 = mip.addCol();
       
    35 
       
    36 
       
    37 
       
    38   //Constraints
       
    39   mip.addRow(2*x1+x2 <=2);  
       
    40   mip.addRow(x1-2*x2 <=0);  
       
    41 
       
    42   //Nonnegativity of the variable x1
       
    43   mip.colLowerBound(x1, 0);
       
    44 
       
    45 
       
    46 
       
    47   //Objective function
       
    48   mip.setObj(x1);
       
    49 
       
    50   mip.max();
       
    51 
       
    52 
       
    53   //Maximization of x1
       
    54   //over the triangle with vertices
       
    55   double expected_opt=4.0/5.0;
       
    56   solveAndCheck(mip, Mip::OPTIMAL, expected_opt);
       
    57 
       
    58   //Restrict x2 to integer
       
    59   mip.colType(x2,Mip::INTEGER);  
       
    60   expected_opt=1.0/2.0;
       
    61   solveAndCheck(mip, Mip::OPTIMAL, expected_opt);
       
    62 
       
    63 
       
    64   //Restrict both to integer
       
    65   mip.colType(x1,Mip::INTEGER);  
       
    66   expected_opt=0;
       
    67   solveAndCheck(mip, Mip::OPTIMAL, expected_opt);
       
    68 
       
    69  
       
    70 
       
    71 }
       
    72 
       
    73 
       
    74 int main() 
       
    75 {
       
    76 
     8 #ifdef HAVE_GLPK
    77 #ifdef HAVE_GLPK
     9   //This needs some thinking
    78   MipGlpk mip1;
       
    79   aTest(mip1);
    10 #endif
    80 #endif
    11 
    81 
    12   return 0;
    82   return 0;
    13 
    83 
    14 }
    84 }