author | hegyi |
Wed, 29 Jun 2005 15:41:33 +0000 | |
changeset 1524 | 587a823bcdd0 |
parent 1493 | 94535d1833b5 |
child 1542 | 0219ee65ffcc |
permissions | -rw-r--r-- |
1 #include<lemon/lp_skeleton.h>
2 #include "test_tools.h"
4 #ifdef HAVE_CONFIG_H
5 #include <config.h>
6 #endif
8 #ifdef HAVE_GLPK
9 #include <lemon/lp_glpk.h>
10 #endif
12 #ifdef HAVE_CPLEX
13 #include <lemon/lp_cplex.h>
14 #endif
16 using namespace lemon;
18 void lpTest(LpSolverBase & lp)
19 {
23 typedef LpSolverBase LP;
25 std::vector<LP::Col> x(10);
26 // for(int i=0;i<10;i++) x.push_back(lp.addCol());
27 lp.addColSet(x);
29 #ifndef GYORSITAS
31 std::vector<LP::Col> y(10);
32 lp.addColSet(y);
34 std::map<int,LP::Col> z;
36 z.insert(std::make_pair(12,INVALID));
37 z.insert(std::make_pair(2,INVALID));
38 z.insert(std::make_pair(7,INVALID));
39 z.insert(std::make_pair(5,INVALID));
41 lp.addColSet(z);
43 {
44 LP::Expr e,f,g;
45 LP::Col p1,p2,p3,p4,p5;
46 LP::Constr c;
48 p1=lp.addCol();
49 p2=lp.addCol();
50 p3=lp.addCol();
51 p4=lp.addCol();
52 p5=lp.addCol();
54 e[p1]=2;
55 e.constComp()=12;
56 e[p1]+=2;
57 e.constComp()+=12;
58 e[p1]-=2;
59 e.constComp()-=12;
61 e=2;
62 e=2.2;
63 e=p1;
64 e=f;
66 e+=2;
67 e+=2.2;
68 e+=p1;
69 e+=f;
71 e-=2;
72 e-=2.2;
73 e-=p1;
74 e-=f;
76 e*=2;
77 e*=2.2;
78 e/=2;
79 e/=2.2;
81 e=((p1+p2)+(p1-p2)+(p1+12)+(12+p1)+(p1-12)+(12-p1)+
82 (f+12)+(12+f)+(p1+f)+(f+p1)+(f+g)+
83 (f-12)+(12-f)+(p1-f)+(f-p1)+(f-g)+
84 2.2*f+f*2.2+f/2.2+
85 2*f+f*2+f/2+
86 2.2*p1+p1*2.2+p1/2.2+
87 2*p1+p1*2+p1/2
88 );
91 c = (e <= f );
92 c = (e <= 2.2);
93 c = (e <= 2 );
94 c = (e <= p1 );
95 c = (2.2<= f );
96 c = (2 <= f );
97 c = (p1 <= f );
98 c = (p1 <= p2 );
99 c = (p1 <= 2.2);
100 c = (p1 <= 2 );
101 c = (2.2<= p2 );
102 c = (2 <= p2 );
104 c = (e >= f );
105 c = (e >= 2.2);
106 c = (e >= 2 );
107 c = (e >= p1 );
108 c = (2.2>= f );
109 c = (2 >= f );
110 c = (p1 >= f );
111 c = (p1 >= p2 );
112 c = (p1 >= 2.2);
113 c = (p1 >= 2 );
114 c = (2.2>= p2 );
115 c = (2 >= p2 );
117 c = (e == f );
118 c = (e == 2.2);
119 c = (e == 2 );
120 c = (e == p1 );
121 c = (2.2== f );
122 c = (2 == f );
123 c = (p1 == f );
124 //c = (p1 == p2 );
125 c = (p1 == 2.2);
126 c = (p1 == 2 );
127 c = (2.2== p2 );
128 c = (2 == p2 );
130 c = (2 <= e <= 3);
131 c = (2 <= p1<= 3);
133 c = (2 >= e >= 3);
134 c = (2 >= p1>= 3);
136 e[x[3]]=2;
137 e[x[3]]=4;
138 e[x[3]]=1;
139 e.constComp()=12;
141 lp.addRow(LP::INF,e,23);
142 lp.addRow(LP::INF,3.0*(x[1]+x[2]/2)-x[3],23);
143 lp.addRow(LP::INF,3.0*(x[1]+x[2]*2-5*x[3]+12-x[4]/3)+2*x[4]-4,23);
145 lp.addRow(x[1]+x[3]<=x[5]-3);
146 lp.addRow(-7<=x[1]+x[3]-12<=3);
147 lp.addRow(x[1]<=x[5]);
148 }
150 {
151 LP::DualExpr e,f,g;
152 LP::Row p1,p2,p3,p4,p5;
154 e[p1]=2;
155 e[p1]+=2;
156 e[p1]-=2;
158 e=p1;
159 e=f;
161 e+=p1;
162 e+=f;
164 e-=p1;
165 e-=f;
167 e*=2;
168 e*=2.2;
169 e/=2;
170 e/=2.2;
172 e=((p1+p2)+(p1-p2)+
173 (p1+f)+(f+p1)+(f+g)+
174 (p1-f)+(f-p1)+(f-g)+
175 2.2*f+f*2.2+f/2.2+
176 2*f+f*2+f/2+
177 2.2*p1+p1*2.2+p1/2.2+
178 2*p1+p1*2+p1/2
179 );
180 }
182 #endif
183 }
185 void aTest(LpSolverBase & lp)
186 {
187 typedef LpSolverBase LP;
189 //The following example is taken from the book by Gáspár and Temesi, page 39.
191 typedef LpSolverBase::Row Row;
192 typedef LpSolverBase::Col Col;
195 Col x1 = lp.addCol();
196 Col x2 = lp.addCol();
199 //Constraints
200 lp.addRow(3*x1+2*x2 >=6);
201 lp.addRow(-1*x1+x2<=4);
202 lp.addRow(5*x1+8*x2<=40);
203 lp.addRow(x1-2*x2<=4);
204 //Nonnegativity of the variables
205 lp.colLowerBound(x1, 0);
206 lp.colLowerBound(x2, 0);
207 //Objective function
208 lp.setObj(2*x1+x2);
210 lp.max();
211 lp.solve();
213 double opt=122.0/9.0;
215 if (lp.primalStatus()==LpSolverBase::OPTIMAL){
216 std::cout<< "Z = "<<lp.primalValue()
217 << " (error = " << lp.primalValue()-opt
218 << "); x1 = "<<lp.primal(x1)
219 << "; x2 = "<<lp.primal(x2)
220 <<std::endl;
222 }
223 else{
224 std::cout<<"Optimal solution not found!"<<std::endl;
225 }
227 check(lp.primalStatus()==LpSolverBase::OPTIMAL,"Primalstatus should be OPTIMAL");
229 check(std::abs(lp.primalValue()-opt)<1e-3,
230 "Wrong optimal value: the right optimum is 122/9 (13.555555...)");
233 }
236 int main()
237 {
238 LpSkeleton lp_skel;
239 lpTest(lp_skel);
241 #ifdef HAVE_GLPK
242 LpGlpk lp_glpk1,lp_glpk2;
243 lpTest(lp_glpk1);
244 aTest(lp_glpk2);
245 #endif
247 #ifdef HAVE_CPLEX
248 LpCplex lp_cplex;
249 lpTest(lp_cplex);
250 aTest(lp_cplex);
251 #endif
253 return 0;
254 }