1 //#include <stdio.h> |
|
2 //#include <stdlib.h> |
|
3 #include <iostream> |
1 #include <iostream> |
4 #include <lemon/lp_glpk.h> |
2 #include <lemon/lp_glpk.h> |
5 using namespace lemon; |
3 using namespace lemon; |
6 |
4 |
7 int main() |
5 int main() |
8 { |
6 { |
|
7 //The following example is taken from the documentation of the GLPK library. |
|
8 //See it in the GLPK reference manual and among the GLPK sample files (sample.c) |
9 LpGlpk lp; |
9 LpGlpk lp; |
10 typedef LpGlpk::Row Row; |
10 typedef LpGlpk::Row Row; |
11 typedef LpGlpk::Col Col; |
11 typedef LpGlpk::Col Col; |
12 //std::cout << "Hello" << std::endl; |
12 |
|
13 lp.max(); |
|
14 |
|
15 Col x1 = lp.addCol(); |
|
16 Col x2 = lp.addCol(); |
|
17 Col x3 = lp.addCol(); |
|
18 |
|
19 //One solution |
|
20 // Row p = lp.addRow(); |
|
21 // Row q = lp.addRow(); |
|
22 // Row r = lp.addRow(); |
|
23 // lp.setRow(p,x1+x2+x3 <=100); |
|
24 // lp.setRow(q,10*x1+4*x2+5*x3<=600); |
|
25 // lp.setRow(r,2*x1+2*x2+6*x3<=300); |
|
26 |
|
27 //A more elegant one |
|
28 //Constraints |
|
29 lp.addRow(x1+x2+x3 <=100); |
|
30 lp.addRow(10*x1+4*x2+5*x3<=600); |
|
31 lp.addRow(2*x1+2*x2+6*x3<=300); |
|
32 //Nonnegativity of the variables |
|
33 lp.colLowerBound(x1, 0); |
|
34 lp.colLowerBound(x2, 0); |
|
35 lp.colLowerBound(x3, 0); |
|
36 //Objective function |
|
37 lp.setObj(10*x1+6*x2+4*x3); |
|
38 |
|
39 lp.solve(); |
|
40 |
|
41 printf("\nZ = %g; x1 = %g; x2 = %g; x3 = %g\n", |
|
42 lp.primalValue(), |
|
43 lp.primal(x1), lp.primal(x2), lp.primal(x3)); |
|
44 |
|
45 //Here comes the same problem written in C using GLPK API routines |
13 |
46 |
14 // LPX *lp; |
47 // LPX *lp; |
15 // int ia[1+1000], ja[1+1000]; |
48 // int ia[1+1000], ja[1+1000]; |
16 // double ar[1+1000], Z, x1, x2, x3; |
49 // double ar[1+1000], Z, x1, x2, x3; |
17 // s1: lp = lpx_create_prob(); |
50 // s1: lp = lpx_create_prob(); |
18 // s2: lpx_set_prob_name(lp, "sample"); |
51 // s2: lpx_set_prob_name(lp, "sample"); |
19 // s3: lpx_set_obj_dir(lp, LPX_MAX); |
52 // s3: lpx_set_obj_dir(lp, LPX_MAX); |
20 lp.max(); |
|
21 // s4: lpx_add_rows(lp, 3); |
53 // s4: lpx_add_rows(lp, 3); |
22 // s5: lpx_set_row_name(lp, 1, "p"); |
54 // s5: lpx_set_row_name(lp, 1, "p"); |
23 // s6: lpx_set_row_bnds(lp, 1, LPX_UP, 0.0, 100.0); |
55 // s6: lpx_set_row_bnds(lp, 1, LPX_UP, 0.0, 100.0); |
24 |
|
25 // Row p = lp.addRow(); |
|
26 |
|
27 // s7: lpx_set_row_name(lp, 2, "q"); |
56 // s7: lpx_set_row_name(lp, 2, "q"); |
28 // s8: lpx_set_row_bnds(lp, 2, LPX_UP, 0.0, 600.0); |
57 // s8: lpx_set_row_bnds(lp, 2, LPX_UP, 0.0, 600.0); |
29 |
|
30 // Row q = lp.addRow(); |
|
31 |
|
32 // s9: lpx_set_row_name(lp, 3, "r"); |
58 // s9: lpx_set_row_name(lp, 3, "r"); |
33 // s10: lpx_set_row_bnds(lp, 3, LPX_UP, 0.0, 300.0); |
59 // s10: lpx_set_row_bnds(lp, 3, LPX_UP, 0.0, 300.0); |
34 |
|
35 // Row r = lp.addRow(); |
|
36 |
|
37 // s11: lpx_add_cols(lp, 3); |
60 // s11: lpx_add_cols(lp, 3); |
38 // s12: lpx_set_col_name(lp, 1, "x1"); |
61 // s12: lpx_set_col_name(lp, 1, "x1"); |
39 // s13: lpx_set_col_bnds(lp, 1, LPX_LO, 0.0, 0.0); |
62 // s13: lpx_set_col_bnds(lp, 1, LPX_LO, 0.0, 0.0); |
40 |
|
41 // Col x1 = lp.addCol(); |
|
42 |
|
43 // s14: lpx_set_obj_coef(lp, 1, 10.0); |
63 // s14: lpx_set_obj_coef(lp, 1, 10.0); |
44 // s15: lpx_set_col_name(lp, 2, "x2"); |
64 // s15: lpx_set_col_name(lp, 2, "x2"); |
45 // s16: lpx_set_col_bnds(lp, 2, LPX_LO, 0.0, 0.0); |
65 // s16: lpx_set_col_bnds(lp, 2, LPX_LO, 0.0, 0.0); |
46 // s17: lpx_set_obj_coef(lp, 2, 6.0); |
66 // s17: lpx_set_obj_coef(lp, 2, 6.0); |
47 // s18: lpx_set_col_name(lp, 3, "x3"); |
67 // s18: lpx_set_col_name(lp, 3, "x3"); |