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 } |