c39cfcb6af6542d86672d3245a1da16659f0404a
[scilab.git] / scilab / modules / optimization / demos / neldermead / neldermead_boxpost.sce
1 // Scilab ( http://www.scilab.org/ ) - This file is part of Scilab\r
2 // Copyright (C) 2008-2009 - INRIA - Michael Baudin\r
3 // Copyright (C) 2010 - DIGITEO - Michael Baudin\r
4 // Copyright (C) 2010 - DIGITEO - Allan CORNET\r
5 // Copyright (C) 2012 - Scilab Enterprises - Adeline CARNIS\r
6 //\r
7 // This file must be used under the terms of the CeCILL.\r
8 // This source file is licensed as described in the file COPYING, which\r
9 // you should have received as part of this distribution.  The terms\r
10 // are also available at\r
11 // http://www.cecill.info/licences/Licence_CeCILL_V2-en.txt\r
12 \r
13 //\r
14 // nmplot_boxpost.sce --\r
15 //   Show that the Box algorithm is able to reproduce the \r
16 //   numerical experiment presented in Richardson and Kuester's paper.\r
17 //   Rosenbrock's Post Office\r
18 //\r
19 \r
20 function demo_boxpost()\r
21 \r
22     filename = 'neldermead_boxpost.sce';\r
23     dname = get_absolute_file_path(filename);\r
24 \r
25     mprintf(_("Illustrates Box'' algorithm on Rosenbrock''s Post Office Problem.\n"));\r
26     mprintf(_("Defining Rosenbrock Post Office function...\n"));\r
27 \r
28     //\r
29     //  Reference:\r
30     //\r
31     //    Algorithm 454\r
32     //    The complex method for constrained\r
33     //    optimization\r
34     //    Richardson, Kuester\r
35     //    1971\r
36     //\r
37     //    An automatic method for finding the\r
38     //    greatest or least value of a function\r
39     //    Rosenbrock\r
40     //    1960\r
41     //\r
42     //   Richardson and Kuester Results :\r
43     //   F=3456\r
44     //   X1 = 24.01\r
45     //   X2 = 12.00\r
46     //   X3 = 12.00\r
47     //   Iterations : 72\r
48     //\r
49     //\r
50 \r
51     //\r
52     // fpostoffice --\r
53     //   Computes the Post Office cost function and \r
54     //   inequality constraints.\r
55     //\r
56     // Arguments\r
57     //   x: the point where to compute the function\r
58     //   index : the stuff to compute\r
59     //\r
60 \r
61     function [ f , c , index ] = fpostoffice ( x , index )\r
62         f = []\r
63         c = []\r
64         if ( index==2 | index==6 ) then\r
65             f = -x(1) * x(2) * x(3)\r
66         end\r
67 \r
68         if ( index==5 | index==6 ) then\r
69             c1 = x(1) + 2 * x(2) + 2 * x(3)\r
70             c2 = 72 - c1\r
71             c = [c1 c2]\r
72         end\r
73     endfunction\r
74     //\r
75     // Initialize the random number generator, so that the results are always the\r
76     // same.\r
77     //\r
78     rand("seed" , 0)\r
79 \r
80     x0 = [1.0 1.0 1.0].';\r
81     // Compute f(x0) : should be close to -1\r
82     fx0 = fpostoffice ( x0 , 2 );\r
83     mprintf("Computed fx0 = %e (expected = %e)\n",fx0 , -1 );\r
84     [ fx0 , cx0, index ] = fpostoffice ( x0 , 6 );\r
85     mprintf("Computed Constraints(x0) = [%e %e]\n", ..\r
86     cx0(1), cx0(2) );\r
87     mprintf("Expected Constraints(x0) = [%e %e]\n", ..\r
88     5 , 67 );\r
89 \r
90     xopt = [24 12 12].';\r
91     // Compute f(xopt) : should be 3456\r
92     fopt = fpostoffice ( xopt );\r
93     mprintf("Computed fopt = %e (expected = %e)\n", fopt , -3456 );\r
94 \r
95     nm = neldermead_new ();\r
96     nm = neldermead_configure(nm,"-numberofvariables",3);\r
97     nm = neldermead_configure(nm,"-function",fpostoffice);\r
98     nm = neldermead_configure(nm,"-x0",x0);\r
99     nm = neldermead_configure(nm,"-maxiter",300);\r
100     nm = neldermead_configure(nm,"-maxfunevals",300);\r
101     nm = neldermead_configure(nm,"-method","box");\r
102     nm = neldermead_configure(nm,"-verbose",1);\r
103     logfile = TMPDIR + "/postoffice.txt";\r
104     nm = neldermead_configure(nm,"-logfile" , logfile );\r
105     nm = neldermead_configure(nm,"-verbosetermination",1);\r
106     nm = neldermead_configure(nm,"-boundsmin",[0.0 0.0 0.0]);\r
107     nm = neldermead_configure(nm,"-boundsmax",[42.0 42.0 42.0]);\r
108     // Configure like Box\r
109     nm = neldermead_configure(nm,"-simplex0method","randbounds");\r
110     nm = neldermead_configure(nm,"-nbineqconst",2);\r
111     nm = neldermead_configure(nm,"-tolxmethod" , %f );\r
112     nm = neldermead_configure(nm,"-tolsimplexizemethod",%f);\r
113     nm = neldermead_configure(nm,"-boxtermination" , %t );\r
114     nm = neldermead_configure(nm,"-boxtolf" , 0.001 );\r
115     nm = neldermead_configure(nm,"-boxboundsalpha" , 0.0001 );\r
116 \r
117     //\r
118     // Check that the cost function is correctly connected.\r
119     //\r
120     [ nm , result ] = neldermead_function ( nm , x0 );\r
121 \r
122     //\r
123     // Perform optimization\r
124     //\r
125     mprintf(_("Searching (please wait) ...\n"));\r
126     nm = neldermead_search(nm);\r
127     //\r
128     // Print a summary\r
129     //\r
130     exec(fullfile(dname,"neldermead_summary.sci"),-1);\r
131     neldermead_summary(nm)\r
132     mprintf("==========================\n");\r
133     xcomp = neldermead_get(nm,"-xopt");\r
134     mprintf("x expected = [%s]\n",strcat(string(xopt)," "));\r
135     shift = norm(xcomp-xopt)/norm(xopt);\r
136     mprintf("Shift = %f\n",shift);\r
137     fcomp = neldermead_get(nm,"-fopt");\r
138     mprintf("f expected = %f\n",fopt);\r
139     shift = abs(fcomp-fopt)/abs(fopt);\r
140     mprintf("Shift = %f\n",shift);\r
141     nm = neldermead_destroy(nm);\r
142     deletefile ( logfile )\r
143     mprintf(_("End of demo.\n"));\r
144 \r
145     //\r
146     // Load this script into the editor\r
147     //\r
148     m = messagebox(_("View Code?"), "Question", "question", _(["Yes" "No"]), "modal")\r
149     if(m == 1)\r
150         editor ( dname + filename, "readonly" );\r
151     end \r
152 endfunction\r
153 \r
154 demo_boxpost();\r
155 clear demo_boxpost;\r
156 \r
157 \r
158 \r
159 \r
160 \r
161 \r
162 \r
163 \r
164 \r\r