chiark / gitweb /
octave4.4
[nlopt.git] / stogo / prog.cc
1 /*
2         A simple program to test the global optimizer.
3 */
4
5 #include "global.h"
6 #include "tools.h"
7 #include "testfun.h"
8
9 #define STRLEN_MAX 80
10
11 int main() {
12   bool AVfail, AVflag;
13   int testfnc, dim, axis, i;
14   double AVbest;
15   Pdom  Dom;
16   Pgrad Grad;
17   Pobj  Obj;
18
19   cout << "Global Optimizer v0.1" << endl;
20   cout << "1.  Rosenbrock (min=0)" << endl;
21   cout << "2.  McCormick (min=-1.91)" << endl;
22   cout << "3.  Box & Betts (min=0)" << endl;
23   cout << "4.  Paviani (min=-45.7)" << endl;
24   cout << "5.  Extended Beale (min=0)" << endl;
25   cout << "6.  Three-hump Camel (min=0)" << endl;
26   cout << "7.  Jacobsen & Pedersen (min=3)" << endl;
27   cout << "8.  Poly1 (min=0)" << endl;
28   cout << "9.  Six-hump Camel (min=-1.03) " << endl;
29   cout << "10. One-dimensional (min=-23.58)" << endl;
30   cout << "11. Kowalik (min=0.0003075)" << endl;
31   cout << "12. Hansen (min=-176.54)" << endl;
32   cout << "13. Shubert (min=-24.06)" << endl;
33   cout << "14. Griewank (min=0)" << endl;
34   cout << "15. Levy4 (min=-21.502)" << endl;
35   cout << "16. Levy5 (min=-11.504)" << endl;
36   cout << "17. Levy6 (min=-11.504)" << endl;
37   cout << "18. Levy7 (min=-11.504)" << endl;
38   cout << "19. Rastrigin (min=0)" << endl;
39   cout << "20. Trid" << endl;
40   cout << "21. Perm(4,50)" << endl;
41   cout << "22. Perm(4,0.5)" << endl;
42   cout << "23. Powersum(8,18,44,114)" << endl;
43   cout << "24. Schwefel (min=-12569.5)" << endl;
44   cout << "25. Shekel (-10.0)" << endl;
45   cout << endl << "Select test function :";
46   cin >> testfnc;
47
48   switch (testfnc) {
49   case 10:
50     dim=1;
51     Dom=Domain_OneDim;
52     Obj=Objective_OneDim;
53     Grad=Gradient_OneDim;
54     break;
55   case 1:
56     dim=2;
57     Dom=Domain_Rosenbrock;
58     Obj=Objective_Rosenbrock;
59     Grad=Gradient_Rosenbrock;
60     break;
61   case 8:
62     dim=2;
63     Dom=Domain_Poly1;
64     Obj=Objective_Poly1;
65     Grad=Gradient_Poly1;
66     break;
67   case 7:
68     dim=2;
69     Dom=Domain_Jacobsen;
70     Obj=Objective_Jacobsen;
71     Grad=Gradient_Jacobsen;
72     break;
73   case 6:
74     dim=2;
75     Dom=Domain_Camel3;
76     Obj=Objective_Camel3;
77     Grad=Gradient_Camel3;
78     break;
79   case 5:
80     dim=2;
81     Dom=Domain_Beale3;
82     Obj=Objective_Beale3;
83     Grad=Gradient_Beale3;
84     break;
85   case 4:
86     dim=10;
87     Dom=Domain_Paviani;
88     Obj=Objective_Paviani;
89     Grad=Gradient_Paviani;
90     break;
91   case 12:
92     dim=2;
93     Dom=Domain_Hansen;
94     Obj=Objective_Hansen;
95     Grad=Gradient_Hansen;
96     break;
97   case 13:
98     dim=2;
99     Dom=Domain_Shubert;
100     Obj=Objective_Shubert;
101     Grad=Gradient_Shubert;
102     break;
103   case 11:
104     dim=4;
105     Dom=Domain_Kowalik;
106     Obj=Objective_Kowalik;
107     Grad=Gradient_Kowalik;
108     break;
109   case 9:
110     dim=2;
111     Dom=Domain_Camel6;
112     Obj=Objective_Camel6;
113     Grad=Gradient_Camel6;
114     break;
115   case 2:
116     dim=2;
117     Dom=Domain_McCormick;
118     Obj=Objective_McCormick;
119     Grad=Gradient_McCormick;
120     break;
121   case 3:
122     dim=3;
123     Dom=Domain_BoxBetts; 
124     Obj=Objective_BoxBetts;
125     Grad=Gradient_BoxBetts; 
126     break;
127   case 14:
128     dim=10;
129     Dom=Domain_Griewank;
130     Obj=Objective_Griewank;
131     Grad=Gradient_Griewank;
132     break;
133   case 15:
134     dim=4;
135     Dom=Domain_Levy;
136     Obj=Objective_Levy;
137     Grad=Gradient_Levy;  
138     break;
139   case 16:
140     dim=5;
141     Dom=Domain_Levy; 
142     Obj=Objective_Levy; 
143     Grad=Gradient_Levy; 
144     break;
145  case 17:
146     dim=6;
147     Dom=Domain_Levy;
148     Obj=Objective_Levy;
149     Grad=Gradient_Levy;
150     break;
151  case 18:
152     dim=7;
153     Dom=Domain_Levy;
154     Obj=Objective_Levy;
155     Grad=Gradient_Levy;
156     break;
157   case 19:
158     cout << "Enter problem dimension ";
159     int rast_dim;   
160     cin >> rast_dim;
161     dim=rast_dim;
162     Dom=Domain_Rastrigin;   
163     Obj=Objective_Rastrigin;
164     Grad=Gradient_Rastrigin;
165     break;
166   case 20:
167     cout << "Enter problem dimension (two or larger) ";
168     int trid_dim;
169     cin >> trid_dim;
170     dim=trid_dim; 
171     Dom=Domain_Trid;
172     Obj=Objective_Trid;
173     Grad=Gradient_Trid;
174     break;
175   case 21:
176     dim=4;
177     Dom=Domain_Perm;
178     Obj=Objective_Perm_4_50;
179     Grad=Gradient_Perm_4_50;
180     break;
181  case 22:
182     dim=4;
183     Dom=Domain_Perm;
184     Obj=Objective_Perm_4_05;
185     Grad=Gradient_Perm_4_05;
186     break;
187  case 23:  
188     dim=4;
189     Dom=Domain_Powersum;
190     Obj=Objective_Powersum;
191     Grad=Gradient_Powersum;
192     break;
193  case 24:
194     cout << "Enter problem dimension ";
195     int schwef_dim;
196     cin >> schwef_dim;
197     dim=schwef_dim;
198     Dom=Domain_Schwefel;
199     Obj=Objective_Schwefel;
200     Grad=Gradient_Schwefel;
201     break;
202   case 25:
203     dim=4;
204     Dom=Domain_Shekel;
205     Obj=Objective_Shekel;
206     Grad=Gradient_Shekel;
207     break;
208   default:
209     cout << "Error : Function not defined" << endl;
210     exit(1);
211   }
212
213   cout << "Dimension=" <<dim << endl;
214   TBox D(dim);
215   Dom(D);
216   cout << "Domain=";
217   for (i=0; i<dim; i++)
218     cout << "[" << D.lb(i) << "," << D.ub(i) << "]";
219   cout << endl << endl;
220
221   GlobalParams params;
222   cout << "Enter time limit (seconds) ";
223   cin >> params.maxtime;
224   if (params.maxtime<1) {   
225     cout << "Warning: time limit set to 1 second\n";
226   }
227   params.maxeval = 0;
228   cout << "Use factory settings (y/n) ";
229   char str[STRLEN_MAX]; cin >> str;
230   if (str[0]=='y') {
231     params.det_pnts=2*dim+1; params.rnd_pnts=0;
232     params.eps_cl=0.1; params.rshift=0.3;
233     params.mu=1.0E-4; AVflag=FALSE;
234   }
235   else {
236     cout << "Number of deterministic points ";
237     cin >> params.det_pnts;
238     cout << "Numer of stochastic points ";
239     cin >> params.rnd_pnts;
240     cout << "Radius of attraction ";
241     cin >> params.eps_cl;
242     cout << "Parameter rshift ";
243     cin >> params.rshift;
244     cout << "Parameter mu ";
245     cin >> params.mu;
246     cout << "Use the AV initialization (y/n) ";
247     cin >> str;
248     if (str[0]=='y') AVflag=TRUE; else AVflag=FALSE;
249   }
250
251   Global Problem(D,Obj, Grad, params);
252   RVector x_av(dim);
253   if (AVflag==TRUE) {
254     cout << "Enter time limit for each coordinate direction (seconds) ";
255     cin >> params.maxtime;
256     if (params.maxtime<1) {
257       cout << "Warning: time limit set to 1 second\n";
258     }
259     params.maxeval = 0;
260     params.det_pnts=3;
261     TBox I(1);
262     Global AV(I, Obj, Grad, params);
263
264     x_av=0.0; AVfail=FALSE;
265     for (axis=0; axis<Problem.dim; axis++) {
266       cout << "### axis=" << axis << " ###" << endl;
267       I.lb=(D.lb)(axis); I.ub=(D.ub)(axis);
268       AV.SetDomain(I);
269       AV.ClearSolSet();
270       AV.Search(axis, x_av);
271
272       if (AV.NoMinimizers()) {
273         cout << "AV failed with axis=" << axis << endl;
274         AVfail=TRUE; break;
275       }
276     }
277
278     if (AVfail==FALSE) {
279       AVbest=AV.GetMinValue();
280       cout << "### AV Located x=" << x_av << " fbound=" << AVbest << endl;
281       RVector AVx(Problem.dim);
282       AVx=x_av;
283
284       // Use result from AV for new fbound
285       Problem.SetMinValue(AVbest);
286
287       // Add the best point found to the initial box (domain)
288       Problem.AddPoint(x_av, AVbest);      
289     }
290   }
291
292   // Perform the main search
293   cout << "### Starting main search ###" << endl;
294   Problem.Search(-1, x_av);
295
296   cout << "Optimization terminated. Current set of minimizers is" << endl;
297   if (Problem.NoMinimizers() && AVflag==FALSE)
298     cout << "### No improvement found ###" << endl;
299   else
300     Problem.DispMinimizers();
301 }