test/mip_test.cc
author alpar
Thu, 14 Sep 2006 19:11:24 +0000
changeset 2216 1e45cdeea3cc
parent 2149 b437bdee6fd0
child 2218 50f1a780a5ff
permissions -rw-r--r--
The recent progresses on the tutorial due to Mark.
     1 #include <lemon/lp.h>
     2 #include "test_tools.h"
     3 
     4 using namespace lemon;
     5 
     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.mipStatus()==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;
    31 
    32 
    33   Col x1 = mip.addCol();
    34   Col x2 = mip.addCol();
    35 
    36 
    37 
    38 
    39 
    40 
    41   //Objective function
    42   mip.setObj(x1);
    43 
    44   mip.max();
    45 
    46 
    47   //Unconstrained optimization
    48   mip.solve();
    49   //Check it out!
    50 
    51   //Constraints
    52   mip.addRow(2*x1+x2 <=2);  
    53   mip.addRow(x1-2*x2 <=0);  
    54 
    55   //Nonnegativity of the variable x1
    56   mip.colLowerBound(x1, 0);
    57 
    58 
    59 
    60   //Maximization of x1
    61   //over the triangle with vertices 
    62   double expected_opt=4.0/5.0;
    63   solveAndCheck(mip, Mip::OPTIMAL, expected_opt);
    64 
    65   //Restrict x2 to integer
    66   mip.colType(x2,Mip::INTEGER);  
    67   expected_opt=1.0/2.0;
    68   solveAndCheck(mip, Mip::OPTIMAL, expected_opt);
    69 
    70 
    71   //Restrict both to integer
    72   mip.colType(x1,Mip::INTEGER);  
    73   expected_opt=0;
    74   solveAndCheck(mip, Mip::OPTIMAL, expected_opt);
    75 
    76  
    77 
    78 }
    79 
    80 
    81 int main() 
    82 {
    83 
    84 #ifdef HAVE_GLPK
    85   MipGlpk mip1;
    86   aTest(mip1);
    87 #endif
    88 
    89   return 0;
    90 
    91 }